linux 記憶體管理之bootmem allocator

來源:互聯網
上載者:User
bootmem allocator是在頁表和buddy演算法可用之前的一個簡單的記憶體管理機制,是linux核心早期啟動過程中的一個過程,也是其他記憶體管理演算法的祖先,其實現方法比較簡單,我們只需瞭解其主要功能和工作原理即可,感覺不必深究。
問題一: bootmem allocator管理的記憶體範圍
pfn=0 到 pfn=max_low_pfn, 即低端常規記憶體,通常指小於896M的記憶體。
問題二:bootmem allocator 工作原理
採用簡單的映射關係:每 1 bit對應實體記憶體的一個page frame(頁框)。因此,首先要申請一塊記憶體作為映射的位元影像,位元影像大小= max_low_pfn/8個位元組。
1 先把位元影像中所有bit置為1,表示對應的page frame不可用
2 根據e820檢測到的記憶體資訊(e820.map[]),將類型為E820_RAM的page frame對應的位元影像中的位置為 0,
表示對應的page frame為空白閑狀態。
3 將一部分應經被佔用的page frame標記為1,表示為停用狀態。主要包括:
(1) 第一個page frame, 這個page frame有特殊的用途,如BIOS使用,smp某些操作。
(2) 保護模式核心,臨時頁表,bootmem allocator的位元影像表
(3) 其他一些特殊的page frame,如EBDA region,ACPI等等
至此,bootmem allocator的初始化工作已經完成。
問題三:bootmem allocator的功能
1 在buddy演算法之前,對linux核心的記憶體使用量進行管理
2 初始化node, zone, page體系,為buddy演算法做準備
3 建立buddy演算法的管理結構,主要是將空閑page frame納入buddy演算法的管理體系

重點講一下node, zone, page體繫結構的建立過程: zone_sizes_init函數先確定不同類型zone的範圍,然後在free_area_init_node初始化pglist_data(node),在x86體繫結構下只有一個node即contig_page_data,接著初始化這個node中的zone, 再接著計算這個Node有多少個頁面,最後向bootmem allocator申請這個多的page frame, 根據page frame來初始化相應數量的page 結構,但是這裡僅僅是把所有的page的狀態設定為保留,直到最後,核心會在函數free_all_bootmem_core中根據bootmem allocator位元影像中標識的page frame的狀態來設定對應的page結構的狀態。

完成了上面的node, zone,page體繫結構的初始化後,buddy演算法已經可以正確運行了。因為buddy演算法主要使用了一個資料結構struct free_area free_area[MAX_ORDER], 這個資料結構正是在free_all_bootmem_core中每次調用__free_pages_bootmem(page, order)對每個頁面進行釋放,來完成對buddy系統的初始化的。

有關buddy演算法的內容,參見《buddy系統的初始化》。

相關文章

聯繫我們

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