kernel
軽くnsproxyと初期化周りのめもを。 Linuxでは名前空間の管理にはnsproxy構造体が使われていて定義はinclude/linux/nsproxy.hにある。 中身はこのような形で5つの名前空間が管理されている。 29 struct nsproxy { 30 atomic_t count; 31 struct uts_namespac…
Linuxカーネルのprintk()はformat stringが色々と拡張されていて(Documentation/printk-formats.txt)、例えば、IPv4/IPv6の表示用、UUID/GUIDの表示用などがあります。その中でsymbol関連のformat stringもいくつか合って、%pSの場合はこんなふうに呼び出…
前回はPGD周りをみたので今回はPUD周りを。PUDを作るのはpuc_alloc()でこれはいくつかの呼び出しパターンがあるのだけど(lxrでIdentifier Searchした結果からして)、一番基本であろうページフォルトの時で調べる。 ページフォルト発生時は__handle_mm_faul…
Linux(x86_64)のpagingをちゃんと理解したいな〜ということで。見ているのはLinuxカーネル3.15。 まずはx86_64アーキテクチャのページングの仕組みとLinuxでの対応(どんな型で表すのか)を調べる。 | name | bits | c type | |----------- ----|-------|-…
ふと見て面白そうだなと思った[RFC/PATCH RESEND -next 00/21] Address sanitizer for kernel (kasan) - dynamic memory error detector.、略してKASANがどんなものなのかを見てみる。どうしてもJ( 'ー`)しが思い浮かぶんだけどそこはスルー。 基本、見るのは…
先週のLWNの記事3.16 merge window, part 2を見てて、「お、これは便利じゃね?」って思ったdecode_stacktrace.shを試してみました。 これはカーネルのスタックトレースにあるオブジェクトのシンボルからソースファイル名・行番号を出してくれるという優れも…
なんとなく昨日のLinux:sparse fileのファイルサイズと実際に使っている領域の大きさはどう調べるのか。続きで見てみます。 見ているカーネルは3.15です。 まずはarch/x86/syscalls/syscall_64.tblでシステムコールの定義を見てみるとstat()はsys_newstat()…
カーネルのバグでspin lock取っているコンテキストでsleepする可能性のある関数を使うと「BUG: sleeping function called from invalid context at mm/slub.c:965」なんて感じでエラーがでますけど、kmalloc()はGFP_XXXなflagsをどのように使っているのかな…
Unix V6のpipe()と比べてLinuxのpipe()どう実装しているんですかねーなんて話を最近したのでちょっと見比べてみた。 V6のpipeははじめてのOSコードリーディング 読書会 (15)でやったところなんだけど、俺は風邪ひいて家で引きこもってたので・・・ V6のpipe…
Linuxカーネルに興味があるんだけど特に作りたいものってないんだよなーなんて割とあると思う訳です。俺とか。。。 まあ、kernelnewbiesのメーリングリストでもよく見る話題かと思います。この辺なんかもそうですね。 で、そんな時にオススメできるのがkmeml…
Red HatがLinuxカーネルにライブパッチするツールとしてkpatchを公開したのでそれはどうやってhot patchを作るのかを調べてみる。 kpatchのソースコードはgithubに置かれている。 kpatchはパッチの作成を行うモジュール群、パッチを当てるモジュール、両者を…
paging_init()の続きで残りの2行を。。 node_clear_state()は特に見るほどではないのでzone_sizes_init()を見る。 650 void __init paging_init(void) 651 { 652 sparse_memory_present_with_active_regions(MAX_NUMNODES); 653 sparse_init(); 654 655 /* 6…
paging_init()の2行目、sparse_init()のところを読む。 sparse_init()の関数にあるコメントを見るとやろうとしていることはなんとなくわかる。 ここで言っているaccumulated non-linear sectionsというのは前回までの記事で見てきた部分で、e820のメモリマッ…
paging_init()の2行目で実行するsparse_init()を見る前にここで使っている関数を先に軽く見ておく。 alloc_usemap_and_memmap()はこのようなI/Fの関数。 引数の最後のdataはalloc_func()の一番目の引数として使う。 469 static void __init alloc_usemap_and…
今日はx86_64のpaging_init()から呼ばれるsparse_memory_present_with_active_regions()とそこで使われるmemory_present()のあたりを読む。 ディレクトリ的にはarch/x86/以下ではなくてmm/になる。 まずはsparse_memory_present_with_active_regions()を。 …
x86_64のページングを設定している部分を読もうと思って読み始めて前回の続きになるsparse_memory_present_with_active_regions()を読もうと思ったんだけど、この関数で使う変数(struct memblockのメンバ変数のmemory(型はstruct memblock_type))を調べた…
Linuxカーネルの解説本は何種類か出版されているけど大概はx86_32が対象なんですよね。ということでx86_32を基本として大まかな内容は解説本を参考にしつつ、実際のx86_64の処理はコードを読む必要があるのです。。。 ということでx86_64の場合のページング…
2013年12月中頃のLWNの記事で Known-exploit detection for the kernel というのがちょっと気になったので試してみた。 今の時点(2014/01/21)だとlinux-nextのtreeにも入っていないので今後どうなるかはわかりませんが。。。 記事の時点で投稿されたパッチ…
前回のパッチとは別でフレームバッファのドライバでのメモリーリークを修正するパッチを投げたのでデバッグのメモkmemleakのレポートはこのようなもの。 unreferenced object 0xffff880036ca84c0 (size 16): comm "swapper/0", pid 1, jiffies 4294877407 (a…
LinuxカーネルにあるBUILD_BUG_ONマクロ。名前からやりたいことは十分に分かるんだけど、これはどういう仕組みなのかというところ。使っている例としてarch/x86/kernel/head64.cにあるx86_64_start_kernel()を見てみるとこんな感じ。 140 asmlinkage void __…
どんなことをやったかをメモしておこう。 といっても今回のは比較的簡単に調べられたけど。パッチを作ったカーネルは3.13-rc4です。2013/12/20 追記: (´-`).。oO(Reviewed-byしてもらったのでそのうちメインラインにも入るだろう kmemleakさんから以下のよ…
Linuxブート時のcpu数認識の最後の部分のこれ。 [ 0.000000] smpboot: Allowing 8 CPUs, 0 hotplug CPUsこのメッセージはarch/x86/kernel/smpboot.cにあるprefill_possible_map()が出している。 1252 pr_info("Allowing %d CPUs, %d hotplug CPUs\n", 1253 p…
前回の続きとしてgeneric_processor_info()を読む。まずはgeneric_processor_info()が呼ばれる流れを。これはacpi_register_lapic()から呼ばれていて、acpi_register_lapic()は以下の関数などから呼ばれる。 acpi_parse_x2apic() acpi_parse_lapic() acpi_pa…
前回の続きとしてacpi_parse_madt_lapic_entries()内で acpi_table_parse_madt()の2番目の引数で渡している関数を見ていこう。 見るのはうちの環境に関係ありそうなところでこの辺を。 acpi_parse_x2apic() acpi_parse_lapic() acpi_parse_x2apic_nmi() acpi…
今日はacpi_parse_madt_lapic_entries()を見ていこう。と言ってもコードよりもACPIの仕様書読むほうがメインかも。。 901 static int __init acpi_parse_madt_lapic_entries(void) 902 { 903 int count; 904 int x2count = 0; 905 906 if (!cpu_has_apic) 90…
昨日の「LinuxカーネルのSMPまわりの処理を調べてみる」の続きでUsing ACPI (MADT) for SMP configuration informationを出している箇所を見てみる。メッセージを検索してみるとarch/x86/kernel/acpi/boot.cにあるacpi_process_madt()がヒット! どこでメッ…
うちではデスクトップとして使っているPCにIntel® Core™ i7-3770S Processorを使っていて、コア数が4、8スレッドということで/proc/cpuinfoでは8個のcpuがLinuxによって認識されています。では、これがどのような手順で認識されていったのか?というのをちょ…
Linuxカーネルでinet_add_protocol()という関数を使うとオレオレプロトコルを簡単に追加できるので遊んでみました。 以下が作ったカーネルモジュールです。 #include <linux/module.h> #include <linux/kernel.h> #include <linux/kmod.h> #include <net/protocol.h> MODULE_DESCRIPTION("simple Eject protocol"); MODULE_A</net/protocol.h></linux/kmod.h></linux/kernel.h></linux/module.h>…
カーネル/VM Advent Calendar 2013 3日目の記事「カーネル/VM Advent Calendar 2013 3日目:LinuxカーネルのlockrefというLock機能を試してみよう」をQiitaに書きました。 内容はタイトルそのままですw 3.12から入ったlockrefというロック機能を試してます。…
今回はcpu_init()から。cpu_init()はこのような関数。他の関数を読んでいくだけで、この関数自体は特別なことはしてないですね。 static void cpu_init(struct per_cpu *cpu_data) { int err; printk(" CPU %d... ", cpu_data->cpu_id); err = register_linu…