操作系统Nachos总结
由于大家的操作系統(tǒng)設(shè)計(jì)思想都不一樣,直接貼代碼也沒什么意思,就簡(jiǎn)單記錄下自己的思路吧。
實(shí)驗(yàn)一
這個(gè)實(shí)驗(yàn)就是搭建環(huán)境,分析一下源碼各個(gè)文件的作用。沒什么好記錄的。
實(shí)驗(yàn)二 具有優(yōu)先級(jí)的線程調(diào)度
個(gè)人感覺這個(gè)實(shí)驗(yàn)比較簡(jiǎn)單。
- 修改thread文件,為線程增加成員優(yōu)先級(jí)以及相應(yīng)的set、get函數(shù)。按照自己的設(shè)計(jì)來就行
- 修改scheduler文件, 使得等待隊(duì)列按照優(yōu)先級(jí)將線程排序,而不是之前的直接插入。
- 修改ThreadTest文件,按照自己的設(shè)計(jì)改測(cè)試函數(shù)
PS:優(yōu)先級(jí)調(diào)度分搶占式和非搶占式的。按照上面來只能實(shí)現(xiàn)非搶占式的,至于搶占式的的實(shí)現(xiàn),估計(jì)還得修改machine下面的Interrupt文件。
實(shí)驗(yàn)三 信號(hào)量
實(shí)驗(yàn)比較簡(jiǎn)單,信號(hào)量的實(shí)現(xiàn)已經(jīng)很明白了,直接拿來用就可。
prodcons++文件里面要改的地方也有英文的代碼注釋,很清晰。比如:
實(shí)驗(yàn)四 擴(kuò)展文件
實(shí)驗(yàn)四和實(shí)驗(yàn)五就是有關(guān)文件系統(tǒng)的了,難度明顯比之前的要大。
這個(gè)實(shí)驗(yàn)主要改的就是filehdr和openfile。
filehdr文件
這個(gè)類相當(dāng)于inode,記錄了文件基本信息。包括大小、占用了幾個(gè)扇區(qū)、內(nèi)容分別放在哪些扇區(qū)中。
openfile文件
用于實(shí)現(xiàn)文件的打開、讀入等,使用一個(gè)filehdr對(duì)象。
- filehdr中就是多了擴(kuò)充文件大小的函數(shù),為了方便,還加了設(shè)置文件長(zhǎng)度的函數(shù)。
- openfile中要新加一個(gè)inode請(qǐng)求空間函數(shù),還加了WriteBack函數(shù),用于將hdr修會(huì)磁盤
- openfile中要根據(jù)以上兩步的修改,重寫WriteAt函數(shù)
實(shí)驗(yàn)五 二級(jí)索引
這個(gè)我是在實(shí)驗(yàn)四的基礎(chǔ)上就地修改的,只需要改filehdr。這個(gè)實(shí)現(xiàn)方案能百度到一大堆,我就記錄下我的。
引入了一個(gè)新的類subhdr,基本成員類似于filehdr。原來的filehdr中的數(shù)組留出一個(gè)int的大小。數(shù)組前面的仍然為一級(jí),最后一個(gè)指向的扇區(qū)是subhdr對(duì)象的扇區(qū)。
其實(shí)也可以直接最后一個(gè)指向filehdr對(duì)象,這樣就實(shí)現(xiàn)了多級(jí)索引,就是類似于鏈表的實(shí)現(xiàn),但是估計(jì)很出很多bug,有創(chuàng)新意識(shí)的讀者可以試下。
這樣子確定好思路后,就可以改.cc文件了,可以說是全部重寫一遍了,除了FetchFrom、WriteBack 和FileLength,所有方法都改了,還需要根據(jù)你的設(shè)計(jì)重新定義宏。但說白了就是按照一級(jí)二級(jí)的邊界劃分改就行,就多了幾個(gè)判斷條件多了幾種可能的情況罷了。
邏輯理清楚了,改的時(shí)候就很簡(jiǎn)單了,但是一定要仔細(xì),我就是忘了改一個(gè)邊界條件導(dǎo)致一用到二級(jí)的時(shí)候就報(bào)段錯(cuò)誤,核心已轉(zhuǎn)儲(chǔ),還不知道哪里錯(cuò)了,這是最要命的。(就是太菜了,一個(gè)bug在眼前就是看不出來。。。)
實(shí)驗(yàn)六
這兩個(gè)實(shí)驗(yàn)都是關(guān)于內(nèi)存管理的。
交叉編譯環(huán)境的注意事項(xiàng)
我在按照實(shí)驗(yàn)指導(dǎo)書的步驟來,是獲得不了Nachos下的用戶可執(zhí)行程序的,make時(shí)報(bào)錯(cuò)如下:
所以,我查看了../bin/arch/unknown-i386-linux/bin/這個(gè)目錄,發(fā)現(xiàn)兩個(gè)可執(zhí)行文件都是沒有可執(zhí)行權(quán)限的:
這樣子Permission denied是理所當(dāng)然的了,所以要先給他們可執(zhí)行的權(quán)限
命令:chmod 764 *。再次make,就OK了。
這個(gè)實(shí)驗(yàn)考察兩個(gè)方面,一是內(nèi)存中要有多個(gè)程序駐留,二是系統(tǒng)調(diào)用Exec的實(shí)現(xiàn)。這兩個(gè)要求是相輔相成。一是二的基礎(chǔ),二是一實(shí)現(xiàn)的證明。
先說要求一,就是重新設(shè)計(jì)分配內(nèi)存方案,目錄中也有bitmap文件,就明示要用位圖來記錄,當(dāng)然位圖一個(gè)就ok,要么聲明稱全局變量,要么聲明成AddrSpace的靜態(tài)屬性,我選了后者,因?yàn)榍罢咭膭e的文件,怕改亂了,再牽扯到其他實(shí)驗(yàn)。
要求二也很直白了,就是改exception.cc實(shí)現(xiàn)Exec的處理,就是要注意文件名的獲得和PC的推進(jìn)。(我就是忽視了這個(gè),之前一直陷入死循環(huán)找不出錯(cuò))。
實(shí)驗(yàn)七
我的思想是固定分配 + 局部置換的策略。
看TranslateEntry類中用use和dirty,而且注釋中也是寫明了通過這兩個(gè)位可以構(gòu)造虛擬內(nèi)存,很明顯是在提示用二次機(jī)會(huì)法。不過,用其他的犧牲頁面選擇方法(比如FIFO、LRU)也是可行的。
(上學(xué)期,h老師說二次機(jī)會(huì)法只需要兩次循環(huán),但我總是覺得是三次循環(huán),沒怎么想明白,有明白的小伙伴可以在下方留言,萬分感謝)
寫代碼的時(shí)候,要注意的倒不是操作系統(tǒng)方面的問題,反倒是C++的語法問題(沒辦法就是菜。。。)
總結(jié)
以上是生活随笔為你收集整理的操作系统Nachos总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 加载显示富文本——Tex
- 下一篇: 固定Vmware 虚拟机 系统时间