關於Linux記憶體管理的認識

來源:互聯網
上載者:User

  我們都知道,核心把線性地址(大多數情況也叫虛擬位址)分為三個部分:實體記憶體映射區,VMALLOC映射區以及固定映射地址區。這裡主要討論前兩種。

  所謂的實體記憶體映射區是指與實體記憶體一一映射的地區。舉個例子來說,如果系統有實體記憶體512M,那麼從0xc0000000至0xc00000000+512M的線性地址就屬於實體記憶體映射區。這塊線性地址在系統初始化時就與實體記憶體建立起一一對應的關係。這裡的一一映射是指物理地址和線性地址就差一個位移量0xc0000000,函數__pa()就是直接把線性地址減去0xc0000000得到物理地址。所以該函數應用範圍也就局限於物理地址映射區。對另兩個地址區進行__pa()是錯誤的。道理很簡單,物理地址都沒那麼大。

  VMALLOC映射區的特點是連續的線性地址,其物理地址不一定連續。這種映射特點和使用者地址空間的映射方式是一樣的。而前面講的實體記憶體映射區,線性地址和物理地址顯然都是連續的。當然了,最後的映射肯定是指線性地址和物理地址之間的映射。所以這部分的線性地址最終也需映射到實體記憶體中。這就會和實體記憶體映射區產生衝突:因為所有的實體記憶體在實體記憶體映射區已經有了一個線性地址了。但是我們知道,實體記憶體並不是每時每刻都在使用的,也就是說雖然它已經映射了,但是還沒有人使用它。那麼我們可以在VMALLOC映射區中先映射到那些沒使用的記憶體並鎖住。這樣這些記憶體就不會再被分配作為其他用途。所以雖然映射有衝突,但是沒有兩個線性地址在同時使用。

  因為VMALLOC映射區的線性地址和物理地址沒有固定的映射關係,我們只能通過尋找頁表來找到對應的物理頁框。值得一提的是,物理頁框(struct page結構體)的vitual欄位仍然存放的是實體記憶體映射區的線性地址,也就是說如果對該物理地址進行__page_to_vir()運算後,所得的線性地址不是VMALLOC映射區的線性地址。

     Linux好學堂, www.linuxhao.com,提供Linux視頻教程,Linux培訓教程,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.