Linux下位址對映原理

2021-07-25 00:13:36 字數 2919 閱讀 1789

一、intel x86晶元發展過程

在x86體系中,8086及以前是16位處理機,80386是32位處理機,80286是16位到32位的過渡晶元。這裡cpu的位數是指「算術邏輯單元alu」的寬度,也指資料匯流排的條數。通常資料匯流排的條數與位址匯流排的條數保持一致,但8位cpu的定址能力僅僅能夠尋訪256個位址單元,這顯然是不夠的,因此,8位cpu位址匯流排的寬度設計為16位,即位址空間為64k。但之後的使用中,64k已經無法滿足人們的操作,intel決定加到1m,即位址匯流排寬度調整為20位,這就是8086所採用的設計結構:16位cpu,20位位址匯流排寬度。

同時,產生了乙個新的問題?位址匯流排與資料匯流排不對等。

二、實位址模式下的位址對映

intel在8086中設定了4個暫存器:cs(**段暫存器),ds(資料段暫存器),ss(堆疊段暫存器),es(擴充套件段暫存器)。每個段暫存器都是16位,對應每個段的起始位址的高16位。這是由於實體地址被劃分成一段一段的,每個記憶體段都是16的整數倍,即在20位的位址中,低四位全為0,沒有必要儲存。

因此,實模式下位址對映表示式為:(假如尋找資料位址)

ds<<4 + ip = 資料位址

ds<<4得到真實的20位段基位址,加上ip暫存器存放的偏移量,即邏輯位址,就可以找到資料所存放的位置,這裡的資料位址為實體地址。因此,在實模式下,可以直接通過修改段暫存器的內容訪問記憶體中的任何乙個位址單元,不受任何許可權控制,沒有保護措施。

三、保護模式下的位址對映

以80386的32位cpu為討論物件,由於intel 80386晶元要相容以前設計,保留以前16位的段暫存器,同時又增添了兩個新的暫存器:fs和gs。設計的基本思路:設計乙個資料結構,包含基位址,位址段長度及訪問許可權等資訊,在保護模式下需要改變段暫存器的功能,把原來存放段基址的功能改變成存放乙個資料結構的指標。

基本過程:

(1)根據指令的性質判斷使用哪乙個段暫存器;

(2)在段暫存器中找到相應的資料結構;

(3)在此資料結構中找到段基位址;

(4)根據指令位址(偏移量)和位址段大小比較,判斷是否越界;

(5)根據指令許可權與資料結構中的許可權對比,判斷是否越權;

(6)段基址+指令位址得到實體地址。

實現過程:80386cpu中又增加了兩個暫存器:gdtr(global descriptor table register)全域性的段描述表暫存器,ldtr(local descriptor table register)區域性的段描述表暫存器。

段暫存器如圖所示:

段暫存器的高13位包含了8192個全域性或區域性的段描述表項描述符,它與gdtr或ldtr的基位址相加才得到描述表項的起始位址。每個段描述表項為8位元組,存放段基址,段大小和其他資訊,具體結構如圖所示:

起始位址32位:b31-b24,b23-b16,b15-b0

長度20位:l19-l16,l15-l0

長度單位g,為0代表單位為位元組,為1時代表頁面

因此,保護模式下的位址對映表示為:

gdtr[ds>>3].baseaddr + ip  = 線性位址

ds>>3取得gdtr表項的下標,gdtr[ds>>3].baseaddr找到該表項的基位址,再加上邏輯位址,得到該資料的線性位址。此處不為實體地址是還要進行記憶體分頁機制。

當乙個段暫存器的內容改變時,cpu根據段暫存器找到對應的段描述表項,將新的表項裝入cpu中。此過程中會檢查描述表項的p標誌位,為0代表描述表項所指向的內容不再記憶體中(在磁碟某個地方),此時會產生異常,相應程式會從磁碟交換區將此內容讀入記憶體,並設定基位址,在把p置為1.

由於保護模式下對記憶體操作具有許可權控制,使得使用者不能隨意改變gdtr或ldtr的值,所以具有保護機制。

四、記憶體分頁機制

80386不僅實現了對段式記憶體管理,還實現了對頁式記憶體管理。在段式記憶體管理中,連續的邏輯位址對映到實體地址也是連續的,但在頁式記憶體管理中,連續的邏輯位址對映到實體地址不是連續的。

頁式記憶體管理中,cr3暫存器存放頁目錄的起始位址,原來的線性位址有了新的定義,高10位為頁目錄,次高10位為頁表,低12位為頁內偏移offset。

頁目錄中有2^10=1024項,頁表也有2^10=1024項,頁內偏移2^12=4k,每個頁目錄項指向乙個對應的頁表,每個頁表指向對應的偏移量所以整個頁面對映可以對映到4g的虛擬位址空間。

記憶體分頁對映過程:

(1)從cr3暫存器中找到頁目錄的起始位址;

(2)頁目錄起始位址在加上頁目錄項存放的偏移量得到頁表的起始位址;

(3)頁表的起始位址加上頁表項的偏移量得到實體地址的基位址;

(4)實體地址的基位址加上頁內偏移最終得到真實的實體地址。

由於每個頁面都是4k,頁面基位址都是4k的整數倍,所以頁目錄和頁表對應的描述項只存放位址高20位,低12位可存放其他許可權等資訊。如最低位present位,為0時代表此頁面不在記憶體中。

總結:(以資料位址為例)通過資料段暫存器<<3位得到全域性段描述表的下標,找到對應的描述項,即得到32位的基位址,再加上ip暫存器裡的偏移量得到線性位址。通過暫存器cr0判斷是否開啟記憶體分頁機制,沒有開啟時,則此時的線性位址就為實體地址,如果開啟了記憶體分頁,則通過多級頁表對映找到對應的實體地址。

Linux位址對映 位址轉換 mmap,vma

一,線性對映與非線性對映 1.記憶體管理 物理記憶體管理 linux 記憶體最小管理單位為頁 page 通常一頁為 4k。初始化時,linux 會為每個物理記憶體也建立乙個 page 的管理結構,操作物理記憶體時實際上就是操作 page 頁。某些裝置會對映在物理記憶體位址外,這些位址會在使用時建立 ...

Linux下的位址對映

在cpu中設定四個 段暫存器 cs ds ss es 分別用於可執行 即指令,資料,堆疊和其他 每個段暫存器都是16位,對應位址匯流排的高16位。每條 訪內指令 的內部位址都是16位。訪內 的內部位址 16位 轉化成實際位址 20位 段暫存器中內基位址 4 內部位址 對於每乙個由段暫存器的內容確定的...

Linux虛擬位址對映

我們定義乙個區域性變數,然後列印出這個區域性變數的位址,那麼這個區域性變數的位址是線性位址?實體地址?還是邏輯位址?要明白這些,先來看看以下的知識吧。x86體系 指的是特定微cpu執行的有些 計算機語言 指令集,定義了 晶元的基本用規則 cpu的位數 alu一次性最多能處理的整數的位元組數,也即al...