30天自製作業系統開發筆記 記憶體管理

2022-09-06 01:21:06 字數 1637 閱讀 5332

這本書開發的作業系統,用到了下面的記憶體分布圖:

0x00000000 - 0x000fffff : 啟動中多次使用,存放vram等內容(1mb)

0x00100000 - 0x00267fff : 用於儲存軟盤的內容。(1440kb)

0x00268000 - 0x0026f7ff : 空(30kb)

0x0026f800 - 0x0026ffff : idt(2kb)

0x00270000 - 0x0027ffff : gdt(64kb)

0x00280000 - 0x002fffff : bootpack.hrb(512kb)

0x00300000 - 0x003fffff : 棧及其他(1mb)

0x00400000 - :空

根據qemu的設定,整個程式占用的最大記憶體為32mb

記憶體管理的內容主要包括記憶體分配,記憶體**

記憶體分配:

對於這32mb的記憶體,以4kb為最小單位,用鏈式的方法去管理,並且遵循每乙個未分配的記憶體塊按照位址從小到大排列,每次分配記憶體時,找到乙個不小於要求的大小的記憶體塊分配出去,當一塊記憶體完全分配之後,要把其從鍊錶中刪除。

view code

#define eflags_ac_bit 0x00040000

#define cr0_cache_disable 0x60000000

#define memman_frees 4090

#define memman_addr 0x003c0000

struct

freeinfo

;struct

memman;/*

要用到的結構體及巨集定義

*/void memman_init(struct memman *man)

/*初始化

*/unsigned

int memman_alloc(struct memman *man,unsigned int

size)

}return

a; }

}return0;

}/*記憶體分配,返回得到記憶體的起始位址

*/

記憶體**:

**時要注意**的記憶體和可以連線到一起的記憶體連線起來

view code

int memman_free(struct memman *man,unsigned int addr,unsigned int

size)

if(i>0)/*

前面有可用記憶體

*/ }

return0;}}

if(ifrees)/*

前面沒有可用記憶體,或者不能跟前面記憶體連到一起

*/ }

if(man->frees

man->frees++;

if(man->maxfreesfrees)

man->free[i].addr=addr;

man->free[i].size=size;

return0;

}/*不能往後移動的

*/man->losts++;

man->lostsize+=size;

return -1;/*

失敗*/

}

30天自製作業系統

第一天的內容很少,是一些簡單的基礎知識,在這裡我就沒有必要寫出來了,只說出大概的輪廓了,然後我會對其中的幾點進行詳細的解釋。文章的第一天的輪廓大概是這樣的,作者首先用二進位制編輯器做了乙個顯示二進位制的程式,然後用彙編完全db的形式,後又進行改善,最後以比較標準的組合語言編寫,但程式主體部分還沒有翻...

30天自製作業系統 導讀

說明 這是8月15日即將上市的一本新書,本文的摘選也可以命名為 30天自製作業系統 上市之前必讀。本書幽默,有趣,可以說是技術書裡的幽默書,讓您讀起來絕對不會感到乏味。在本書上市之前,您一定先要讀下此篇文章,可以避免在學習中走更多的閱讀彎路,因為更多的讀者會問,七百多頁,30天?是的,看完此篇內容,...

30天自製作業系統 startHaribote

haribote os tab 4 org 0x8400 mov si,msg call putloop mov al,0x13 mov ah,0x00 int 0x10 fin hltjmp fin msg db 0x0a db test db 0 putloop mov al,si add si...