Linux核心–核心地址空間分布和進程地址空間

來源:互聯網
上載者:User

核心地址空間分布

直接映射區:線性空間中從3G開始最大896M的區間,為直接記憶體映射區,該地區的線性地址和物理地址存線上性轉換關係:線性地址=3G+物理地址。

動態記憶體映射區:該地區由核心功能vmalloc來分配,特點是:線性空間連續,但是對應的物理空間不一定連續。vmalloc分配的線性地址所對應的物理頁可能處於低端記憶體,也可能處於高端記憶體。

永久記憶體映射區:該地區可訪問高端記憶體。存取方法是使用alloc_page(_GFP_HIGHMEM)分配高端記憶體頁或者使用kmap函數將分配到的高端記憶體映射到該地區。

固定映射區:該地區和4G的頂端只有4k的隔離帶,其每個地址項都服務於特定的用途,如ACPI_BASE等。

進程的地址空間

    linux採用虛擬記憶體管理技術,每一個進程都有一個3G大小的獨立的進程地址空間,這個地址空間就是使用者空間。每個進程的使用者空間都是完全獨立、互補相干的。進程訪問核心空間的方式:系統調用和中斷。
    建立進程等進程相關操作都需要分配記憶體給進程。這時進程申請和獲得的不是物理地址,僅僅是虛擬位址。
實際的實體記憶體只有當進程真的去訪問新擷取的虛擬位址時,才會由“請頁機制”產生“缺頁”異常,從而進入分配實際葉框的程式。該異常是虛擬記憶體機制賴以存在的基本保證---它會告訴核心去為進程分配物理頁,並建立對應的頁表,這之後虛擬位址才實實在在的映射到了物理地址上。

 

vmalloc和kmalloc區別
1,kmalloc對應於kfree,分配的記憶體處於3GB~high_memory之間,這段核心空間與實體記憶體的映射一一對應,可以分配連續的實體記憶體;
vmalloc對應於vfree,分配的記憶體在VMALLOC_START~4GB之間,分配連續的虛擬記憶體,但是物理上不一定連續。

2,vmalloc() 分配的物理地址無需連續,而kmalloc() 確保頁在物理上是連續的
3,kmalloc分配記憶體是基於slab,因此slab的一些特性包括著色,對齊等都具備,效能較好。物理地址和邏輯地址都是連續的。
4,最主要的區別是分配大小的問題,比如你需要28個位元組,那一定用KMALLOC,如果用VMALLOC,分配不多次機器就罷工了。
    儘管僅僅在某些情況下才需要物理上連續的記憶體塊,但是,很多核心代碼都調用kmalloc(),而不是用vmalloc()獲得記憶體。這主要是出於效能的考慮。vmalloc()函數為了把物理上不連續的頁面轉換為虛擬位址空間上連續的頁,必須專門建立頁表項。還有,通過 vmalloc()獲得的頁必須一個一個的進行映射(因為它們物理上不是連續的),這就會導致比直接記憶體映射大得多的緩衝區重新整理。因為這些原因,vmalloc()僅在絕對必要時才會使用——典型的就是為了獲得大塊記憶體時,例如,當模組被動態插入到核心中時,就把模組裝載到由vmalloc()分配的記憶體上。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.