以下是一個(gè)非常簡短、高層次的答案:
x86處理器以幾種可能的模式之一工作(大致是:真實(shí)的、受保護(hù)的、64位的)。每種模式都可以使用幾種可能的內(nèi)存尋址模型中的一種(但不是每一種模式都可以使用每個(gè)模型),即:實(shí)模式尋址、分段尋址和平行線尋址。
在現(xiàn)代世界中,只有保護(hù)模式或64位模式下的平坦線性尋址是相關(guān)的,這兩種模式本質(zhì)上是相同的,主要的區(qū)別是機(jī)器字的大小,因此內(nèi)存的可尋址量。
現(xiàn)在,內(nèi)存尋址模式賦予機(jī)器指令的內(nèi)存操作數(shù)(如mov DWORD PTR [eax], 25
,存儲(chǔ)32位(又名dword
)將值25的整數(shù)放入內(nèi)存中,該內(nèi)存的地址存儲(chǔ)在eax
32位寄存器)。在平坦線性尋址中,這個(gè)數(shù)字在eax
允許在一個(gè)連續(xù)的范圍內(nèi)運(yùn)行,從零到最大值(在我們的例子中是2)。32?1)。
然而,平坦的尋址可以是傳呼或未傳呼..在不分頁的情況下,地址直接引用物理內(nèi)存。帶著分頁,處理器的內(nèi)存管理單元(或MMU)透明地為所需地址(現(xiàn)在稱為虛擬地址)進(jìn)入查找機(jī)制,即所謂的頁表,并獲得一個(gè)新值,該值被解釋為物理地址。最初的操作現(xiàn)在運(yùn)行在物理內(nèi)存中的這個(gè)新的轉(zhuǎn)換地址上,即使用戶只看到虛擬地址。
分頁的主要好處是頁表由操作系統(tǒng)管理。因此,操作系統(tǒng)可以任意修改和替換頁面表,例如“切換任務(wù)”時(shí)。它可以保存一個(gè)完整的頁表集合,每個(gè)“進(jìn)程”一個(gè),每當(dāng)它決定某個(gè)特定進(jìn)程要在給定的CPU上運(yùn)行時(shí),它就會(huì)將進(jìn)程的頁表加載到該CPU的MMU中(每個(gè)CPU都有自己的一組頁表)。結(jié)果是每個(gè)進(jìn)程都看到了自己的虛擬當(dāng)操作系統(tǒng)不得不為其分配內(nèi)存時(shí),無論哪個(gè)物理頁面是空閑的,地址空間看起來都是一樣的。它永遠(yuǎn)不知道任何其他進(jìn)程的內(nèi)存,因?yàn)樗荒苤苯釉L問物理內(nèi)存。
頁表是嵌套的樹狀數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)在普通內(nèi)存中,由操作系統(tǒng)編寫,但由硬件直接讀取,因此格式是固定的。通過設(shè)置一個(gè)特殊的CPU控制寄存器指向頂層表,它們將被“加載”到MMU中。CPU使用一個(gè)稱為TLB的緩存來記住查找,因此對(duì)相同幾個(gè)頁面的重復(fù)訪問比分散的訪問要快得多,這是因?yàn)門LB丟失的原因以及通常的數(shù)據(jù)緩存原因。經(jīng)常會(huì)看到術(shù)語“TLB條目”用于指頁表?xiàng)l目,即使它們沒有緩存在TLB中。
如果您擔(dān)心某個(gè)進(jìn)程可能只是禁用分頁或嘗試修改頁表:這是不允許的,因?yàn)閤86實(shí)現(xiàn)了特權(quán)級(jí)別(稱為“循環(huán)”),用戶代碼執(zhí)行的權(quán)限級(jí)別太低,無法修改CPU的頁表。