Linux0 12 記憶體定址

2021-06-04 01:06:44 字數 2357 閱讀 7637

一、分段與分頁的比較

1.邏輯位址 -----(分段機制)-----> 線性位址 -----(分頁機制)-----> 實體地址

分段機制是必須有的,分頁機制可以沒有。

如果沒有分頁機制,線性位址=實體地址

不同的分段機制和不同的分段機制可以隨意組合

線性位址和實體地址都是32位,是一維的

3.分段的原因:隔絕各個任務的**、資料和堆疊區域的機制,使多個程式(或任務)可以執行在同一處理器上而不會相互干擾

分頁的原因:為虛擬記憶體系統提供了實現機制,也用於提供多工之間的隔離措施

4.先執行段級保護,再執行頁級保護

段特權級有4級,頁只有2級。

超級使用者級執行的程式可對任何頁面有讀寫操作,即使是唯讀頁面。

5.保護檢查操作與位址變換同時進行,因此處理器不會受到影響

二、分段管理

段選擇符中13位是索引號,因此可以選擇8191(0號段不用)個段。

段選擇符中乙個是區分gdt和ldt,因此準備地說,乙個任務最多可以擁有全域性段和區域性段各8191個。

偏移值有32位,因此乙個段最長是4g

只有6個段暫存器,因此只有6個段可供同時訪問

(1)段選擇符 -----> ti -----> 記錄段描述符基址的暫存器

(2)段選擇符 ----->index ----->  段描述符

段描述符位址 = 段描述符基址(暫存器中) +  index  *  8b

(2)段描述符 -----> 段首位元組的線性位址

(3)段首位元組的線性位址 + 偏移值 -----> 目標線性位址

3.段的分類

段(資料段,**段,系統段(系統段表(ldt段表,tss段表),門描述符(呼叫門,中斷門,陷阱門,任務門)))

段描述符定義乙個段。門描述符存放的是指向乙個過程入口點的指標

任務門:任務切換

陷阱門:呼叫異常處理程式

中斷門:呼叫中斷處理程式

呼叫門:在不同的特權級之間實現受控的程式控制轉移

4.ldt是區域性描述符表,gdt是全域性描述符表

ldt表是一種系統段,其描述符屬於系統段描述符。

每個儲存ldt表的段,都必須在gdt中有乙個段描述符和段選擇符

5.6個段暫存器分別是:**cs, 棧ss, 資料ds, 通用es,gs,fs

6.w/r

一致性**段

在保護模式下不可寫

一致性或非一致性

棧段必須可讀可寫

資料段唯讀或可讀可寫

必須非一致性

7.特權級越大,特權越低

cpl:當前特權級,指當前執行的程式或任務的特權級

dpl:描述符特權級,指目標段或門的描述符特權級

rpl:請求特權級,指目標段或門的選擇符特權級

二、分頁管理

1.分頁機制把張線性位址空間和物理空間劃分成頁面

分頁機制是頁面-頁面的對映,位址-位址的轉換

2.頁面大小為4k

頁面數為2^20 = 2^(32-12)

頁表項大小為4b = 32 / 8

頁表大小為4mb = 2^20 * 4

3.使用二級頁表並沒有解決需要4mb來存放頁表項的問題,它的作用是:

(1)不需要連續的4b空間

(2)目標表頁面必須在記憶體中,但二級頁表可以不在記憶體中

頁面大小:2^offset = 4k

頁框數:2^32 / 2^12 = 2^20

頁表項大小:32位 / 8 = 4b

頁表總大小:2^20 * 4b = 4mb

一頁頁表包含的頁表項:4k / 4b = 1024

計算公式見linux2.6虛擬記憶體管理

5.為什麼在頁表項結構中記錄的實體地址是20位的?

6.線性位址 -> 實體地址

(1)暫存器cr3 -----> 頁目錄表的基址

(2)線性位址高10位 -----> 頁目錄表的偏移量

(3)(1)+(2)-----> 頁目錄表的某一項 -----> 頁表的基址

(4)線性位址中間10位 -----> 頁表的偏移量

(5)(3)+(4)-----> 頁表中的一項 -----> 頁面的的基址

(6)線性位址中的低12位 -----> 頁面中的偏移量

(7)(5)+(6)-----> 頁面中的某個位置,這個位置的位址就是所求的實體地址

(1)(3)(5)的位址都是指實體地址

14.為了減少位址轉換所需要的匯流排週期數,最近訪問的頁目錄和頁表會存放在tlb中

linux 0 12實驗環境

參考 linux核心完全剖析 基於0.12核心 linux 0.12目錄為修改過的源 其中加入了中文注釋,修改部分 使其能在現在的環境下編譯,並且支援gdb除錯。oslab為實驗目錄,切到oslab目錄下,執行該目錄下的run.sh指令碼即可執行linux0.12作業系統。1.1.1 方式一 可以選...

linux0 12之記憶體管理(1) 整體框架思路

記憶體管理一直是本人比較佩服linus的地方。為此先看linux0.11版本,又看了0.12版本,基本思路一樣,差異性會單獨列出來。本篇部落格只是梳理一下大體思路,具體函式分析,放在後面的部落格。一 從實模式到保護模式談起 1 簡單講實模式,是16位定址的訪問方式,保護模式是32位的訪問方式。在li...

Linux0 12初始化程式

1.main 1 設定系統的根檔案裝置號以及一些記憶體全域性變數 2 所有方面的硬體初始化工作 陷阱門 塊裝置 字元裝置 tty 開機啟動時間 排程程式 硬碟 軟碟機 3 開中斷,切換到任務0中執行 4 切換到使用者模式 5 建立乙個用於init 的子程序 6 迴圈執行pause 2.init 1 ...