ページング
ええとマニュアル下巻の 3.6 節に記述がありました。でもやっぱり中身がよく分からない。ので、コメントをなんとか読もうとしてみます。
この手続きは cr0 の page bit を設定することでページングのセトアプを行ないます。
ページテーブルは先頭 8MB に identity-mapping する形でセトアプされます。
ページャは不正なアドレスは生成されない事を仮定して動作します。注! 全ての物理メモリがこの手続きでマップされる必要がありますが、カーネルのページ関数が直接使うのは 1MB 未満のアドレス限定となります。
通常の _ノーマルな_ 手続きは 1MB より小さなメモリとか (mm が管理している) 他の場所にマップされたローカルなスペースを使用する。8MB 以上のメモリを云々したいのであれば自分でヤれとか何とか書いてある模様。。
微妙ですが、あまり参考にはならんな。
Linux Kernel Commentary
以下から保存。
む、+7 のソレが分かりました。ケツの 3bits は
- 0 : present
- 1 : read/write
- 2 : user/supervisor
というナニを表現しているという事で 7 だと上記フラグが on って事で
set present bit/user r/w
という事になるのか。intel のマニュアルだと図 3-14 か。という事で
movl $pg0+7,pg_dir /* set present bit/user r/w */ movl $pg1+7,pg_dir+4 /* --------- " " --------- */
の部分の謎は解けた。上記は Page Table Entry というソレの初期設定をしてるのか。
次
コードは直前エントリで引用してるんで略。箇条書きでヤる事列挙してみます。
- %edi に 0x2000 に 4092 を加えた値を代入
- pg2 のちょっと手前かな
- %eax に 0x7ff007 を代入
- おかしいな 4M - 4K + 7 じゃないのかなぁ
- %eax の値を %edi に代入
- %edi をデクリメントしつつ
- %eax は 4096 マイナスしつつ
- %eax が正の値である間繰り返す
という事は pg1 な領域にポインタ配列を作成している、という理解で良いのか。
とりあえず
ひら方面への反映も可能かなぁ。ちょっと精度低い気がしてますが。