深度分析Linux內核高端內存分析.doc_第1頁
深度分析Linux內核高端內存分析.doc_第2頁
深度分析Linux內核高端內存分析.doc_第3頁
深度分析Linux內核高端內存分析.doc_第4頁
深度分析Linux內核高端內存分析.doc_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Linux內核高端內存1. Linux內核地址映射模型x86 CPU采用了段頁式地址映射模型。進程代碼中的地址為邏輯地址,經過段頁式地址映射后,才真正訪問物理內存。段頁式機制如下圖。2.Linux內核地址空間劃分通常32位Linux內核地址空間劃分03G為用戶空間,34G為內核空間。注意這里是32位內核地址空間劃分,64位內核地址空間劃分是不同的。3.Linux內核高端內存的由來當內核模塊代碼或線程訪問內存時,代碼中的內存地址都為邏輯地址,而對應到真正的物理內存地址,需要地址一對一的映射,如邏輯地址0xc0000003對應的物理地址為0x3,0xc0000004對應的物理地址為0x4, ,邏輯地址與物理地址對應的關系為物理地址 = 邏輯地址 0xC0000000邏輯地址物理內存地址0xc00000000x00xc00000010x10xc00000020x20xc00000030x30xe00000000x200000000xffffffff0x40000000 ?假設按照上述簡單的地址映射關系,那么內核邏輯地址空間訪問為0xc0000000 0xffffffff,那么對應的物理內存范圍就為0x0 0x40000000,即只能訪問1G物理內存。若機器中安裝8G物理內存,那么內核就只能訪問前1G物理內存,后面7G物理內存將會無法訪問,因為內核的地址空間已經全部映射到物理內存地址范圍0x0 0x40000000。即使安裝了8G物理內存,那么物理地址為0x40000001的內存,內核該怎么去訪問呢?代碼中必須要有內存邏輯地址的,0xc0000000 0xffffffff的地址空間已經被用完了,所以無法訪問物理地址0x40000000以后的內存。顯然不能將內核地址空間0xc0000000 0xfffffff全部用來簡單的地址映射。因此x86架構中將內核地址空間劃分三部分:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。ZONE_HIGHMEM即為高端內存,這就是內存高端內存概念的由來。在x86結構中,三種類型的區(qū)域如下:ZONE_DMA 內存開始的16MBZONE_NORMAL 16MB896MBZONE_HIGHMEM 896MB 結束4.Linux內核高端內存的理解前面我們解釋了高端內存的由來。 Linux將內核地址空間劃分為三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高端內存HIGH_MEM地址空間范圍為0xF8000000 0xFFFFFFFF(896MB1024MB)。那么如內核是如何借助128MB高端內存地址空間是如何實現(xiàn)訪問可以所有物理內存?當內核想訪問高于896MB物理地址內存時,從0xF8000000 0xFFFFFFFF地址空間范圍內找一段相應大小空閑的邏輯地址空間,借用一會。借用這段邏輯地址空間,建立映射到想訪問的那段物理內存(即填充內核PTE頁面表),臨時用一會,用完后歸還。這樣別人也可以借用這段地址空間訪問其他物理內存,實現(xiàn)了使用有限的地址空間,訪問所有所有物理內存。如下圖。例如內核想訪問2G開始的一段大小為1MB的物理內存,即物理地址范圍為0x80000000 0x800FFFFF。訪問之前先找到一段1MB大小的空閑地址空間,假設找到的空閑地址空間為0xF8700000 0xF87FFFFF,用這1MB的邏輯地址空間映射到物理地址空間0x80000000 0x800FFFFF的內存。映射關系如下:邏輯地址物理內存地址0xF87000000x800000000xF87000010x800000010xF87000020x800000020xF87FFFFF0x800FFFFF當內核訪問完0x80000000 0x800FFFFF物理內存后,就將0xF8700000 0xF87FFFFF內核線性空間釋放。這樣其他進程或代碼也可以使用0xF8700000 0xF87FFFFF這段地址訪問其他物理內存。從上面的描述,我們可以知道高端內存的最基本思想:借一段地址空間,建立臨時地址映射,用完后釋放,達到這段地址空間可以循環(huán)使用,訪問所有物理內存??吹竭@里,不禁有人會問:萬一有內核進程或模塊一直占用某段邏輯地址空間不釋放,怎么辦?若真的出現(xiàn)的這種情況,則內核的高端內存地址空間越來越緊張,若都被占用不釋放,則沒有建立映射到物理內存都無法訪問了。在香港尖沙咀有些寫字樓,洗手間很少且有門鎖的??蛻粢ハ词珠g的話,可以向前臺拿鑰匙,方便完后,把鑰匙歸還到前臺。這樣雖然只有一個洗手間,但可以滿足所有客戶去洗手間的需求。要是某個客戶一直占用洗手間、鑰匙不歸還,那么其他客戶都無法上洗手間了。Linux內核高端內存管理的思想類似。5.Linux內核高端內存的劃分內核將高端內存劃分為3部分:VMALLOC_STARTVMALLOC_END、KMAP_BASEFIXADDR_START和FIXADDR_START4G。對于高端內存,可以通過 alloc_page() 或者其它函數獲得對應的 page,但是要想訪問實際物理內存,還得把 page 轉為線性地址才行(為什么?想想 MMU 是如何訪問物理內存的),也就是說,我們需要為高端內存對應的 page 找一個線性空間,這個過程稱為高端內存映射。對應高端內存的3部分,高端內存映射有三種方式:映射到”內核動態(tài)映射空間”(noncontiguous memory allocation)這種方式很簡單,因為通過 vmalloc() ,在”內核動態(tài)映射空間”申請內存的時候,就可能從高端內存獲得頁面(參看 vmalloc 的實現(xiàn)),因此說高端內存有可能映射到”內核動態(tài)映射空間”中。持久內核映射(permanent kernel mapping)如果是通過 alloc_page() 獲得了高端內存對應的 page,如何給它找個線性空間?內核專門為此留出一塊線性空間,從 PKMAP_BASE 到 FIXADDR_START ,用于映射高端內存。在 2.6內核上,這個地址范圍是 4G-8M 到 4G-4M 之間。這個空間起叫”內核永久映射空間”或者”永久內核映射空間”。這個空間和其它空間使用同樣的頁目錄表,對于內核來說,就是 swapper_pg_dir,對普通進程來說,通過 CR3 寄存器指向。通常情況下,這個空間是 4M 大小,因此僅僅需要一個頁表即可,內核通過來 pkmap_page_table 尋找這個頁表。通過 kmap(),可以把一個 page 映射到這個空間來。由于這個空間是 4M 大小,最多能同時映射 1024 個 page。因此,對于不使用的的 page,及應該時從這個空間釋放掉(也就是解除映射關系),通過 kunmap() ,可以把一個 page 對應的線性地址從這個空間釋放出來。臨時映射(temporary kernel mapping)內核在 FIXADDR_START 到 FIXADDR_TOP 之間保留了一些線性空間用于特殊需求。這個空間稱為”固定映射空間”在這個空間中,有一部分用于高端內存的臨時映射。這塊空間具有如下特點:(1)每個 CPU 占用一塊空間(2)在每個 CPU 占用的那塊空間中,又分為多個小空間,每個小空間大小是 1 個 page,每個小空間用于一個目的,這些目的定義在 kmap_types.h 中的 km_type 中。當要進行一次臨時映射的時候,需要指定映射的目的,根據映射目的,可以找到對應的小空間,然后把這個空間的地址作為映射地址。這意味著一次臨時映射會導致以前的映射被覆蓋。通過 kmap_atomic() 可實現(xiàn)臨時映射。6.常見問題:1、用戶空間(進程)是否有高端內存概念?用戶進程沒有高端內存概念。只有在內核空間才存在高端內存。用戶進程最多只可以訪問3G物理內存,而內核進程可以訪問所有物理內存。2、64位內核中有高端內存嗎?目前現(xiàn)實中,64位Linux內核不存在高端內存,因為64位內核可以支持超過512GB內存。若機器安裝的物理內存超過內核地址空間范圍,就會存在高端內存。3、用戶進程能訪問多少物理內存?內核代碼能訪問多少物理內存?32位系統(tǒng)用戶進程最大可以訪問3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論