這本書開發的作業系統,用到了下面的記憶體分布圖:
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 intsize)
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...