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

1 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 六 )





補(bǔ)充:

這部分內(nèi)容選擇自《 Windows 環(huán)境下 32 位匯編語(yǔ)言程序設(shè)計(jì)》

x86 的內(nèi)存分頁(yè)機(jī)制
當(dāng) x86 CPU 工作在保護(hù)模式和虛擬 8086 模式時(shí),可以使用全部 32 根地址線訪問 4GB 的內(nèi)存 。因?yàn)?80386 的所有通用寄存器都是 32 位的,所以用任何一個(gè)通用寄存器來(lái)間接尋址,不必分段就可以訪問到 4GB 的內(nèi)存地址 。
但 這并不意味著,此時(shí)段寄存器就不再有用了 。實(shí)際上,段寄存器更加有用了,雖然在尋址上沒有分段的限制了,但在保護(hù)模式下,一個(gè)地址空間是否可以被寫入,可 以被多少優(yōu)先級(jí)的代碼寫入,是不是允許執(zhí)行等等涉及保護(hù)的問題就出來(lái)了 。要解決這些問題,必須對(duì)一個(gè)地址空間定義一些安全上的屬性 。段寄存器這時(shí)就派上了 用場(chǎng) 。但是設(shè)計(jì)屬性和保護(hù)模式下段的其他參數(shù),要表示的信息太多了,要用 64 位長(zhǎng)的數(shù)據(jù)才能表示 。我們把這 64 位的屬性數(shù)據(jù)叫做段描述符( Segment Descriptor ) 。
80386 的段寄存器是 16 位的,無(wú)法放下保護(hù)模式下 64 位的段描述符 。如何解決這個(gè)問題呢?方法是把所有段的段描述符順序存放在內(nèi)存中的指定位置,組成一個(gè)段描述符表( Descriptor Table );而段寄存器中的 16 位用來(lái)做索引信息,指定這個(gè)段的屬性用段描述符表中的第幾個(gè)描述符來(lái)表示 。這時(shí),段寄存器中的信息不再是段地址了,而是段選擇器( Segment Selector ) ??梢酝ㄟ^它在段描述符表中“選擇”一個(gè)項(xiàng)目已得到段的全部信息 。
那么段描述符表存放在哪里呢? 80386 引入了兩個(gè)新的寄存器來(lái)管理段描述符表 。一個(gè)是 48 位的全局描述符表寄存器 GDTR ,一個(gè)是 16 位的局部描述符表寄存器 LDTR。那么,為什么有兩個(gè)描述符表寄存器呢?
GDTR 指向的描述符表為全局描述符表 GDT ( Global Descriptor Table ) 。它包含系統(tǒng)中所有任務(wù)都可用的段描述符,通常包含描述操作系統(tǒng)所使用的代碼段、數(shù)據(jù)段和堆棧段的描述符及各任務(wù)的 LDT 段等 。全局描述符表只有一個(gè) 。
LDTR 指向局部描述符表 LDT ( Local Descriptor Table ) 。80386 處理器設(shè)計(jì)成每個(gè)任務(wù)都有一個(gè)獨(dú)立的 LDT。它包含每個(gè)任務(wù)私有的代碼段、數(shù)據(jù)段和堆棧段的描述符,也包含該任務(wù)所使用的一些門描述符,如任務(wù)門和調(diào)用門描述符等 。
不同任務(wù)的局部描述符分別組成不同的內(nèi)存段,描述這些內(nèi)存段的描述符當(dāng)作系統(tǒng)描述符放在全局描述符表中 。和 GDTR 直接指向內(nèi)存地址不同, LDTR 和 CS 、 DS 等段選擇器一樣只存放索引值,指向局部描述符內(nèi)存段對(duì)應(yīng)的描述符在全局描述符表中的位置 。隨著任務(wù)的切換,只要改變 LDTR 的值,系統(tǒng)當(dāng)前的局部描述符表 LDT 也隨之切換,這樣便于個(gè)任務(wù)之間數(shù)據(jù)的隔離 。但 GDT 并不隨著任務(wù)的切換而切換 。
16 位的段選擇器如何使用全局描述符表和局部描述符表這兩個(gè)表呢?實(shí)際上,段選擇器中只有高 13 位表示索引值 。剩下的 3 個(gè)數(shù)據(jù)位中,第 0 , 1 位表示程序的當(dāng)前優(yōu)先級(jí) RPL ;第 2 位 TI 位用來(lái)表示在段描述符的位置; TI=0 表示在 GDT 中, TI=1 表示在 LDT 中 。
80386 處理器把 4KB 大小的一塊內(nèi)存當(dāng)作一“頁(yè)”內(nèi)存,每頁(yè)物理內(nèi)存可以根據(jù)“頁(yè)目錄”和“頁(yè)表”,隨意映射到不同的線性地址上 。這樣,就可以將物理地址不連續(xù)的內(nèi)存的映射連到一起,在線性地址上視為連續(xù) 。在 80386 處理器中,除了與 CR3 (保存當(dāng)前頁(yè)目錄的地址)相關(guān)的指令使用的是物理地址外,其他所有指令都是使用線性地址尋址的 。
是否啟用內(nèi)存分頁(yè)機(jī)制是由 80386 處理器新增的 CR0 寄存器中的位 31 ( PG 位)決定的 。如果 PG=0 ,則分頁(yè)機(jī)制不啟用,這時(shí)所有指令尋址的地址(線性地址)就是系統(tǒng)中實(shí)際的物理地址;當(dāng) PG=1 的時(shí)候, 80386 處理器進(jìn)入內(nèi)存分頁(yè)管理模式,所有的線性地址要經(jīng)過頁(yè)表的映射才得到最后的物理地址 。

推薦閱讀