私はGormanの仮想メモリ管理の本に従っています。カーネルページテーブルの初期化方法は?
ブートストラップとファイナライズの2つの段階に分かれているといわれるカーネルテーブルページの初期化についてのセクションがあります。
ここで、ブートストラップ段階について説明します。
アセンブラ関数startup_32()は、 arch/i386/kernel/head.Sのページングユニットを有効にします。 vmlinuzのすべての通常のカーネルコードは、ベースアドレスがPAGE_OFFSET + 1MiBの でコンパイルされていますが、実際には最初のメガバイト(0x00100000)のメモリには からロードされます。最初のメガバイトは、一部のデバイスでBIOSとの通信用に で使用され、スキップされます。 このファイルのブートストラップ は、ページングユニットが有効になるまで、 の任意のアドレスから__PAGE_OFFSETを減算することによって、1MiBをベースアドレスとして扱います。したがって、ページング単位が になる前に、8MiBの 物理メモリを仮想アドレスPAGE_OFFSETに変換するページテーブルマッピングを確立する必要があります。
はなぜ__PAGE_OFFESTを引くしたいですか?どのような目的のために?
なぜページングユニットが有効になる前に減算する必要があるのですか?カーネル仮想アドレスを物理メモリアドレスにマッピングするために常に減算を使用していますか?
なぜ8MBですか?
おかげで、
ありがとうアレックス、本当に役立ちます – sliter