x86_64
最近のgccはインラインアセンブラ内からcのgotoラベルに飛べる仕組みがあるのでそれのメモです。 ドキュメントはUsing the GNU Compiler Collection (GCC): Extended AsmとUsing the GNU Compiler Collection (GCC): Extended Asmです。たしかLKMLに送られて…
前回は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 | |----------- ----|-------|-…
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の場合のページング…
x86_64をちゃんと覚えようということで資料はIntel®のSDM(使ったのはIntel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual Volume 3 (3A, 3B & 3C):System Programming Guide)とLinuxのカーネルを見つつ。見ているカーネルのバージョンはv3.9.1…