質問
PAEが無効になっているx86システムのPTEに対応する構造/ユニオンのLinuxソースコードを調べようとしました。これまでのところ、arch / x86 / include / asm / page_32.hで次のものだけを見つけました
typedef union {
pteval_t pte;
pteval_t pte_low;
} pte_t;
Intel Reference Manual Vol 3Aを目の前で開いているので、混乱しています。マニュアルで説明されているように、PTEにある10個の奇数フィールドに対応するものはありません。
これはささいな質問かもしれませんが、私にとっては、Linuxカーネルのメモリ管理を理解するプロセスにおいて、つまずきのブロックのようになりました。
編集:2.6.29ソースを持っています
解決
pteval_tは、ページテーブルエントリを不透明なblobとして扱います-ご覧のアーキテクチャでは、32ビットの符号なしの値です。
ビット単位の演算子とマスクを使用してPTE内のフィールドにアクセスします-便利なソース(Linux 2.6.24)では、これらは include / asm-x86 / pgtable_32.h
で定義されています。 Intelリファレンスマニュアルに表示されるフィールド(そのほとんどはシングルビットフラグです)は、ここで定義されています-例:
#define _PAGE_PRESENT 0x001
#define _PAGE_RW 0x002
#define _PAGE_USER 0x004
#define _PAGE_PWT 0x008
#define _PAGE_PCD 0x010
#define _PAGE_ACCESSED 0x020
#define _PAGE_DIRTY 0x040
#define _PAGE_PSE 0x080 /* 4 MB (or 2MB) page, Pentium+, if present.. */
#define _PAGE_GLOBAL 0x100 /* Global TLB entry PPro+ */
#define _PAGE_UNUSED1 0x200 /* available for programmer */
#define _PAGE_UNUSED2 0x400
#define _PAGE_UNUSED3 0x800
他のヒント
O'REILLYから Linuxカーネルについてを購入することと、 Linuxデバイスドライバー。そして、 LWN.net に登録します。ただし、サブスクリプションがなくてもカーネルインデックスページからかなり良いスタートを切ることができます。
メモリ管理については、「メモリ管理」のインデックスページをご覧ください。セクション...および「大容量メモリシステム」セクション。後者には、コードのこの領域を理解するのに役立つはずの4レベルのページテーブルへの移行に関する記事がいくつかあります。