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

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

第四章 探索 Windows 2000 的內(nèi)存管理機(jī)制
翻譯: Kendiv( fcczj@263.net)
更新: Sunday, February 14, 2005


聲明:轉(zhuǎn)載請(qǐng)注明出處,并保證文章的完整性,本人保留譯文的所有權(quán)利 。



數(shù)據(jù)結(jié)構(gòu)
本章隨后的示例代碼的某些部分將涉及底層的內(nèi)存管理機(jī)制,在前面我們已快速瀏覽了該機(jī)制內(nèi)部的大致輪廓 。為了方便,我用 C 語言定義了幾個(gè)數(shù)據(jù)結(jié)構(gòu) 。這是因?yàn)?i386 CPU 內(nèi)部的很多數(shù)據(jù)項(xiàng)需要使用一個(gè)二進(jìn)制位或一組二進(jìn)制位,而 C 的位域( bit-fIElds )唾手可得 。位域可以很有效的訪問一個(gè)大的數(shù)據(jù)中的一個(gè)位或從中提取一組連續(xù)的位 。微軟的 Visual C/C可以產(chǎn)生非常棒的代碼來完成位域的操作 。列表 4-2 是一系列 CPU 數(shù)據(jù)類型定義的一部分,該列表包含如下的內(nèi)容:
l X86_REGISTER 這是一個(gè)基本的無符號(hào) 32 位整數(shù)類型,該類型可描述多個(gè) CPU 寄存器 。這包括:通用的、索引、指針、控制、調(diào)試和測(cè)試寄存器 。
l X86_SELECTOR 代表一個(gè) 16 位的段選擇器,如 CS 、 DS 、 ES 、 FS 、 GS 和 SS。在 圖 4-1 和 圖 4-2 中,選擇器可描述 48 位邏輯地址的高 8 位,或作為描述符表的索引 。為了計(jì)算的方便,16 位選擇器的值被擴(kuò)展到 32 位,不過高 16 位被標(biāo)識(shí)為“保留” 。注意,X86_SELECTOR 結(jié)構(gòu)實(shí)際是兩個(gè)結(jié)構(gòu)的聯(lián)合( union ) 。第一個(gè)指定了選擇器的值,該值占用一個(gè) 16 位的 Word,其名字為 wValue,第二個(gè)采用了位域 。RPL 域指定了請(qǐng)求的特權(quán)級(jí),在 Windows 2000 上其值或者為 0 (內(nèi)核模式)或者為 3 (用戶模式) 。TI 位用來選擇 GDT 或 LDT。
l X86_DESCRIPTOR 定義了由選擇器指向的頁表項(xiàng)的格式 。這是一個(gè) 64 位的數(shù)值,由于歷史演化,該結(jié)構(gòu)比較讓人費(fèi)解 。線性基地址定義了與其相關(guān)的段的起始位置,它們分散在三個(gè)位域中: Base1 、 Base2 和 Base3,Base1 是作用最小的部分 。段的界限指定了段的大小,The segment limit specifying the segment size minus one is divided into the pair Limitl and Limit2, with the former representing the least significant half. 剩余的位域存放不同的段屬性( cf. Intel 1999c, pp.3-11 ) 。例如,G 位域定義了段的粒度 。如果為零,段的限制按字節(jié)指定;否則,限制值為 4KB 的倍數(shù) 。像 X86_SELECTOR 一樣,X86_DESCRIPTOR 結(jié)構(gòu)由一個(gè) union 組成,以允許按不同的方式解釋它的值 。如果你必須復(fù)制描述符(在忽略其內(nèi)部情況下)那么 dValueLow 和 dValueHigh 成員將會(huì)很有幫助 。
l X86_GATE 該結(jié)構(gòu)看起來有些像 X86_DESCRIPTOR。事實(shí)上,這兩個(gè)結(jié)構(gòu)是相關(guān)的: X86_DESCRIPTRO 是一個(gè) GDT 項(xiàng),并描述了一個(gè)段的內(nèi)存屬性,X86_GATE 代表中斷描述符表( IDT )中的一項(xiàng),并描述了中斷例程的內(nèi)存屬性 。IDT 可以包含任務(wù)、中斷和陷阱門(不! Bill Gates 并沒有存儲(chǔ)在 IDT 中! 哈哈) 。X86_GATE 結(jié)構(gòu)可匹配上述三種類型,并通過 Type 位域來進(jìn)行區(qū)分 。Type 5 表示這是一個(gè)任務(wù)門; Type 6 和 14 為中斷門; Type 7 和 15 為陷阱門 。Type 中最重要的位是用來描述門的位數(shù)的位:該位若為 0 則表示是 16 位門;其余情況表示 32 位門 。
l X86_TABLE 是一個(gè)巧妙的結(jié)構(gòu),該結(jié)構(gòu)用來讀取 GDTR 或 IDTR 的當(dāng)前值,分別通過匯編指令 SGDT (存儲(chǔ) GDT 寄存器)和 SIDT (存儲(chǔ) IDT 寄存器)來實(shí)現(xiàn)( cf. Intel 1999b, pp.3-636 ) 。這兩個(gè)指令需要一個(gè) 48 位的內(nèi)存操作數(shù),在該操作數(shù)中存放限制值和基地址值 。通過在結(jié)構(gòu)體中增加一個(gè) DWORD 來對(duì)齊 32 位的基地址,X86_TABLE 以一個(gè) 16 位的啞元成員 wReserved 開始 。根據(jù)是否使用了 SGDT 或 SIDT 指令,其基地址將被解釋為一個(gè)描述符指針或一個(gè)門指針,就像 PX86_DESCRIPTOR 和 PX86_GATE 中的 union 所暗示的那樣 。最后的 wLimit 成員在這兩種類型的表中的意義均相同 。

推薦閱讀