Linux在x86-64下的虛擬內存佈局

普通x86架構下的Linux內存佈局你們應該都很清楚了. 物理內存分爲ZONE_DMA, ZONE_NORMAL和ZONE_HIGHMEM三個區, 虛擬內存則通常是0-3G爲用戶空間, 3G-(4G-1)爲內核空間. 那麼, x86-64架構下呢?架構

有多大

首先, 目前大部分的操做系統和應用程序並不須要16EB( 2^64 )如此巨大的地址空間, 實現64位長的地址只會增長系統的複雜度和地址轉換的成本, 帶不來任何好處. 因此目前的x86-64架構CPU都遵循AMD的Canonical form, 即只有虛擬地址的最低48位纔會在地址轉換時被使用, 且任何虛擬地址的48位至63位必須與47位一致(sign extension). 也就是說, 總的虛擬地址空間爲256TB( 2^48 ).佈局

如何佈局

而後, 在這256TB的虛擬內存空間中, 0000000000000000 - 00007fffffffffff(128TB)爲用戶空間, ffff800000000000 - ffffffffffffffff(128TB)爲內核空間. 這裏須要注意的是, 內核空間中有不少空洞, 越過第一個空洞後, ffff880000000000 - ffffc7ffffffffff(64TB)纔是直接映射物理內存的區域, 也就是說默認的PAGE_OFFSET爲ffff880000000000. 從這裏咱們也能夠看出, 這麼大的直接映射區域足夠映射全部的物理內存, 因此目前x86-64架構下是不存在高端內存, 也就是ZONE_HIGHMEM這個區域的(參考這篇).spa

如何映射

64位尋址模式是PAE的擴展. 頁大小支持PAE所支持的4K和2M, 以及獨有的1G. 頁表分爲4級, 不但擴展了PAE的Page-Directory Pointer Table, 還添加了一個Page-Map Level 4(PML4)映射表. 巧妙之處在於, 這個表不但能夠經過擴展來支持之後的完整64位地址空間, 也兼容頗有可能出現的第5級頁表.操作系統

相關文章
相關標籤/搜索