1. 程式人生 > >linux的bootmem記憶體管理

linux的bootmem記憶體管理

核心剛開始啟動的時候如果一步到位寫一個很完善的記憶體管理系統是相當麻煩的。所以linux先建立了一個非常簡單的臨時記憶體管理系統bootmem,有了這個bootmem就可以做簡單的記憶體分配/釋放操作,在bootmem的基礎上再做一個完善的記憶體管理系統就比較簡單了。bootmem的本質就是點陣圖,一個bit代表一個頁框(page frame),頁框分配出去就把相對應的bit置位,頁框回收就把相應的bit復位。linux核心直接管理的記憶體是1G,所以這個點陣圖需要2^32/4096/8=128k位元組,在我另一篇文章裡也提到了。

bootmem的管理結構是bootmem_data,結構如下:

typedef struct
bootmem_data { unsigned long node_boot_start; //它所管理起始記憶體 unsigned long node_low_pfn; //它所管理的最後一個頁框號 void *node_bootmem_map; //點陣圖 unsigned long last_offset; //上次分配的頁框內偏移 unsigned long last_pos; //上次分配的頁框 unsigned long last_success; /*
Previous allocation point. To speed * up searching */ struct list_head list; } bootmem_data_t;

分配記憶體和釋放記憶體也就是對node_bootmem_map的點陣圖操作,比較簡單。值得一提的是last_pos/last_offset,如果發生如下情況:

  1. 第一次申請記憶體:最後一頁記憶體不是整頁的,也就是說剩下了部分記憶體,
  2. 第二次申請記憶體:第一次剩下的記憶體大小滿足這次申請,這種情況會直接使用第一次分配剩下的記憶體。

這樣可能會造成一個問題free_bootmem釋放第一次申請的記憶體會把第二次申請的記憶體也釋放掉。為了避免這種情況linux核心只在初始化記憶體的時候使用了free_bootmem,其他地方都沒用過這個函式,也就是說bootmem只申請不釋放。

free_all_bootmem釋放的不是已經申請的記憶體,而是bootmem沒分配出去的記憶體,呼叫free_all_bootmem以後bootmem就把自身也釋放掉了,不可用了,之後會用更高階的記憶體管理系統。