Linux的地址空間

來源:互聯網
上載者:User

在支援MMU的系統中,當系統做完硬體初始化後就使能MMU功能,這樣整個系統就運行在虛擬儲存空間中,實現虛擬儲存空間到實體儲存體空間映射功能的是處理器的MMU,而虛擬儲存空間與5路儲存空間的映射關係則是由Linux核心來管理的。32位系統中實體儲存體空間佔4GB空間,虛擬儲存空間同樣佔4GB空間,Linux把物理空間中實際存在的遠遠小於4GB的記憶體空間映射到整個4GB虛擬儲存空間中除映射I/O空間之外的全部空間,所以虛擬記憶體空間遠遠大於實體記憶體空間,這就說同一塊實體記憶體可能映射到多處虛擬記憶體地址空間上,這正是Linux記憶體管理職責所在。圖18-5列出了Linux核心中虛擬記憶體空間的一般布局(其實I/O空間也在其中,通常佔用高端記憶體空間,在此未標出)。

 

 

圖18-5  Linux系統虛擬記憶體空間一般布局

 

說明:

 

1)線性地址空間:是指Linux系統中從0x00000000到0xFFFFFFFF整個4GB虛擬儲存空間。

 

2)核心空間:核心空間表示運行在處理器最進階別的超級使用者模式(supervisor mode)下的代碼或資料,核心空間佔用從0xC0000000到0xFFFFFFFF的1GB線性地址空間,核心線性地址空間由所有進程共用,但只有運行在核心態的進程才能訪問,使用者進程可以通過系統調用切換到核心態訪問核心空間,進程運行在核心態時所產生的地址都屬於核心空間。

 

3)使用者空間:使用者空間佔用從0x00000000到0xBFFFFFFF共3GB的線性地址空間,每個進程都有一個獨立的3GB使用者空間,所以使用者空間由每個進程專屬,但是核心線程沒有使用者空間,因為它不產生使用者空間地址。另外子進程共用(繼承)父進程的使用者空間只是使用與父進程相同的使用者線性地址到實體記憶體地址的映射關係,而不是共用父進程使用者空間。運行在使用者態和核心態的進程都可以訪問使用者空間。

 

4)核心邏輯地址空間:是指從PAGE_OFFSET(3G)到high_memory(實體記憶體的大小,最大896)之間的線性地址空間,是系統實體記憶體映射區,它映射了全部或部分(如果系統包含高端記憶體)實體記憶體。核心邏輯地址空間與圖18-4中的系統RAM記憶體物理地址空間是一一對應的(包括記憶體孔洞也是一一對應的),核心邏輯地址空間中的地址與RAM記憶體物理地址空間中對應的地址只差一個固定位移量(3G),如果RAM記憶體物理地址空間從0x00000000地址編址,那麼這個位移量就是PAGE_OFFSET。

 

5)低端記憶體:核心邏輯地址空間所映射實體記憶體就是低端記憶體(實際實體記憶體的大小,但是小於896),低端記憶體在Linux線性地址空間中始終有永久的一一對應的核心邏輯地址,系統初始化過程中將低端記憶體永久映射到了核心邏輯地址空間,為低端記憶體建立了虛擬映射頁表。低端記憶體內實體記憶體的物理地址與線性地址之間的轉換可以通過__pa(x)和__va(x)兩個宏來進行,#define
__pa(x) ((unsigned long)(x)-PAGE_OFFSET) __pa(x)將核心邏輯地址空間的地址x轉換成對應的物理地址,相當於__virt_to_phys((unsigned long)(x)),__va(x)則相反,把低端實體記憶體空間的地址轉換成對應的核心邏輯地址,相當於((void
*)__phys_to_virt((unsigned long)(x)))。

 

