位址對映 分段分頁

2021-08-09 04:18:58 字數 2321 閱讀 5395

linux核心採用頁式儲存管理。虛擬位址空間劃分成固定大小的「頁面」,由mmu將虛擬位址對映成某個物理記憶體頁面中的位址。

一、三種不同的位址

邏輯位址經分段機制後就成線性位址;如果不啟用分頁,那麼此線性位址和實體地址相同。

線性位址經分頁轉換後就成了實體地址。

二、分段

1、段選擇符和段暫存器

index:指定了放在gdt或ldt中的相應段描述符的入口

ti:指明段描述符是在gdt中(t1=0)或在ldt中(t1=1)

rpl:請求者特權級,當相應的段選擇符裝入到cs暫存器中時指示出cpu當前的特權級;它還可以用於在訪問資料段時有選擇地削弱處理器的特權級。

為了快速方便地找到段選擇符,處理器提供段暫存器,段暫存器的唯一目的是存放段選擇符。這些段暫存器稱為cs,ss,ds,es,fs和gs.儘管只有 6個段暫存器,但程式可以把同乙個段暫存器用於不同的目的,方法是先將其值儲存在記憶體中,用完後再恢復。

cs **段暫存器,指向包含程式指令的段

ss 棧段暫存器,指向包含當前程式棧的段

ds 資料段暫存器,指向包含靜態資料或者全域性資料段

cs含有乙個兩位的字段,用以指明cpu的當前特權級cpl。值為0代表核心態,值為3代表使用者態。(linux只有0級和3級)

2、段描述符

每個段由乙個8位元組的段描述符表示,它描述了段的特徵。段描述符放在全域性描述符表gdt或區域性描述符表ldt中。通常只定義乙個gdt,而每個程序除了存放在gdt中的段之外如果還需要建立附加的段,就可以有自己的ldt。

gdt在主存中的位址和大小存放在gdtr控制暫存器中,當前正在被使用的ldt位址和大小放在ldtr控制暫存器中。

由於乙個段描述符是8位元組長,因此它在gdt或ldt內的相對位址是段選擇符的最高13位的值乘以8得到的。

eg:如果gdt在0x00020000,且由段選擇符所指定的索引號為2,那麼相應的段描述符位址是0x00020000+(2*8)

gdt的第一項總是設為0。確保空段選擇符的邏輯位址會被認為是無效的,因此引起乙個處理器異常。能夠儲存在gdt中的段描述符的最大數目是8191,即2^13-1

3、分段單元(邏輯位址怎樣轉換成相應的線性位址)

(1)先檢查段選擇符的ti欄位,以決定段描述符儲存在哪乙個描述符表中。ti欄位指明描述符在gdt(分段單元從gdtr暫存器中得到gdt的線性基位址)中還是在啟用的ldt中。(分段單元從ldtr暫存器中得到ldt的線性基位址)

(2)從段選擇符的index欄位計算段描述符的位址,index欄位的值乘以8(乙個描述符的大小),這個結果與gdtr或ldtr暫存器中的內容相加。

(3)把邏輯位址的偏移量與段描述符base欄位的值相加就得到了線性位址

三、分頁

每當排程乙個程序進入執行的時候,核心都要為即將執行的程序設定好控制暫存器cr3,而mmu的硬體則總是從cr3中取得指向當前頁面目錄的指標。

cpu在執行程式時使用的是虛擬位址,而mmu硬體在進行對映時所用的則是實體地址。這是在inline函式switch_mm()中完成的。

不管什麼程序,一旦進入了核心就進了系統空間,都有相同的頁面對映。

i386 cpu以線性位址的最高10位為下標去頁面目錄中找到其目錄項。

這個目錄項中的高20位指向乙個頁面表。

每個頁面表佔乙個頁面,4k位元組邊界對齊,其起始位址的低12位一定是0。所以把32位目錄項中的低12位挪作它用,其中最低位為p標誌位,為1時表示該頁面表在記憶體中。

線性位址的中間10位,cpu以此為下標在已經找到的頁面表中找到相應的表項。

頁面表項的p標誌位為1時表示所對映的頁面在記憶體中。32位的頁面表項中的高20位指向乙個物理記憶體頁面。

加上線性位址中的最低12位,就得到最終的物理記憶體位址。

在頁面對映過程中,i386 cpu要訪問記憶體三次,第一次是頁面目錄,第二次是頁面表,第三次是訪問真正的目標。

總結:

1.cpu將乙個虛擬記憶體空間中的位址轉換為實體地址,需要進行兩步:首先將給定乙個邏輯位址(其實是段內偏移量,這個一定要理解!!!),cpu要利用其段式記憶體管理單元,先將為個邏輯位址轉換成乙個線性位址,再利用其頁式記憶體管理單元,轉換為最終實體地址。

邏輯位址----段式記憶體管理單元----線性位址----頁式記憶體管理單元----實體地址

這樣做兩次轉換,的確是非常麻煩而且沒有必要的,因為直接可以把線性位址抽像給程序。之所以這樣冗餘,intel完全是為了相容而已。

2.在linux平台下,線性位址=虛擬位址=邏輯位址

linux下的分段分頁 位址對映

首先我們要注意的是虛擬空間分為核心空間和使用者空間。1.從邏輯位址到線性位址的轉換 對於linux來說,基本不使用分段的機制,或者說,linux中的分段機制只是為了相容ia32的硬體而設計的。linux核心的設計並沒有全部採用intel所提供的段方案,僅僅有限度地使用了一下分段機制。這不僅簡化了li...

分段和分頁

一.分頁儲存管理 1.基本思想 使用者程式的位址空間被劃分成若干固定大小的區域,稱為 頁 相應地,記憶體空間分成若干個物理塊,頁和塊的大小相等。可將使用者程式的任一頁放在記憶體的任一塊中,實現了離散分配。2.分頁儲存管理的位址機構 15 12 11 0 頁號p 頁內位移量w 頁號4位,每個作業最多2...

分頁與分段

基礎的分頁儲存管理方式 連續分配方式會形成許多碎片記憶體,雖然可以通過緊湊的方法將許多碎片拼接成可用的大空間,但必須為此付出巨大的開銷,因此該方式允許直接將乙個程序分散的插入許多不 相鄰的記憶體中。頁面和頁表 分頁儲存管理是將乙個程序的邏輯位址空間分成若干個大小相同的片,稱為頁面或者片,各頁從0開始...