記憶體位址
三種記憶體位址:1)邏輯位址(機器指令中操作數或指令的位址) 分段單元 2)線性位址(虛拟位址)分頁單元
3)實體位址(用于記憶體晶片級記憶體單元尋址
多CPU時,共享同一記憶體,RAM晶片由獨立的CPU并發通路; 由記憶體仲裁器保證RAM的讀寫的串行執行
Linux中的分段
80X86才使用分段(把程式劃分為邏輯相關的實體),Linux更喜歡使用分頁(當所有程序使用相同的段Register值時,它們共享同樣的一組線性位址,這樣記憶體管理簡單;
RISC對分段的支援有限.).
兩者都劃分程序的實體位址空間:分段可以給每一個程序配置設定不同的線性位址空間,而分頁可以把同一線性位址空間映射到不同的實體空間.
段選擇符由宏__USER/KERNEL_CS/DS定義.對核心代碼尋址,吧__KERNEL_CS宏産生的值裝入cs寄存器即可.這樣執行指令時,隻需指定邏輯位址的偏移部分,段選擇符已經隐含在寄存器内.
所有段(核心/使用者的資料/代碼段)的Base=oX0000000,即邏輯位址(的偏移量字段值)=線性位址(的值).所有程序使用相同的邏輯位址.
每個CPU一個GDT,會插入未使用的項使得經常一起通路的描述符能夠處于同一32位元組的硬體Cache中;
大多數使用者态APP不适用局部描述符表,是以定義了一個預設的LDT供程序共享,同時程序可以建立自己的LDT.
硬體中的分頁
分頁單元的一個關鍵任務就是把所請求的通路類型與現行位址的通路權限相比較,如果通路無效,産生一個缺頁異常.
頁: 線性位址被分為固定長為機關的頁,頁内連續的線性位址被映射到連續的實體位址中,核心僅需為頁指定實體位址和存取權限,提高了效率.
頁框: 相應地,把RAM也分為固定長度的頁框(實體頁),一個頁框包含一個頁(長度一緻).
頁表: 把線性位址映射到實體位址的資料結構.存放于主存中
CPU通過設定cr0寄存器的PG=0标志啟動線性位址到實體位址的翻譯
正常分頁
頁Size=4KB.進而32位的線性位址= Directory(10b:目錄)+ Table(10b:頁表)+
Offset(低12b:偏移量)
轉換分為兩步,每一步基于一種轉換表.使用二級模式為了減少每個程序頁所需的RAM的數量.二級模式隻為程序實際使用的那些虛拟記憶體區請求頁表來減少記憶體容量.
每個活動程序都有一個頁目錄,但是僅在程序實際需要一個頁表時才給該頁表配置設定RAM.
擴充分頁:
頁框Size=4MB.用于把大段連續的線性位址轉換成相應的實體位址.不适用中間頁表.32b線性位址=Directory(10)+Offset(22)
64位系統中的分頁: 使用了額外的分頁基本.不然的話每個程序的頁目錄和頁表含有的表項太多.
實體位址擴充(PAE)分頁機制
CPU所支援的RAM容量受位址總線上的管腳數限制,将該數從32改為36即可為2(36)=64GB.
PAE機制:1)64GB的RAM分為2(24)個頁框,頁表項的實體位址字段從20變為24位.是以PAE頁表項=12個标志位+24個實體位址位=36,頁表項Size=64(>32).是以一個4KB的頁表包含512個頁表而非1024個.
2)引入頁目錄指針表(PDPT)的級别,由4個64位表項組成.
3)cr3控制寄存器含有一個27位的PDPT的基位址,因PDPT在RAM的前4GB中,并在32位元組的倍數上對其,是以27可以表示其基位址
解釋32位線性位址(4KB/2MB的頁):1)cr3指向PDPT; 2)31-30指向PDPT中4個項之一;
3)29-21指向頁目錄中512個項中的一個;
4)20-12指向頁表512項之一+11-0為4KB頁内Offset/20-0為2MB頁中Offset.
PAE的主要問題是線性位址仍是32位.并沒有擴大程序的線性位址空間,而隻處理實體位址.核心程式設計人員必須用同一線性位址映射不同的RAM區.
由于隻有核心才能修改程序的頁表,是以使用者态下的程序不能使用>4GB的實體位址;
但核心能夠使用更多的實體位址進而增加了系統中的程序數量.
硬體Cache
由行(幾十個連續的位元組)組成.其位于分頁單元和主記憶體之間.由硬體Cache記憶體(真正的行)+Cache控制器(表項資料.一個表項(标簽(辨識行映射的記憶體單元)+标志)對應一個行)組成
類型: 直接映射/充分關聯/N-路組關聯,來将主存中的一個行,關聯到Cache中的一個行.
寫政策:通寫(同時寫RAM和行,一般為了效率,關閉Cache;
回寫:隻寫Cache的行,當CPU沒有命中時,Cache的行被寫回到記憶體中.
一個CPU一個Cache,需要使用高速緩存偵聽(snooping)來同步他們的内容.
Pentium CPU可以為每一個頁框指定Cache政策,Linux忽略之,使得所有的頁框都啟用Cache,且回寫政策.
轉換後援緩沖器(TLB):
加速線性位址的轉化.實體位址經過一次轉化後放于TLB表項内.其每個CPU都有一個,但是不必同步,因為運作在現有CPU上的程序可以使同一線性位址于不同的實體位址關聯.
Linux中的分頁
組成:頁全局目錄+頁上級目錄+頁中間目錄+頁表. 并在32位系統中将頁中間目錄和頁上級目标級别的位設定為0來對應.
實體記憶體布局: Linux核心安裝于RAM的第二個MB開始.原因:頁框0由BIOS使用;
640KB~1MB為洞(實體位址被保留但不能被使用).布局=核心代碼+已初始化過的Data+未初始化過的Data.
程序頁表:線性位址空間,使用者态 < oXc000000, 核心态 > oXc0000000.
核心頁表