天天看點

作業系統原理:虛拟位址

The Memory Hierarchy

存儲系統是有層次的,從快到慢依次是:CPU寄存器、靜态SRAM、動态DRAM、磁盤。如下圖:

作業系統原理:虛拟位址

如 Inter Core i7 存儲結構如下:

作業系統原理:虛拟位址

i7的存儲架構支援48-bit虛拟位址,52-bit實體位址. Page Size啟動時可配置 4KB or 4MB, Linux使用4KB,4-level page table hierarchy。

Segmentation and Paging

在CPU保護模式下,程序使用虛拟位址,這也給每個程序一個大的、一緻的私有的位址空間。虛拟位址也簡化了程式的連結與加載,代碼段、資料段、共享庫總是從相同的虛拟位址開始,執行程式時,execve()調用會使核心配置設定virtual pages給程序,按page從磁盤拷貝代碼段資料段到記憶體。

位址翻譯分段與分頁相結合,linux更加關注的是分頁機制。Linux分段機制使用的很有限,RISC架構的CPU就不支援分段機制,并且分段機制也沒有分頁機制更靈活。

邏輯位址

-->

[Segmentation]

-->

線性位址(虛拟位址)

-->

[Paging]

-->

實體位址

Linux分段機制使用的很有限,邏輯位址與線性位址是一緻的。

linux下分段機制使用的很有限,僅僅有四種段:使用者代碼段、使用者資料段、核心代碼段、核心資料段。相應的段描述符由宏

__USER_CS

__USER_DS

__KERNEL_CS

,和

__KERNEL_DS

分别定義,且所有段都從0x00000000開始。

Linux使用分頁機制,每個程序都有自己的頁表,任務切換就會有頁表切換,x86下通過修改控制寄存器CR3完成,CR3控制寄存器是PDBR(Page-Directory Base address Register),加載程序頁表通過拷貝

mm_stuct->pgd

CR3

寄存器完成。

頁表可以把虛拟位址頁映射為實體位址頁,x86 32位系統的機制大緻如下(MIT xv6):

作業系統原理:虛拟位址

為了加快速度,位址翻譯有專門的硬體MMU(Memory Management Unit),MMU中包含了一個小的PTE(Page Table Entry)緩存TLB(Translation Lookaside Buffer), 大緻工作原理如下圖:

作業系統原理:虛拟位址

舉個多級頁表的例子,Inter i7頁表翻譯,采用了4級頁表,如下圖:

作業系統原理:虛拟位址

從作業系統的實作看:

作業系統原理:虛拟位址

還有很多有意思的細節可以看後面的參考資料。

Reference

Operating Systems: Three Easy Pieces

Xv6, a simple Unix-like teaching operating system

Computer Systems: A Programmer’s Perspective, 3/E (CS:APP3e)

Professional Linux Kernel Architecture

Understanding the Linux® Virtual Memory Manager

Computer Systems Organization

繼續閱讀