記憶體定址二 分頁

2021-06-21 21:21:11 字數 3937 閱讀 7855

分頁單元(paging unit)把線性位址轉換成實體地址。其中乙個關鍵任務是把所請求的訪問型別與線性位址的訪問許可權相比較,如果這次記憶體訪問時無效的,就產生乙個缺頁異常。

為了效率起見,線性位址被分成以固定長度為單位的組,稱為頁(page)。頁內部連續的線性位址被對映到連續的實體地址中。這樣,核心可以指定乙個頁的實體地址和其訪問許可權,而不用指定頁所包含的全部線性位址的訪問許可權。通常使用術語"頁"既指一組線性位址,又指包含在這組位址中的資料。

分頁單元把所有的ram分成固定長度的頁框(page frame)(有時稱作物理頁)。每乙個頁框包含乙個頁(page),也就是說乙個頁框的長度與乙個頁的長度一致。頁框是主存的一部分,因此也是乙個儲存區域。區分一頁和乙個頁框是很重要的,前者只是乙個資料塊,可以存放在任何頁框或磁碟中。

把線性位址對映到實體地址的資料結構稱為頁表(page table)。頁表存放在主存中,並在啟用分頁單元之前必須由核心對頁表進行適當的初始化。

分頁行為通過下面的控制位控制:

a、the wp and pg flags in control registercr0 (bit 16 and bit 31, respectively).

b、the pse, pae, pge, pcide, and smep flags in control registercr4 (bit 4, bit 5, bit 7, bit 17, and bit 20 respectively)

c、the lme and nxe flags in theia32_efer msr (bit 8 and bit 11, respectively).

只有在保護使能(cr0.pe = 1),分頁才會使能(

cr0.pg = 1),如果分頁使能,有三種分頁模式,cr4.pae與ia32_efer.lme決定使用哪種分頁模式

if cr0.pg = 1 and cr4.pae = 0, 32-bit paging is used.

if cr0.pg = 1, cr4.pae = 1, and ia32_efer.lme = 0, pae paging is used.

if cr0.pg = 1, cr4.pae = 1, and ia32_efer.lme = 1, ia-32e paging is used.

常規4kb分頁

directory(目錄)   table(頁表)   offset(偏移量)

最高10位          中間10位       最低12位

線性位址的轉換分為兩步完成,每一步都基於一種轉換表,第一種轉換表稱為頁目錄表(page directory),第二種轉換表稱為頁表(page table)。

正在使用的頁目錄的實體地址存放在控制器暫存器cr3中。線性位址內的directory欄位決定頁目錄中的目錄項,而目錄項指向適合的頁表。位址的table欄位依次又決定頁表中的表項,而表項含有頁所在頁框的實體地址。offset欄位決定頁框內的相對位置。由於它是12位長,故每一頁含有4096位元組資料。

directory欄位和table欄位都是10位長,因此頁目錄和頁表都可以多達1024項。那麼乙個頁目錄可以定址到高達1024*1024*4096=2^32個儲存單元。

擴充套件4m分頁(extended paging)

擴充套件分頁用於把大段連續的線性位址轉換為相應的實體地址,在這種情況下,核心可以不用中間頁表進行位址轉換,從而節省記憶體並保留tlb項

擴充套件分頁和常規分頁的頁目錄項基本相同,除了:

a、page size標誌必須被設定。

b、20位實體地址字段只有最高10位是有意義的。這是因為每乙個實體地址都是在以4m為邊界的地方開始的,故這個位址的最低22位為0。

下面是page directory,page table及cr3欄位代表的意義

舉例:假如核心已給乙個正在執行的程序分配的線性位址空間範圍是0x20000000到0x2003ffff。假設程序需要讀線性位址0x20021406中的位元組。這個位址由分頁單元按下面的方法處理:

1.directory欄位的0x80用於選擇頁目錄的第0x80目錄項,此目錄項指向和該程序的頁相關的頁表

2.table欄位0x21用於選擇頁表的第0x21表項,此表項指向包含所需頁的頁框。

3.最後,offset欄位0x406用於在目標頁框中讀偏移量為0x406中的位元組。

大型伺服器需要大於4g的ram來同時執行數以千計的程序,所以必須擴充套件32位80x86架構所支援的ram的容量。intel通過在它的處理器把位址匯流排管腳從32增加到36以滿足這種需求,為了把32位線性位址轉換為36位實體地址引入一種新的分頁機制pae。

引入乙個叫做頁目錄指標表(page directory poninter table,pdpt)的頁表新級別,它有4個64位表項組成。

cr3     指向乙個pdpt

位31-30 指向pdpt中4個項中的乙個

位29-21 指向頁目錄中512個項中的乙個

位20-12 指向頁表中512項中的乙個

位11-0  4kb頁中的偏移量

當把線性位址對映到2mb的頁時,32位線性位址按下列方式解釋

cr3     指向乙個pdpt

位31-30 指向pdpt中4個項中的乙個

位29-21 指向頁目錄中512個項中的乙個

位20-0  4kb頁中的偏移量

使用pae的主要問題是線性位址仍然是32位長。這就迫使核心程式設計人員用同一線性位址對映不同的ram區。

32位處理器普遍採用兩級分頁。然而兩級分頁並不適用於採用64位系統的計算機。原因如下:

首先假設乙個大小為4kb的標準頁,4kb覆蓋2^12個位址,所以offset欄位是12位。如果我們現在決定僅僅使用64位中的48位來定址(這個限制仍然能是我們自在地擁有256tb的定址空間!),剩下的48-12=36位被分配給table和directory欄位。如果我們決定為兩個欄位個預留18位,那麼每個程序的頁目錄和頁表都含有2^18個項,即超過256000個項。

由於這個原因,所有64位處理器的硬體分頁系統都使用了額外的分頁級別。使用的級別數量取決於處理器的型別。

平台名稱   頁大小   定址使用位數   分頁級別   線性位址分級

alpha     8kb     43           3        10+10+10+13

ia64      4kb     39           3        9+9+9+12

ppc64     4kb     41           3        10+10+9+12

x86_64    4kb     48           4        9+9+9+9+12

注:ia64是intel的一門高階技術,不與x86_64系統相容

ia-32e paging機制下線性位址對映到4kb的頁

scrapy入門二 分頁抓取文章入庫

相關 coding utf 8 import scrapy from cnblogs.items import articleitem class blogsspider scrapy.spider name blogs allowed domains news.cnblogs.com start ...

Linux記憶體定址之分頁機制

記憶體定址之分頁機制 分頁機制在段機制之後進行,以完成線性 實體地址的轉換過程。段機制把邏輯位址轉換為線性位址,分頁機制進一步把該線性位址再轉換為實體地址。80386使用4k位元組大小的頁。每一頁都有4k位元組長,並在4k位元組的邊界上對齊,即每一頁的起始位址都能被4k整除。因此,80386把4g位...

11)分頁功能

思路 定義四個分頁變數 pagenow 表示第幾頁,該變數是由使用者來決定的,因此是變化的 pagesize 每一頁顯示幾條記錄。由程式制定,也可以由使用者定製 pagecount 表示總共有多少頁。該變數是計算出來 思考,怎樣確定 rowcount 共有多少條記錄。該變數是查詢資料庫得到的 一 如...