我推薦的這個lab,名字叫做ucore,這個lab來自清華大學的操作系統(tǒng)課程,首先要說明一下,這確實是非常好的一個lab,想入門linux內(nèi)核的同學可以讀一讀這個lab所涉及的ucore的源碼。
書籍推薦
其實只要大家認認真真做下去,收獲肯定會非常的大。雖然這么說,但是,這個lab 對大家的基礎要求稍微有一點高,你至少要懂一點匯編,懂一點C。代碼里面很多都是匯編,C交替著寫,我推薦幾本書,給大家補一下基礎,大家可以參考一下。
第一本是王爽的匯編語言,這本書適合入門,但是只涉及到了8086的一點東西。書講的淺顯易懂。

另外一本書是《x86匯編語言--從實模式到保護模式》,這本書算是一本進階的書籍,同時也是80386匯編入門的書籍。這本書里大部分的知識,這個lab都用得到,所以強烈推薦大家閱讀。

還有一本需要參考一下的是《程序員的自我修養(yǎng)--鏈接、裝載與庫》,因為這個lab還涉及到了elf格式的可執(zhí)行程序.

當然,最好的話,能附帶這么一本《orange's 一個操作系統(tǒng)的實現(xiàn)》,作為參考是最好不過啦。這本書的話,匯編有點多,其實很多匯編都可以用C來代替。不過里面有一些點,這個lab也涉及到了,所以推薦讀一下。

上面的幾本書里應該涉及到了這個lab所需要的大部分的硬件以及匯編的知識,其余的,你可以去google或者baidu。做這個lab,你可能會遇到非常多的困難,比如說,調(diào)試異常困難,代碼半天讀不懂,沒事,這都是很正常的情況。要是覺得困難實在太大,我建議你從這個玩具內(nèi)核入手 -- hurley,這個內(nèi)核非常簡單,適合積累一些最基本的知識。
關于代碼的閱讀
在linux上面讀ucore將近1 M的源文件真心費力,生活其實可以簡單一點,你可以使用宇宙最強的ide--visual stdio來進行代碼的閱讀,像我這樣:
是不是很爽,告訴你,爽翻了。特別是遇到一堆不知從哪里冒出來的宏,一堆不知名的函數(shù)的時候,VS可以實現(xiàn)十萬分方便的跳轉(zhuǎn)。
我推薦兩個插件,一個叫做visual assistant,這個用來增強自動補全以及跳轉(zhuǎn)操作,一個叫做visualGDB,是一個幫助你在window上面寫linux程序的插件。自己去搜索安裝吧,網(wǎng)上教程一大堆。我就懶得寫了。當然,你不可能用vs來編譯代碼,但是,vs會給你閱讀代碼,修改代碼帶來非常大的方便性。
收獲
實在做不出也沒有什么關系,因為很少有人會真正去做一個操作系統(tǒng)吧。但是讀懂源碼,我覺得還是非常有必要的,我稍微講一下,我個人讀完了這個lab源碼之后的感受吧。
以前學
c的時候,我總是很好奇,printf之類的函數(shù)究竟是如何實現(xiàn)在屏幕上打印出字符的,從來沒有老師講過這些東西,現(xiàn)在,我懂了,原來我們只要將字符寫在內(nèi)存中的某個區(qū)域,然后驅(qū)動程序會自動幫我們實現(xiàn)字符在屏幕上的輸出。為什么
cpu可以實現(xiàn)進程的切換?一切都是因為中斷,一旦發(fā)生中斷,計算機要立馬切換到中斷處理程序中去,利用這個特性,操作系統(tǒng)設定好時鐘頻率,讓時鐘每多少毫秒觸發(fā)中斷,內(nèi)核就可以獲得控制權(quán),從而實現(xiàn)進程的切換。一切的進程,只是一堆數(shù)據(jù)而已,只要你保存好這段數(shù)據(jù),
cpu先去干點別的事情,一段時間后再恢復這些數(shù)據(jù),進程又活了。由于cpu的速度太快了,所以你會一直覺得進程還活著,其實它已經(jīng)切換了幾十次了。- 內(nèi)存的分段,分頁機制真是漂亮的抽象,邏輯上連續(xù)的頁,實際在內(nèi)存中可能相隔十萬八千里,可是這并沒有關系。因為我們已經(jīng) 屏蔽了它,上層的應用是永遠也感覺不到差別的。所謂的程序文件,加載到內(nèi)存里,操作系統(tǒng)要對其進行重定向處理,在每個用戶進程的眼里,它自己是獨一無二的,分段分頁機制完美地實現(xiàn)了進程的隔離。
... ...
對于我來說,收獲特別大。我懂了很多以前我自認為懂了的東西,當然至于這些東西我是不是真的懂了,我也不知道,因為人的認知總是在向前推進的嘛。但是說實話,我對寫一個內(nèi)核什么的,沒有多么大的興趣,所以,我不會繼續(xù)鉆研地太深。所以,對于這個lab,我也只是玩一下的。不過,讀完這個lab,實驗完這個lab,加上我以前學的編譯器,硬件,匯編等一系列的東西,從硬件到軟件這個層次發(fā)生的事情,我現(xiàn)在算是比較清楚了。
至少在現(xiàn)在,寫一個玩具性質(zhì)的操作系統(tǒng)并不是一件很難的事情,關鍵是你不熟練,寫操作系統(tǒng)也沒有很高深的技巧,它也不需要你有很高的智慧,它的理論基礎在幾十年前就已經(jīng)成熟了,已經(jīng)有無數(shù)人寫了無數(shù)的操作系統(tǒng),就如同編譯器一樣,我相信,只要你足夠熟練的話,花點時間,參照各式各樣的教程,你也能夠?qū)懗鲆粋€操作系統(tǒng),對于社會,這可能沒什么卵用,但是對于你自己,你可以從中掌握到很多底層的細節(jié).當然,這也可能沒有什么卵用.
如果你要問,學這些玩意對你找工作有什么益處的話,我可以說,短時間內(nèi)可能還真沒有什么益處,不過這些玩意,算得上是一個編程愛好者的基本修養(yǎng)吧。就這樣吧!如果感到代碼層層疊疊,數(shù)據(jù)結(jié)構(gòu)花樣翻新的話,可以參考一下我的注釋版lab:cs-ucore
學了這么久的計算機,我突然感覺學海無涯,每一個點擴展出去,都是無窮無盡的,真心有點累,不行了,我要休息一段時間了。