自己動手寫作業系統(六)

2021-08-07 20:34:27 字數 1245 閱讀 8760

今天開始進入記憶體管理的編寫。按照順序,我們首先要實現的是kmalloc。在arale os中我們用coalition_allocator來進行kmalloc對應的記憶體管理。實際上,coalition_allocator的記憶體管理方法是參照了buddy來的。有興趣的同學可以在網上找到很多關於buddy的記憶體管理文章,這裡就不在多說了。

我們先來看幾個比較關鍵的結構體:

1.已分配記憶體頭:    

typedef struct pmm_stamp

;}pmm_stamp;

|pmm_stamp|memory

這裡是返回給上層的位址(addr),我們可以通過(pmm_stamp *)(addr - sizeof(pmm_stamp))就可以獲取當前分配出記憶體的所有資訊。

其中type主要有下面幾類:

enum pmm_type ;

pmm_type_normal:正常的物理記憶體,它的頭長度就是sizeof(pmm_stamp)

pmm_type_pmem:4k對齊物理記憶體,這個主要是用來給pgd用的,因為註冊pgd的記憶體必須是4k對齊,所以它的起始位址也必須是4k對齊。如果使用normal,有可能出現未4k對齊的情況。

pmm_type_cache:小記憶體使用。

2.page資訊

typedef struct mm_page 

mm_page;

ll:主要用來插入free/used佇列

start_pa:記錄實體地址

size:記錄記憶體大小,方便free

cache:之後用來做小記憶體的slab管理

3.memory zone資訊

typedef struct mm_zone

mm_zone;

kmalloc主要是針對normal zone做的記憶體分配。所以我們用nr_area來管理4k/8k/16k/32k等等。而zone_area其實就是乙個包含2個list的struct

typedef struct zone_area

zone_area;

free_page_list:用來存放當前塊對應的free 記憶體

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表示顯示字元的屬性。那麼要呼叫它,只需給出程式的名稱即可...