讀30天自製作業系統有感,順便回應公尺油兄

2021-06-18 16:51:29 字數 2690 閱讀 2840

對真正想學好計算機技術的人,建議先略讀一遍各學科書,再讀30天自製os,從這本書裡找出各學科裡談及的內容,回頭再看那些講理論的書,一下子就領悟了。

看到目前,我認為作者最高明的地方是解決問題的辦法,還有轉成**裡的演算法。有的時候不能不說太高明了。自學後分解弄懂容易,但要讓目前水平的我自己寫出來,我知道我做不到。

說下我輔助看30天學好os的相關書: 于淵的自製乙個作業系統、 386設計師寫的保護方式下的80386及其程式設計、tanenbaum的現代作業系統第三版、c父的c語言程式設計

感謝以上牛人的書。讓我獲益多多。

先宣告,我也才看到第十天的疊加處理。

第十章 作者提到不管是滑鼠疊加或移動,還是視窗疊加或移動,全是用圖層解決。

作者的注釋很精簡,精簡到文字就寫具體演算法看**,造成的後果就是那些圖層演算法要停止閱讀進行研究。

下面是寫給公尺油的

第九章 作業系統核心簡單記憶體管理

前提摘要:

作者寫道記憶體管理用表來管理比用位元組陣列和位來管理來得快速。表其實就是資料結構上的用陣列實現的線性表

作者在**裡要做的是

1.用memtest函式獲取電腦物理記憶體有多大,獲得的記憶體大小儲存在memtotal變數中

2. 用 memman_init函式 對struct memman 記憶體管理結構進行初始化,

3. 對記憶體中空閒的記憶體位址在 struct memman 中生成兩條記錄

memman_free(memman, 0x00001000, 0x0009e000);  // 1mb以下的空閒記憶體

memman_free(memman, 0x00400000, memtotal - 0x00400000); // 4兆以上到物理記憶體上限間的空閒記憶體

作者用這個memman_free記憶體釋放函式在 struct freeinfo free[memman_frees] 表中生成兩條記錄,就是把空閒內存在 struct freeinfo free[memman_frees] 中註冊

4. 之後,之後就是如果作業系統核心相關**要用記憶體(比如後面圖層疊加就要用),程序要用記憶體,就要用memman_alloc 和 memman_free來申請和釋放。memman_alloc 和 memman_free這兩個函式就是在struct

freeinfo free[memman_frees]這個陣列中新增和刪除項。當然演算法要進行比較,比較是否可以和在struct freeinfo free[memman_frees]這個陣列中的相關項進行合併

正如作者所說第九章**沒解決在記憶體存在大量碎片,struct freeinfo free[memman_frees] 陣列用完memman_frees條數後的解決方法,第九章只是單純的在lostsize, losts中統計一下,直接放棄這次要釋放的內

存。理解了以上,就可以理解作者的**了。以下給出memman_free偽碼加解釋

struct freeinfo ;

//這個freeinfo結構定義了可用記憶體的開始位址及範圍

struct memman ;

//這個結構就是記憶體管理結構。struct freeinfo free[memman_frees]這個陣列用來儲存空閒記憶體的freeinfo結構。

//lostsize, losts這兩個變數是統計記憶體存在大量碎片struct freeinfo free[memman_frees] 陣列用完memman_frees條數後的相關資料

//frees這個變數是說目前struct freeinfo free[memman_frees]裡有多少條記錄。書上注釋寫的是「可用資訊數目」,一直不理解,後來一看**,看懂了。

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

}//要釋放的記憶體的位址 addr與 man->free[i].addr進行比較,迴圈的結果就是找到這個addr要插到struct freeinfo free[memman_frees] 陣列中的哪個地方。

//相當於free[i - 1].addr < addr < free[i].addr

// 以下**段說的是:  要釋放的addr既要與上乙個條目進行比較,也要與下一條目進行比較

// 以下的**是說 要釋放的記憶體addr可以與上乙個條目合併

if (i > 0) }}

return 0; }}

if (i < man->frees)

}if (man->frees < memman_frees)

man->frees++;   // 可用條目數加一

if (man->maxfrees < man->frees)

// 以下**最簡單了,

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

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

return 0;

}// 要釋放的記憶體addr既不可以與上乙個條目合併,也不可以與下乙個條目合併,而且運氣很差,struct freeinfo free[memman_frees] 陣列用完memman_frees條數,然後,直接放棄,不加入條目了,只做統計。

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...