今天開始進入記憶體管理的編寫。按照順序,我們首先要實現的是kmalloc。在arale os中我們用coalition_allocator來進行kmalloc對應的記憶體管理。實際上,coalition_allocator的記憶體管理方法是參照了buddy來的。有興趣的同學可以在網上找到很多關於buddy的記憶體管理文章,這裡就不在多說了。
我們先來看幾個比較關鍵的結構體:
1.已分配記憶體頭:
pmm_type_normal:正常的物理記憶體,它的頭長度就是sizeof(pmm_stamp)typedef struct pmm_stamp
;}pmm_stamp;
|pmm_stamp|memory
這裡是返回給上層的位址(addr),我們可以通過(pmm_stamp *)(addr - sizeof(pmm_stamp))就可以獲取當前分配出記憶體的所有資訊。
其中type主要有下面幾類:
enum pmm_type ;
pmm_type_pmem:4k對齊物理記憶體,這個主要是用來給pgd用的,因為註冊pgd的記憶體必須是4k對齊,所以它的起始位址也必須是4k對齊。如果使用normal,有可能出現未4k對齊的情況。
pmm_type_cache:小記憶體使用。
2.page資訊
ll:主要用來插入free/used佇列typedef struct mm_page
mm_page;
start_pa:記錄實體地址
size:記錄記憶體大小,方便free
cache:之後用來做小記憶體的slab管理
3.memory zone資訊
kmalloc主要是針對normal zone做的記憶體分配。所以我們用nr_area來管理4k/8k/16k/32k等等。而zone_area其實就是乙個包含2個list的structtypedef struct mm_zone
mm_zone;
free_page_list:用來存放當前塊對應的free 記憶體typedef struct zone_area
zone_area;
user_page_list:用來存放當前塊已分配的記憶體
記憶體關鍵的資料結構基本上就是上面這幾個。接下來的處理就是用這些資料結構來管理物理記憶體。具體流程下篇繼續。
arale os github:
自己動手寫作業系統
virtual pc 5.2 下 dos7.1 中 執行.com檔案相關問題 2009 09 09 12 55 剛才在進入dos後,編譯.asm檔案獲得.com檔案,但系統會出現 emm386 unrecoverable privileged operation error n9.press ent...
自己動手寫作業系統
今天看了前兩章,現將重點記錄如下 作業系統的啟動,關鍵點時同bios的介面 這裡有兩個位址很重要,a,0x7c00 510 0x7dfe登記標誌位 兩個byte 0xaa55 b,0x7c00,作業系統載入的目標位址 系統啟動過程 1 bios清零cpu現場 傳送reset訊號 2 cpu從0xf ...
自己動手寫作業系統
2 自己動手寫作業系統 3自己動手寫作業系統 如何呼叫bios中斷 在一般的程式語言中,函式的呼叫是一件非常容易的事情。比如在c語言中,如果有乙個名為display的程式,它帶有兩個引數,其中引數 noofchar表示顯示的字元數,引數attr表示顯示字元的屬性。那麼要呼叫它,只需給出程式的名稱即可...