Windows 2000記憶體篇 分頁機制介紹

2021-07-02 11:53:32 字數 3005 閱讀 4772

關於windows記憶體管理,可以參考《windows核心原理與實現》一書中的第4章記憶體管理,其中描述了另一種記憶體管理:段式記憶體管理

基本概念

windows 2000 使用基於分頁機制的虛擬記憶體。每個程序有4gb的虛擬位址空間。基於分頁機制,這4gb位址空間的一些部分被映**物理記憶體,一些部分對映硬碟上的交換檔案,一些部分什麼也沒有對映。程式中使用的都是4gb位址空間中的虛擬位址。而訪問物理記憶體,需要使用實體地址。

下面我們看看什麼是實體地址,什麼是虛擬位址。

實體地址(physical address): 放在定址匯流排上的位址。放在定址匯流排上,如果是讀,電路根據這個位址每位的值就將相應位址的物理記憶體中的資料放到資料匯流排中傳輸。如果是寫,電路根據這個位址每位的值就將相應位址的物理記憶體中放入資料匯流排上的內容。物理記憶體是以位元組(8位)為單位編址的。

虛擬位址(virtual address): 4g虛擬位址空間中的位址,程式中使用的都是虛擬位址。

如果cpu暫存器中的分頁標誌位被設定,那麼執行記憶體操作的機器指令時,cpu會自動根據頁目錄和頁表中的資訊,把虛擬位址轉換成實體地址,完成該指令。比如 mov eax,004227b8h ,這是把位址004227b8h處的值賦給暫存器的彙編**,004227b8這個位址就是虛擬址。cpu在執行這行**時,發現暫存器中的分頁標誌位已經被設定,就自動完成虛擬位址到實體地址的轉換,使用實體地址取出值,完成指令。對於intel cpu 來說,分頁標誌位是暫存器cr0的第31位,為1表示使用分頁,為0表示不使用分頁。對於初始化之後的 win2k 我們觀察cr0 ,發現第31位為1。表明win2k是使用分頁的。

使用了分頁機制之後,4g的位址空間被分成了固定大小的頁,每一頁或者被對映到物理記憶體,或者被對映到硬碟上的交換檔案中,或者沒有對映任何東西。對於一般程式來說,4g的位址空間,只有一小部分映**物理記憶體,大片大片的部分是沒有對映任何東西。物理記憶體也被分頁,來對映位址空間。對於32bit的win2k,頁的大小是4k位元組。cpu用來把虛擬位址轉換成實體地址的資訊存放在叫做頁目錄和頁表的結構裡。

物理記憶體分頁,乙個物理頁的大小為4k位元組,第0個物理頁從實體地址 0x00000000 處開始。由於頁的大小為4kb,就是0x1000位元組,所以第1頁從實體地址 0x00001000處開始。第2頁從實體地址0x00002000處開始。可以看到由於頁的大小是4kb,所以只需要32bit的位址中高20bit來定址物理頁。

頁表,乙個頁表的大小為4k位元組,放在乙個物理頁中。由1024個4位元組的頁表項組成。頁表項的大小為4個位元組(32bit),所以乙個頁表中有1024個頁表項。頁表中的每一項的內容(每項4個位元組,32bit)高20bit用來放乙個物理頁的實體地址,低12bit放著一些標誌。

頁目錄,乙個頁目錄大小為4k位元組,放在乙個物理頁中。由1024個4位元組的頁目錄項組成。頁目錄項的大小為4個位元組(32bit),所以乙個頁目錄中有1024個頁目錄項。頁目錄中的每一項的內容(每項4個位元組)高20bit用來放乙個頁表(頁表放在乙個物理頁中)的實體地址,低12bit放著一些標誌。

對於x86系統,頁目錄的實體地址放在cpu的cr3暫存器中。