6)高端記憶體:低端記憶體位址之上的實體記憶體是高端記憶體(實體記憶體896之上),高端記憶體在Linux線性地址空間中沒有沒有固定的一一對應的核心邏輯地址,系統初始化過程中不會為這些記憶體建立映射頁表將其固定映射到Linux線性地址空間,而是需要使用高端記憶體的時候才為分配的高端實體記憶體建立映射頁表,使其能夠被核心使用,否則不能被使用。高端記憶體的物理地址於線性地址之間的轉換不能使用上面的__pa(x)和__va(x)宏。

 

7)高端記憶體概念的由來:如上所述,Linux將4GB的線性地址空間劃分成兩部分,從0x00000000到0xBFFFFFFF共3GB空間作為使用者空間由使用者進程獨佔,這部分線性地址空間並沒有固定映射到實體記憶體空間上;從0xC0000000到0xFFFFFFFF的第4GB線性地址空間作為核心空間,在嵌入式系統中,這部分線性地址空間除了映射實體記憶體空間之外還要映射處理器內部外設寄存器空間等I/O空間。0xC0000000~high_memory之間的核心邏輯地址空間專用來固定映射系統中的實體記憶體,也就是說0xC0000000~high_memory之間空間大小與系統的實體記憶體空間大小是相同的(當然在配置了CONFIG_DISCONTIGMEMD選項的非連續記憶體系統中,核心邏輯地址空間和實體記憶體空間一樣可能存在記憶體孔洞),如果系統中的實體記憶體容量遠小於1GB,那麼核心線性地址空間中核心邏輯地址空間之上的high_memory~0xFFFFFFFF之間還有足夠的空間來固定映射一些I/O空間。可是,如果系統中的實體記憶體容量(包括記憶體孔洞)大於1GB,那麼就沒有足夠的核心線性地址空間來固定映射系統全部實體記憶體以及一些I/O空間了,為瞭解決這個問題,在x86處理器平台設定了一個經驗值:896MB,就是說,如果系統中的實體記憶體(包括記憶體孔洞)大於896MB,那麼將前896MB實體記憶體固定映射到核心邏輯地址空間0xC0000000~0xC0000000+896MB(=high_memory)上,而896MB之後的實體記憶體則不建立到核心線性地址空間的固定映射,這部分記憶體就叫高端實體記憶體。此時核心線性地址空間high_memory~0xFFFFFFFF之間的128MB空間就稱為高端記憶體線性地址空間,用來映射高端實體記憶體和I/O空間。896MB是x86處理器平台的經驗值,留了128MB線性地址空間來映射高端記憶體以及I/O地址空間,在嵌入式系統中可以根據具體情況修改這個閾值,比如,MIPS中將這個值設定為0x20000000B(512MB),那麼只有當系統中的實體記憶體空間容量大於0x20000000B時,核心才需要配置CONFIG_HIGHMEM選項,使能核心對高端記憶體的分配和映射功能。什麼情況需要劃分出高端實體記憶體以及高端實體記憶體閾值的設定原則見上面的記憶體頁區(zone)概念說明。

 

8)高端線性地址空間:從high_memory到0xFFFFFFFF之間的線性地址空間屬於高端線性地址空間,其中VMALLOC_START~VMALLOC_END之間線性地址:(1)被vmalloc()函數用來分配物理上不連續但線性地址空間連續的高端實體記憶體,或者(2)被vmap()函數用來映射高端或低端實體記憶體,或者(3)由ioremap()函數來重新對應I/O物理空間。其中PKMAP_BASE開始的LAST_PKMAP(一般等於1024)頁線性地址空間:被kmap()函數用來永久映射高端實體記憶體。FIXADDR_START開始的KM_TYPE_NR*NR_CPUS頁線性地址空間:被kmap_atomic()函數用來臨時映射高端實體記憶體,其他未用高端線性地址空間可以用來在系統初始化期間永久映射I/O地址空間。

 

Linux 2.6.10核心中的ARM處理器平台部分沒有對高端記憶體的支援,圖18-6和圖18-7分別列出了SA1100和IXP4XX處理器平台的Linux線性地址空間布局。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.