日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

2 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 五 )


X86_LINEAR_4K linear4K; // linear address (4-KB page)
};
}
X86_LINEAR, *PX86_LINEAR, **PPX86_LINEAR;
#define X86_LINEAR_ sizeof (X86_LINEAR)
列表 4-4. i386 的線性地址
宏和常量
列表 4-5 給出的定義是對(duì) 列表 4-2 到 列表 4-4 所示結(jié)構(gòu)的補(bǔ)充,讓我們可以更容易的和 i386 內(nèi)存管理一起工作 。列表 4-5 的定義可以分為三大組 。第一組用于控制線性地址:
1. X86_PAGE_MASK 、 X86_PDI_MASK 和 X86_PTI_MASK 都是位掩碼( bit mask ),用來選擇線性地址中的某一部分 。它們都基于常量: PAGE_SHIFT (12) 、 PDI-SHIFT (22) 和 PTI-SHIFT (12),這些常量定義于 Windows 2000 DDK 的頭文件 ntddk.h 中 。X86_PAGE_MASK 等價(jià)于 0xFFFFF000,可有效的屏蔽 4KB 線性地址( X86_LINEAR_4K )中的偏移量部分 。X86_PDI_MASK 等價(jià)于 0xFFC00000,顯然這可從線性地址中提取高 10 位的 PDI。X86_PTI_MASK 等價(jià)于 0x003FF0000,用于屏蔽線性地址中除 PTI 外的所有位 。
2. X86_PAGE() 、 X86_PDI() 和 X86_PTI() 使用上面的常量來計(jì)算給定線性地址的頁索引、 PDI 和 PTI。X86_PAGE() 一般用來從 Windows 2000 的 PTE 數(shù)組(該數(shù)組首地址為: 0xC0000000 )中讀取一個(gè) PTE。X86_PDI() 和 X86_PTI() 只是針對(duì)給定的指針,簡(jiǎn)單的使用 X86_PDI_MASK 或 X86_PTI_MASK,并將得到的索引移動(dòng)到最右邊 。
3. X86_OFFSET_4M() 和 X86_OFFSET_4K() 分別從 4MB 或 4KB 線性地址中提取偏移量部分 。
4. X86_PAGE_4M 和 X86_PAGE_4K 根據(jù) DDK 中的常量 PDI_SHIFT 和 PTI_SHIFT 來計(jì)算 4MB 和 4KB 頁的大小 。X86_PAGE_4M=4,194,304,X86_PAGE_4K=4,096。注意,X86_PAGE_4K 等價(jià)于 DDK 常量 PAGE_SIZE,該常量也定義于 ntddk.h 中 。
5. X86_PAGES_4M 和 X86_PAGES_4K 分別表示 4GB 地址空間中可容納的 4MB 或 4KB 頁的總數(shù) 。X86_PAGES_4M 等價(jià)于 1,024,X86_PAGES_4K 等價(jià)于 1,048,576。
#define X86_PAGE_MASK (0 - (1 << PAGE_SHIFT))
#define X86_PAGE(_p) (((DWORD) (_p) & X86_PAGE_MASK) >> PAGE_SHIFT)
#define X86_PDI_MASK (0 - (1 << PDI_SHIFT))
#define X86_PDI(_p) (((DWORD) (_p) & X86_PDI_MASK) >> PDI_SHIFT)
#define X86_PTI_MASK ((0 - (1 << PTI_SHIFT)) & ~X86_PDI_MASK)
#define X86_PTI(_p) (((DWORD) (_p) & X86_PTI_MASK) >> PTI_SHIFT)
#define X86_OFFSET(_p,_m) ((DWORD_PTR) (_p) & ~(_m))
#define X86_OFFSET_4M(_p) X86_OFFSET (_p, X86_PDI_MASK)
#define X86_OFFSET_4K(_p) X86_OFFSET (_p, X86_PDI_MASK|X86_PTI_MASK)
#define X86_PAGE_4M (1 << PDI_SHIFT)
#define X86_PAGE_4K (1 << PTI_SHIFT)
#define X86_PAGES_4M (1 << (32 - PDI_SHIFT))
#define X86_PAGES_4K (1 << (32 - PTI_SHIFT))
// -----------------------------------------------------------------
#define X86_PAGES 0xC0000000
#define X86_PTE_ARRAY ((PX86_PE) X86_PAGES)
#define X86_PDE_ARRAY (X86_PTE_ARRAY(X86_PAGES >> PTI_SHIFT))
// -----------------------------------------------------------------
#define X86_SEGMENT_OTHER 0
#define X86_SEGMENT_CS 1
#define X86_SEGMENT_DS 2
#define X86_SEGMENT_ES 3
#define X86_SEGMENT_FS 4
#define X86_SEGMENT_GS 5
#define X86_SEGMENT_SS 6
#define X86_SEGMENT_TSS 7
// -----------------------------------------------------------------
#define X86_SELECTOR_RPL 0x0003
#define X86_SELECTOR_TI 0x0004
#define X86_SELECTOR_INDEX 0xFFF8
#define X86_SELECTOR_SHIFT 3
#define X86_SELECTOR_LIMIT (X86_SELECTOR_INDEX >>
X86_SELECTOR_SHIFT)
// -----------------------------------------------------------------
#define X86_DESCRIPTOR_SYS_TSS16A 0x1
#define X86_DESCRIPTOR_SYS_LDT 0x2
#define X86_DESCRIPTOR_SYS_TSS16B 0x3
#define X86_DESCRIPTOR_SYS_CALL16 0x4
#define X86_DESCRIPTOR_SYS_TASK 0x5
#define X86_DESCRIPTOR_SYS_INT16 0x6
#define X86_DESCRIPTOR_SYS_TRAP16 0x7
#define X86_DESCRIPTOR_SYS_TSS32A 0x9
#define X86_DESCRIPTOR_SYS_TSS32B 0xB

推薦閱讀