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

其中,
仲裁器
多處理器計算機,多個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
