linux記憶體管理閱讀心得

來源:互聯網
上載者:User

一、Linux記憶體結構分為:node(節點),zone(地區),page(頁框描述符)

node ----{  zone-----{ page

                  ……   

{ zone-----{page

二、映射高端記憶體的方法:

永久映射(permanent kernel mapping)和暫時映射(temporary kernel mapping),以及不連續記憶體申請(noncontiguous memory )

1)永久映射:

使用核心中專門儲存的一個頁表來實現,相當於是建立頁表映射,因為涉及到操作頁表有可能休眠

void *kmap(struct page * page);

用法:

struct page * page = alloc_pages(GFP_HIGHMEM,1);

int * vaddr = kmap(page);

2)臨時映射:

使用核心中專門儲存的一個頁表項(page table entry)來實現,相當於是建立頁表映射,不會導致休眠

void *kmap_atomic(struct page * page);

用法:

struct page * page = alloc_pages(GFP_HIGHMEM,1);

int * vaddr = kmap_atomic(page);

三、記憶體地區管理

zone和buddy演算法解決了申請頁框時的問題:硬體限制和記憶體片段。

而在實際的核心編程中最常碰到的是各種不同size資料結構mem request的申請和釋放,要解決這種類型記憶體請求的效率和記憶體片段問題,

就需要用到cache和slab,原因有:

1)相同size記憶體的申請和釋放相當常見,為了避免核心疲於應付這些工作,核心提供了一個方法:基於cache來建立slab系統,每個slab

對應相應的記憶體單元size,申請到來時及時滿足,釋放時進行軟體回收,這樣就避免了頻繁做頁框動作。

2)為瞭解決記憶體片段問題,

四、非連續記憶體區的管理

非連續記憶體區是指線性地址連續,物理地址不連續的vmalloc地區,該地區用於映射超過896MB的實體記憶體頁框,

通常只適用於X86架構,ARM等嵌入式架構很少會用到這麼大的記憶體量,因此在ARM架構下kmap,永久核心映射,

固定核心映射都用不到。

其實vmalloc的實現方法就是通過alloc_pages來申請數個頁框,當然這些頁框位於HIGHMEM,來滿足申請的記憶體大小,

然後修改頁表,建立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.