1. 程式人生 > >《一個作業系統的實現》讀書筆記--第三章--分頁機制

《一個作業系統的實現》讀書筆記--第三章--分頁機制

1、邏輯地址、線性地址和實體地址
2、分頁管理機制
3、PDE、PTE、cr3
4、如何初始化頁目錄表與頁表

一、邏輯地址、線性地址和實體地址

1、在未開啟分頁機制情況下


2、在開啟分頁機制情況下


二、分頁管理機制

下圖向大家展示,如何通過分頁管理機制,將線性地址轉換為實體地址的。


轉換使用兩級頁表,第一級叫做頁目錄,大小為4KB,儲存在一個物理頁中,每個表項4位元組長,共有1024 
個表項。每個表項對應第二級的一個頁表,第二級的每一個頁表也有1024個表項,每一個表項對應一個物 
理頁。頁目錄表的表項簡稱PDE(Page Directory Entry),頁表的表項簡稱PTE(Page Table Entry)。

線性地址轉換實體地址的具體步驟是:
(1)先是從暫存器cr3指定的頁目錄中根據線性地址的高10位得到頁表。
(2)在頁表中,根據線性地址的第12—21位得到物理頁首地址。
(3)將這個首地址,加上線性地址的低12位便得到了實體地址。

三、cr3、PDE和PTE

1、cr3的結構圖如下:


2、PDE的結構圖如下:


其中特別需要注意的幾個屬性:
(1)P存在位,表示當前條目所指向的頁或頁表是否在實體記憶體中。當P=0表示頁不在記憶體中,如果此時處理器試圖訪問此頁,將會產生頁異常(Page-fault exception, #PF);P=1表示頁在記憶體中。
(2)A指示頁或頁表是否被訪問。此位往往在頁或頁表剛剛被載入到實體記憶體中時被記憶體管理程式清零,處理器會在第一次訪問此頁或也表時設定該位。而且,處理器並不會自動清除此位,只有軟體能清除它。在時鐘頁面置換演算法中,需要通過該位來標識此頁面是否已經被訪問。


(3)D指示頁或頁表是否被寫入,此位往往在頁或頁表剛剛被載入到實體記憶體中時被記憶體管理程式清零,處理器會在第一次寫入此頁或頁面時設定此位。而且,處理器並不會自動清除此位,只有軟體能清除它。由於該位的存在,當往某頁寫入內容時,並不需要將其同步到磁碟上,只有當該頁被置換出時,判斷該位D=0,則表示該頁沒有被寫入,則不需要將其寫入磁碟;D=1,則表示該頁已被寫入,則需要將其寫入到磁碟。

3、PTE的結構圖如下:


其中各屬性位與PDE中具有相同的含義。

4、頁對其方式

cr3中的高20位將是頁目錄表首地址的高20位,PDE的高20位是頁表首地址,PTE的高20位是物理頁的首地址。保護模式下,定址的範圍是0-4GB,為什麼卻用20位來儲存這些首地址呢?
cr3中的高20位是頁目錄表首地址的高20位,頁目錄表首地址的低12位將會是0,這樣就保證了頁目錄表會是4KB對齊的。同理,PDE中的頁表基址(Page-Table Base Address),以及PTE中的物理頁基址(Page Base Address)也是用高20位來表示4KB對齊的頁表和頁。

四、如何初始化頁目錄表與頁表

pmtest6.asm中初始化頁目錄表與頁表

PageDirBase	equ	200000h	;頁目錄開始地址: 2M
PageTblBase	equ	201000h	;頁表開始地址: 2M + 4K

;啟動分頁機制===============================================
SetupPaging:
	;為簡化處理,所有線性地址對應相等的實體地址
	;首先初始化頁目錄
	mov ax, SelectorPageDir
	mov es, ax
	mov ecx, 1024
	xor edi, edi
	xor eax, eax
	mov eax, PageTblBase|PG_P|PG_USU|PG_RWW
.1:
	stosd
	add eax, 4096
	loop .1

	;再初始化所有頁表
	mov ax, SelectorPageTbl
	mov es, ax
	mov ecx, 1024*1024
	xor edi, edi
	xor eax, eax
	mov eax, PG_P|PG_USU|PG_RWW
.2:	
	stosd
	add eax, 4096
	loop .2

	mov eax, PageDirBase
	mov cr3, eax

	mov eax, cr0
	or eax, 80000000h
	mov cr0, eax
	
	jmp short .3
.3:
	nop
	ret
;分頁機制啟動完畢==========================================

初始化頁目錄表和頁表之後,要讓cr3指向頁目錄表,然後設定cr0的PG位。