自制 os 极简教程1:写一个操作系统有多难
點(diǎn)擊上方“五分鐘學(xué)算法”,選擇“星標(biāo)”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)
不知道正在閱讀本文的你,是否是因?yàn)橄胱约簞?dòng)手寫(xiě)一個(gè)操作系統(tǒng)。我覺(jué)得可能每個(gè)程序員都有個(gè)操作系統(tǒng)夢(mèng),或許是想親自動(dòng)手寫(xiě)出來(lái)一個(gè),或許是想徹底吃透操作系統(tǒng)的知識(shí)。不論是為了滿足程序員們自帶的成就感,還是為了面試找工作時(shí)能更深入地和面試官探討(裝逼)。
那寫(xiě)一個(gè)操作系統(tǒng)究竟有多難呢?我結(jié)合自己的經(jīng)歷給大家講一講。
寫(xiě)一個(gè)操作系統(tǒng)有多難
先說(shuō)一句廢話:會(huì)者不難,難者不會(huì)。
冷啟動(dòng)
對(duì)于零基礎(chǔ)的人,甚至是計(jì)算機(jī)知識(shí)零基礎(chǔ)的人來(lái)說(shuō),難。難點(diǎn)并不在于操作系統(tǒng)的代碼量本身,而在于任何一個(gè)事物發(fā)展初期都會(huì)遇到的困境,冷啟動(dòng)。
我不知道應(yīng)該看哪本書(shū)作為入門書(shū)籍,甚至不知道應(yīng)該看書(shū)還是看網(wǎng)絡(luò)上的文章,還是找一個(gè)領(lǐng)路者帶你入門,甚至還在被一些討論自己做一個(gè)操作系統(tǒng)到底有沒(méi)有意義這個(gè)問(wèn)題糾結(jié)著。
好多人在這個(gè)冷啟動(dòng)時(shí)期,就被弄得沒(méi)脾氣了。
你可能比較幸運(yùn),找到了一本入門書(shū)籍,剛好作者的文筆和思路比較對(duì)你的胃口,于是度過(guò)了冷啟動(dòng)時(shí)期。
但你也可能不太幸運(yùn),找了一本難讀的書(shū)籍,或者是優(yōu)秀的作品但剛好不對(duì)你的胃口,于是就從入門到放棄了。
我當(dāng)時(shí)的第一本啟蒙書(shū)籍,是《30 天自制操作系統(tǒng)》,好多人的第一本可能也是這個(gè),因?yàn)闀?shū)的標(biāo)題就直戳了當(dāng)?shù)貙?xiě)了 自制操作系統(tǒng) 這幾個(gè)字,而且一看哇 30 天就能搞定,一下讓好多不敢跨出第一步的人有了信心。
這本書(shū)會(huì)把讀者當(dāng)作完全沒(méi)有計(jì)算機(jī)基礎(chǔ)的小白,所以很多地方非常友好,跟著它走一遍完全可以讓你度過(guò)冷啟動(dòng)時(shí)期了。
但這本書(shū)同樣也有讓人想中途放棄的一些點(diǎn),比如我就很煩這些地方。一個(gè)是它從官網(wǎng)上下載的源碼是日語(yǔ)注釋的,搞的當(dāng)時(shí)我好多地方還找我朋友幫我翻譯。另一個(gè)是他用的工具都是這個(gè)作者自己寫(xiě)的,這固然比較牛逼,但我就想難不成做操作系統(tǒng)連個(gè)現(xiàn)成的業(yè)界常用的工具也沒(méi)有么,我學(xué)了你的工具也沒(méi)有普適性啊。再有就是作者后面的篇幅花好多時(shí)間講圖形界面要怎么做,怎么在屏幕上畫(huà)一個(gè)個(gè)方框作為窗口,還想互不影響。這個(gè)因人而異吧,我是覺(jué)得不必花費(fèi)如此大的篇幅,這不是想寫(xiě)操作系統(tǒng)的人的痛點(diǎn)所在。
總之,通過(guò)一本書(shū),或者一篇文章,或者一個(gè)領(lǐng)路人的帶領(lǐng)之下,你邁出了第一步,度過(guò)了冷啟動(dòng)時(shí)期,來(lái)到了初期。
初期
你照葫蘆畫(huà)瓢,一個(gè)指令都不敢修改,終于照著書(shū)上的代碼,成功在一個(gè)虛擬機(jī)或者真機(jī)上看到了“hello world”,或者牛逼一點(diǎn)看到了 AAABBB 線程切換方式交替打印的字符串。
這時(shí)候你寫(xiě)操作系統(tǒng)的恐懼已經(jīng)沒(méi)有了,但你不滿足于現(xiàn)狀,因?yàn)檫@個(gè)“hello world”并不是你自己的東西,你甚至都不知道里面的代碼是什么含義,可能當(dāng)時(shí)只是 copy 過(guò)來(lái)的。
你不在需要一個(gè)手把手教你的書(shū)籍,更多的是需要告訴你通用的原理,以及操作系統(tǒng)思想的書(shū)籍。
我在這個(gè)時(shí)期的書(shū)籍是《操作系統(tǒng)真相還原》,這本書(shū)一上來(lái)就講述了一些你可能感到困惑的問(wèn)題
0.1 操作系統(tǒng)是什么
0.2 你想研究到什么程度
0.3 寫(xiě)操作系統(tǒng),哪些需要我來(lái)做
0.4 軟件是如何訪問(wèn)硬件的
0.5 應(yīng)用程序是什么,和操作系統(tǒng)是如何配合到一起的
0.6 為什么稱為“陷入”內(nèi)核
0.7 內(nèi)存訪問(wèn)為什么要分段
0.8 什么是平坦模型
我一看這目錄我的媽呀,這不就是我讀完《30 天自制操作系統(tǒng)》后所產(chǎn)生的疑問(wèn)么!于是這本書(shū)可以說(shuō)是我在這條路上,讀的最爽的書(shū),一個(gè)個(gè)疑問(wèn)就是在這本書(shū)里被一一找到答案的。
不過(guò)其實(shí)我覺(jué)得對(duì)于有計(jì)算機(jī)基礎(chǔ)并且還不錯(cuò)的人來(lái)說(shuō),這本書(shū)完全可以作為冷啟動(dòng)時(shí)期的第一本書(shū)了。
這本書(shū)不會(huì)像 30 天一樣,在手把手這種細(xì)節(jié)上下太大功夫,比如 30 天這本書(shū)很逗,居然在教你如何用鍵盤(pán)按出 512 個(gè) 0 這個(gè)問(wèn)題上寫(xiě)了好多行,還說(shuō)你家如果有小貓的話可以棒棒忙。所以這本書(shū)的篇幅會(huì)放在一些真正重點(diǎn)的問(wèn)題上。
你讀完這本書(shū),結(jié)合著網(wǎng)上的資料和自己動(dòng)手實(shí)踐,已經(jīng)可以用自由意志來(lái)對(duì)照葫蘆畫(huà)瓢的操作系統(tǒng)進(jìn)行微調(diào)了。此時(shí)你已經(jīng)成功度過(guò)了初期,開(kāi)始向中期邁進(jìn)!
不過(guò)別看一句話就總結(jié)完了,這中間你很可能會(huì)放棄,因?yàn)閱螁芜@本書(shū)的知識(shí)量就非常龐大了,如果之前從沒(méi)有接觸過(guò),想要消化它,不是一件簡(jiǎn)單的事。
比如我在這個(gè)階段,就中途放棄過(guò)兩三次,因?yàn)槲依舷胫^(guò)一些我覺(jué)得“沒(méi)用的”章節(jié),可往往都是看到后面,又要重新翻回來(lái)把前面的補(bǔ)上。有的時(shí)候也因?yàn)?#xff0c;明明和書(shū)上寫(xiě)的一樣,但我的程序就是報(bào)錯(cuò),導(dǎo)致后面的沒(méi)法進(jìn)行。操作系統(tǒng)就是這樣,前面的加載 loader、設(shè)置中斷、設(shè)置分段分頁(yè)、進(jìn)入保護(hù)模式這些步驟是串行的,每一步都不能出一丁點(diǎn)錯(cuò)誤,否則后面的步驟會(huì)被前面的步驟卡住,遇到問(wèn)題沒(méi)法跳過(guò),就像你做一張數(shù)學(xué)試卷,必須從第一題開(kāi)始順序做到最后一題,而且前面的正確了才能往后繼續(xù)做一樣。
虛擬機(jī)崩了...
中期
千辛萬(wàn)苦來(lái)到中期,這里的人可能已經(jīng)不多了,但到了這里你會(huì)認(rèn)識(shí)一大批和你一樣在掙扎的人,新世界的大門可能就此打開(kāi),所以對(duì)你來(lái)說(shuō),其實(shí)你會(huì)覺(jué)得自己做操作系統(tǒng)的人好多啊,而且高手如云。
因?yàn)殡m然你可以按照自己的意志對(duì)寫(xiě)好的操作系統(tǒng)有一些微調(diào),也對(duì)操作系統(tǒng)的各個(gè)部分有了一個(gè)模糊的認(rèn)識(shí),但總是甩不開(kāi)你所看的書(shū)的影子,簡(jiǎn)單說(shuō)就是沒(méi)見(jiàn)識(shí)。
我當(dāng)時(shí)呢,就被《操作系統(tǒng)真相還原》里的操作系統(tǒng)的思路舒服著,總是認(rèn)為就應(yīng)該把內(nèi)核映射到內(nèi)存高端的空間上,要用很取巧的辦法設(shè)計(jì)頁(yè)表。總之就是見(jiàn)識(shí)少,因?yàn)橹恢酪环N實(shí)現(xiàn)方式,所以覺(jué)得天下的操作系統(tǒng)都是這個(gè)鬼樣。
因?yàn)楹么跏怯悬c(diǎn)知識(shí)量在了,這個(gè)階段一些操作系統(tǒng)領(lǐng)域的大牛(反正是比你厲害很多的人啦),會(huì)稍稍理一理你了,可能語(yǔ)氣會(huì)從原來(lái)的拉黑,變成“哦”,再到現(xiàn)在的“嗯嗯”。
xbook操作系統(tǒng)開(kāi)發(fā)者 b站我叫小骨頭
你也會(huì)加入到一些群或者一些社區(qū)當(dāng)中,認(rèn)識(shí)更多的大佬。你會(huì)發(fā)現(xiàn),你眼中的這個(gè)操作系統(tǒng),在他們眼里就是個(gè)其中一種很常規(guī)的或者說(shuō)很過(guò)時(shí)的方式而已。于是乎你在慢慢的影響下,也打開(kāi)了思路,決定了解更多的操作系統(tǒng)。
我呢,當(dāng)時(shí)的選擇是閱讀 linux 源碼,并嘗試仿寫(xiě)一個(gè)(最后仿寫(xiě)這一步放棄了)。
linux0.11源碼
這我感覺(jué),只要這一步你的選擇是了解一款經(jīng)典的操作系統(tǒng),那還能選什么呢,只能是 linux 吧哈哈。
這一時(shí)期的書(shū)籍呢,也比較多,我的話是通過(guò)《linux 內(nèi)核設(shè)計(jì)的藝術(shù)》來(lái)簡(jiǎn)單了解 linux 的整個(gè)流程和脈絡(luò),再通過(guò)《linux 內(nèi)核完全注釋》配合著 linux 的源碼進(jìn)行重點(diǎn)源碼逐行了解,還通過(guò)和一款開(kāi)源操作系統(tǒng) bookos 的作者進(jìn)行交流,進(jìn)一步了解一個(gè)成熟操作系統(tǒng)需要考慮的問(wèn)題。
bookos - xbook2 運(yùn)行截圖(來(lái)自該作者的官網(wǎng))
linux 有些了解后,便通過(guò)仿寫(xiě)的形式來(lái)進(jìn)一步加深理解。但仿寫(xiě)最終放棄了,因?yàn)榧幢闶?linux0.11 的源代碼,里面都非常復(fù)雜,完全仿寫(xiě)還是很費(fèi)時(shí)間的。于是便將自己認(rèn)為純苦力的工作簡(jiǎn)化,比如 linux 會(huì)根據(jù)內(nèi)存大小來(lái)劃分內(nèi)存區(qū)域,我就直接寫(xiě)死了 32M 內(nèi)存。再比如 linux 支持的硬盤(pán)數(shù)是動(dòng)態(tài)變化的,我就直接只支持一塊硬盤(pán),這樣里面好多數(shù)組,for 循環(huán),就都展開(kāi)了,我覺(jué)得對(duì)理解一個(gè)操作系統(tǒng),這些工作無(wú)關(guān)緊要。
這里說(shuō)個(gè)小插曲,讀 linux 源碼,有時(shí)候差點(diǎn)沒(méi)把我氣死。linus 這個(gè)人太調(diào)皮了,好多地方的注釋寫(xiě)的大概是這種風(fēng)格。/*_ emm,這里我也不知道有啥用,不過(guò)先寫(xiě)上吧,我樂(lè)意,嘿嘿 _/ 對(duì)于正在苦苦理解源碼的我,簡(jiǎn)直不友好
奉上一段 linux 的源碼,來(lái)自 main.c
插曲結(jié)束,回到正題。
這時(shí)候找書(shū)便不再是你的難題了,你會(huì)自發(fā)的去找自己需要的書(shū)籍,并且每個(gè)人想關(guān)注的點(diǎn)不同,也會(huì)找不同的側(cè)重點(diǎn)去深入了解。比如 linux 早期版本中是沒(méi)有網(wǎng)絡(luò)模塊的,所以如果側(cè)重點(diǎn)在網(wǎng)絡(luò)編程,那就專門找如《linux 內(nèi)核網(wǎng)絡(luò)模型》這種書(shū)。有時(shí)候一些驅(qū)動(dòng)程序,和一些比較好的操作系統(tǒng)變編程習(xí)慣,我也會(huì)通過(guò)如《一個(gè) 64 位操作系統(tǒng)的實(shí)現(xiàn)》這類書(shū)的部分章節(jié)來(lái)強(qiáng)化。
而且這個(gè)階段你不在寂寞,會(huì)有很多同行者和你一起,也會(huì)有很多小白請(qǐng)教你問(wèn)題。
后期
此時(shí),一個(gè)操作系統(tǒng)的框架,你應(yīng)該已經(jīng)摸清楚了,但你不可能深入每一個(gè)細(xì)節(jié)。此時(shí),也不是堅(jiān)不堅(jiān)持的問(wèn)題了,而是選擇的問(wèn)題。你要你的操作系統(tǒng)不但支持 x86 還支持 arm 么?你要把各種驅(qū)動(dòng)程序都完善么?你要做優(yōu)美的圖形化界面么?你要深入學(xué)習(xí)顯卡方面的編程么?你要加入制作國(guó)產(chǎn)操作系統(tǒng)的大軍么?
我的選擇是不,所以我止步于此了,因?yàn)槲沂?/p>
因?yàn)槲耶?dāng)初決定入坑的時(shí)候,是為了對(duì)我現(xiàn)在所做的工作有更深入的理解。我是個(gè)軟件工程師,是 Java 程序員,并不是專門做嵌入式,專門做內(nèi)核開(kāi)發(fā)的從業(yè)者。所以我認(rèn)為再往后繼續(xù)深入可以,但已經(jīng)沒(méi)必要向前中期那樣集中火力搞了,而是利用閑散時(shí)間能多了解就多了解,按需學(xué)習(xí)。
當(dāng)然你也可以選擇繼續(xù),我覺(jué)得不論是止步于此,還是繼續(xù)往下走,都是有好處的。
我的經(jīng)歷小結(jié)
冷啟動(dòng):《30 天自制操作系統(tǒng)》
初期:《操作系統(tǒng)真相還原》
中期:《linux 內(nèi)核設(shè)計(jì)的藝術(shù)》《linux 內(nèi)核完全注釋》+ linux0.11 源碼
后期:止步
這個(gè)系列要寫(xiě)什么
要寫(xiě)一個(gè)極簡(jiǎn)的操作系統(tǒng)教程,帶你入坑
如果說(shuō)屬于上述哪個(gè)階段的教程的話,我覺(jué)得處于冷冷啟動(dòng)階段,因?yàn)闊o(wú)論是冷啟動(dòng)、初期還是中期,都有讓人放棄的點(diǎn),而這個(gè)冷冷啟動(dòng)階段的極簡(jiǎn)教程,會(huì)讓你在上面的各個(gè)階段,都不那么容易放棄。
我曾經(jīng)寫(xiě)過(guò)這樣的系列,但一開(kāi)始總是定很大的目標(biāo),期待讀者除了我的系列文章外,不需要讀任何資料就可以完全按照我的教程完成一個(gè)操作系統(tǒng)的制作,但往往很不現(xiàn)實(shí),也沒(méi)有必要,完全不是一個(gè)系列文章該做的事。下面是我在博客園折騰的系列們...
系列文章無(wú)法做到足夠細(xì)致,只有大部頭的書(shū)籍才能做到這一點(diǎn)。但上面的每一本書(shū),部頭真的都非常大,很容易讓人放棄,從而錯(cuò)失一本好書(shū)和一個(gè)入坑的機(jī)會(huì),我在每本書(shū)上都放棄過(guò)兩三次。而網(wǎng)上,簡(jiǎn)單的自制操作系統(tǒng)的文章,又過(guò)于簡(jiǎn)單,完全無(wú)法讓人達(dá)到入坑的標(biāo)準(zhǔn)。
所以為了解決這個(gè)痛點(diǎn),我決定根據(jù)自己的經(jīng)歷,結(jié)合書(shū)本上的知識(shí),反思之前寫(xiě)過(guò)的教程中的一些缺點(diǎn),出這樣一個(gè)極簡(jiǎn)教程的系列,其知識(shí)密度介于大部頭書(shū)籍和網(wǎng)上的文章之間。
該教程的核心目標(biāo)是,讓讀者對(duì)制作一個(gè)操作系統(tǒng)的核心流程,應(yīng)該掌握的知識(shí),需要經(jīng)歷的過(guò)程,和需要克服的心理障礙,做到心中有數(shù),不再畏懼,做好入坑自制操作系統(tǒng)的正確姿勢(shì)。并且在深入學(xué)習(xí)的過(guò)程中,不斷的會(huì)有“哦,原來(lái)這個(gè)系列說(shuō)的 xxx 就是這個(gè)意思呀”的正向反饋,這一點(diǎn)是非常重要的。因?yàn)榧夹g(shù)的學(xué)習(xí)過(guò)程中之所以會(huì)放棄,一個(gè)原因是興趣不夠,另一個(gè)原因就是“我理解了”這種正向反饋不夠。那本系列,我希望會(huì)在你后續(xù)深入學(xué)習(xí)的過(guò)程中,這個(gè)系列的影子會(huì)一直陪伴你,給你這種正向反饋和繼續(xù)下去的動(dòng)力,當(dāng)然,最好還能讓你提升興趣,甚至讓本不想親手制作操作系統(tǒng)的人,也打開(kāi)這個(gè)新世界的大門。
本來(lái)還想寫(xiě)個(gè)目錄,后來(lái)想想算了,中途的思路很可能要根據(jù)實(shí)際情況來(lái)調(diào)整,就當(dāng)作給大家的期待吧。
先送你一份入坑禮物
這可能是 全網(wǎng)最簡(jiǎn)單的操作系統(tǒng) demo,啥也不能干,就做到了能接受鍵盤(pán)參數(shù)往屏幕上打印。最誘人的一點(diǎn)就是,如果你是 Windows 操作系統(tǒng),你直接源碼下載下來(lái),點(diǎn)擊 run.bat,不用安裝任何環(huán)境,直接就可以運(yùn)行。這可能是好多入坑小伙伴夢(mèng)寐以求的一個(gè) demo 吧,地址奉上:
https://gitee.com/sunym1993/flash-4th-os.git
flash-4th-os 運(yùn)行截圖
為什么是 flash-4th-os 呢?因?yàn)槲矣⑽拿?Flash,然后我寫(xiě)的前三次都放棄了,這是我寫(xiě)的第四個(gè),哈哈哈。
推薦閱讀
?? ?吳師兄實(shí)名吐槽 LeetCode 上的一道題目。。。?? ?面試字節(jié)跳動(dòng)時(shí),我竟然遇到了原題……????計(jì)算機(jī)專業(yè)的學(xué)生怎樣練習(xí)編程才能把編程學(xué)精通??? ?為什么 MySQL 使用 B+ 樹(shù)?? ?一道簡(jiǎn)簡(jiǎn)單單的字節(jié)跳動(dòng)算法面試題
歡迎關(guān)注我的公眾號(hào)“五分鐘學(xué)算法”,如果喜歡,麻煩點(diǎn)一下“在看”,點(diǎn)擊左下方閱讀原文,獲取谷歌師兄的算法刷題筆記。
總結(jié)
以上是生活随笔為你收集整理的自制 os 极简教程1:写一个操作系统有多难的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 硬件开发的基本过程
- 下一篇: 工作总结17:组件封装思想