【學習筆記】深入理解Linux內核第三版 ——第二章 內存尋址


此章節內容主要與硬件層和操作系統層面相關,與高層編程隔離,了解之。

 

 

其中,

仲裁器

多處理器計算機,多個CPU共享同一主存

主存由RAM芯片構成

RAM芯片讀寫操作必須串行執行

所以,每個RAM芯片與總線之間存在仲裁器(硬件電路),當RAM空閑時,允許1CPU操作。

 段選擇符

段選擇符表明選擇的段索引/指示/權限。對應的,段需要有段描述符,來標示不同內存地址段的特征,條目存放於GDT(global descriptor table,1個/CPU)或LDT(local descriptor table,進程單獨設置);

上文提到的段特征,可以認為有幾種常用類型:代碼段、數據段、任務狀態段、描述LDT的段,分別對應不同段描述符;

分段單元轉換方法

硬件電路實現分段單元功能,轉換方法如下:

 Linux中分段

然而,Linux中未充分利用分段機制。使用4段(用戶數據段/用戶代碼段/內核數據段/內核代碼段),段起始地址均為0,從而0*index+offset= offset,線性地址即為邏輯地址。

 

Linux中分頁

四級分頁結構,無需四級時中間兩級目錄僅設置一項兼容,具體位數設置及檢查頁表目錄等由一系列宏實現。

分頁與進程強相關

物理內存布局

初始化階段,內核需要知道哪些物理空間可用,分為

1. [保留] 內核不可用地址(如起始1MB空間留給BIOS/PC體系);

2. [保留] 含有內核代碼;

3. 非保留類,可被動態分配或交換到磁盤。

 典型配置,RAM PC需要128MB保留空間,固定映射關系。

進程頁表(3G/1G)

內核頁表

分為兩階段:

1. 初始化,內核及數據等;128M

2. 剩余可用空間,分頁,使用;1G-128M=896M

RAM可用空間有三種情況,[0,896M](虛擬地址與物理地址一一對應)/[896M,4G](動態重映射)/[4G,++](非連續內存管理)

 

緩存

 除此之外,每個CPU內還存在TLB(translation lookaside buffer),記錄線性地址對應轉換后的物理地址,下次訪問無需轉換,硬件層面無需保證多CPU內的TLB一致性,由OS中內核保證。

任何進程切換時默認活動頁表同時被切換,除了兩種情況,使用相同頁表的2個普通進程/普通進程和內核線程;

多個CPU的TLB一致性,內核線程存在lazy TLB機制。切換到同一頁表的進程及時更新;切換到不同頁表的,自動刷新為新的頁表。

參見http://www.wowotech.net/memory_management/tlb-flush.htm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM