天天看點

程序與頁目錄

LINUX的分段政策

  Linux在X86上采用最低限度的分段機制,其目的是為了避開複雜的分段機制,提高Linux在其他不支援分段機制的硬體平台的可移植性,同時又充分利用X86的分段機制來隔離使用者代碼和核心代碼。是以,在Linux上,邏輯位址和線性位址具有相同的值。

  由于X86的GDT最大表長為64KB,每個段描述符為8B,是以GDT最多能夠容納8192個段描述符。每産生一個程序,Linux為該程序在GDT中建立兩個描述符:LDT段描述符和TSS描述符,除去Linux在GDT中保留的前12項,GDT實際最多能容納4090個程序。Linux的核心自身有獨立的代碼段和資料段,其對應的段描述符分别存儲在GDT中的第2項和第3項。每個程序也有獨立的代碼段和資料段,對應的段描述符存儲在它自己的LDT中。有關LinuxGDT表項和DLT表項分布情況參見附表1,附表2所示。

  在Linux中,每個使用者程序都可以通路4GB的線性位址空間。其中0x0~0xBFFFFFFF的3GB空間為使用者态空間,使用者态程序可以直接通路。從0xC0000000~0x3FFFFFFF的1GB空間為核心态空間,存放核心通路的代碼和資料,使用者态程序不能直接通路。當使用者程序通過中斷或系統調用通路核心态空間時,會觸發X86的特權級轉換(從特權級3切換到特權級0),即從使用者态切換到核心态。

LINUX的分頁政策

  标準Linux的分頁是三級頁表結構,除了X86支援的頁目錄和頁,還有一級被稱為中間頁目錄。是以,線性位址在轉換為實體位址的過程中,線性位址就被解釋為四個部分(不是X86所認識的三個部分),增加了頁中間目錄中的索引。當運作在X86平台上時,Linux通過将中間頁目錄最大的頁目錄項個數定義為1,并提供一組相關的宏(這些宏将中間頁目錄用頁目錄來替換)将三級頁面結構分解過程完美的轉換為X86使用的二級頁面分解。這樣,無需改動核心中頁面解釋的主要代碼(這些代碼都是認為線性位址由四個部分組成)。關于這些宏定義參見Linux源碼"/include/asm/pgtable.h","/include/asm/page.h"。

  核心态虛拟空間從3GB到3GB+4MB的一段(對應程序頁目錄第768項指引的頁表),被映射到實體位址0x0~0x3FFFFF(4MB)。是以,程序處于核心态時,隻要通過通路3GB到3GB+4MB就可通路實體記憶體的低4MB空間。所有程序從3GB到4GB的線性空間都是一樣的,由

程式與頁目錄

windows 每個程序都有自己的4G位址空間,從 0x00000000-0xFFFFFFFF 。通過每個程序自己的一套頁目錄和頁表來實作。由于每個程序有自己的頁目錄和頁表,是以每個程序的位址空間映射的實體記憶體是不一樣的。兩個程序的同一個虛拟位址處(如果都有實體記憶體映射)的值一般是不同的,因為他們往往對應不同的實體頁。

繼續閱讀