乙個虛擬位址,大小4個位元組(32bit),包含著找到實體地址的資訊,分為3個部分:第22位到第31位這10位(最高10位)是頁目錄中的索引,第12位到第21位這10位是頁表中的索引,第0位到第11位這12位(低12位)是頁內偏移。對於乙個要轉換成實體地址的虛擬位址,cpu首先根據cr3中的值,找到頁目錄所在的物理頁。然後根據虛擬位址的第22位到第31位這10位(最高的10bit)的值作為索引,找到相應的頁目錄項(pde,page directory entry),頁目錄項中有這個虛擬位址所對應頁表的實體地址。有了頁表的實體地址,根據虛擬位址的第12位到第21位這10位的值作為索引,找到該頁表中相應的頁表項(pte,page table entry),頁表項中就有這個虛擬位址所對應物理頁的實體地址。最後用虛擬位址的最低12位,也就是頁內偏移,加上這個物理頁的實體地址,就得到了該虛擬位址所對應的實體地址。

乙個頁目錄有1024項,虛擬位址最高的10bit剛好可以索引1024項(2的10次方等於1024)。乙個頁表也有1024項,虛擬位址中間部分的10bit,剛好索引1024項。虛擬位址最低的12bit(2的12次方等於4096),作為頁內偏移,剛好可以索引4kb,也就是乙個物理頁中的每個位元組。

乙個虛擬位址轉換成實體地址的計算過程就是,處理器通過cr3找到當前頁目錄所在物理頁,取虛擬位址的高10bit,然後把這10bit右移2bit(因為每個頁目錄項4個位元組長,右移2bit相當於乘4)得到在該頁中的位址,取出該位址處pde(4個位元組),就找到了該虛擬位址對應頁表所在物理頁,取虛擬位址第12位到第21位這10位,然後把這10bit右移2bit(因為每個頁表項4個位元組長,右移2bit相當於乘4)得到在該頁中的位址,取出該位址處的pte(4個位元組),就找到了該虛擬位址對應物理頁的位址,最後加上12bit的頁內偏移得到了實體地址。

32bit的乙個指標,可以定址範圍0x00000000-0xffffffff,4gb大小。也就是說乙個32bit的指標可以定址整個4gb位址空間的每乙個位元組。乙個頁表項負責4k的位址空間和物理記憶體的對映,乙個頁表1024項,也就是負責1024*4k=4m的位址空間的對映。乙個頁目錄項,對應乙個頁表。乙個頁目錄有1024項,也就對應著1024個頁表,每個頁表負責4m位址空間的對映。1024個頁表負責1024*4m=4g的位址空間對映。乙個程序有乙個頁目錄。所以以頁為單位,頁目錄和頁表可以保證4g的位址空間中的每頁和物理記憶體的對映。

每個程序都有自己的4g位址空間,從0x00000000-0xffffffff。通過每個程序自己的一套頁目錄和頁表來實現。由於每個程序有自己的頁目錄和頁表,所以每個程序的位址空間對映的物理記憶體是不一樣的。兩個程序的同乙個虛擬位址處(如果都有物理記憶體對映)的值一般是不同的,因為他們往往對應不同的物理頁。

4g位址空間中低2g,0x00000000-0x7fffffff是使用者位址空間,4g位址空間中高2g,0x80000000-0xffffffff 是系統位址空間。訪問系統位址空間需要程式有ring0的許可權。

清空密碼進入WINDOWS2000

windows200所在的winnt system32 config下有乙個sam檔案 即賬號密碼資料庫檔案 它儲存了windows2000中所有的使用者名稱和密碼,當你登入時,系統就會把你輸入 的使用者名稱和密碼與sam檔案中的加密資料進行校對,如果兩者完全相符,則會順利進入系統,否則將無法的登入...

Windows 2000下許可權特性

許可權是具有繼承性 累加性 優先性 交叉性的。繼承性是說下級的目錄在沒有經過重新設定之前,是擁有上一級目錄許可權設定的。這裡還有一種情況要說明一下,在分區內複製目錄或檔案的時候,複製過去的目錄和檔案將擁有它現在所處位置的上一級目錄許可權設定。但在分區內移動目錄或檔案的時候,移動過去的目錄和檔案將擁有...

關於如何註冊Windows2000服務

想讓乙個程式在啟動系統的時候自動執行,你有什麼好辦法?新增到啟動組?那如果別人刪除掉就不管用了。如果你使用了windows nt 2000 xp,就可以試試把這個程式新增為乙個服務,這樣只有擁有許可權的人才可以更改服務,只要你設定好許可權,就不用擔心會被別人刪除了。把這兩個程式儲存在乙個方便的位置,...