日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

自制 os 极简教程1:写一个操作系统有多难

發(fā)布時間:2023/12/10 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自制 os 极简教程1:写一个操作系统有多难 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“五分鐘學(xué)算法”,選擇“星標(biāo)”公眾號

重磅干貨,第一時間送達(dá)

不知道正在閱讀本文的你,是否是因為想自己動手寫一個操作系統(tǒng)。我覺得可能每個程序員都有個操作系統(tǒng)夢,或許是想親自動手寫出來一個,或許是想徹底吃透操作系統(tǒng)的知識。不論是為了滿足程序員們自帶的成就感,還是為了面試找工作時能更深入地和面試官探討(裝逼)。

那寫一個操作系統(tǒng)究竟有多難呢?我結(jié)合自己的經(jīng)歷給大家講一講。

寫一個操作系統(tǒng)有多難

先說一句廢話:會者不難,難者不會

冷啟動

對于零基礎(chǔ)的人,甚至是計算機知識零基礎(chǔ)的人來說,難。難點并不在于操作系統(tǒng)的代碼量本身,而在于任何一個事物發(fā)展初期都會遇到的困境,冷啟動

我不知道應(yīng)該看哪本書作為入門書籍,甚至不知道應(yīng)該看書還是看網(wǎng)絡(luò)上的文章,還是找一個領(lǐng)路者帶你入門,甚至還在被一些討論自己做一個操作系統(tǒng)到底有沒有意義這個問題糾結(jié)著。

好多人在這個冷啟動時期,就被弄得沒脾氣了。

你可能比較幸運,找到了一本入門書籍,剛好作者的文筆和思路比較對你的胃口,于是度過了冷啟動時期。

但你也可能不太幸運,找了一本難讀的書籍,或者是優(yōu)秀的作品但剛好不對你的胃口,于是就從入門到放棄了。

我當(dāng)時的第一本啟蒙書籍,是《30 天自制操作系統(tǒng)》,好多人的第一本可能也是這個,因為書的標(biāo)題就直戳了當(dāng)?shù)貙懥?自制操作系統(tǒng) 這幾個字,而且一看哇 30 天就能搞定,一下讓好多不敢跨出第一步的人有了信心。

這本書會把讀者當(dāng)作完全沒有計算機基礎(chǔ)的小白,所以很多地方非常友好,跟著它走一遍完全可以讓你度過冷啟動時期了。

但這本書同樣也有讓人想中途放棄的一些點,比如我就很煩這些地方。一個是它從官網(wǎng)上下載的源碼是日語注釋的,搞的當(dāng)時我好多地方還找我朋友幫我翻譯。另一個是他用的工具都是這個作者自己寫的,這固然比較牛逼,但我就想難不成做操作系統(tǒng)連個現(xiàn)成的業(yè)界常用的工具也沒有么,我學(xué)了你的工具也沒有普適性啊。再有就是作者后面的篇幅花好多時間講圖形界面要怎么做,怎么在屏幕上畫一個個方框作為窗口,還想互不影響。這個因人而異吧,我是覺得不必花費如此大的篇幅,這不是想寫操作系統(tǒng)的人的痛點所在。

總之,通過一本書,或者一篇文章,或者一個領(lǐng)路人的帶領(lǐng)之下,你邁出了第一步,度過了冷啟動時期,來到了初期

初期

你照葫蘆畫瓢,一個指令都不敢修改,終于照著書上的代碼,成功在一個虛擬機或者真機上看到了“hello world”,或者牛逼一點看到了 AAABBB 線程切換方式交替打印的字符串。

這時候你寫操作系統(tǒng)的恐懼已經(jīng)沒有了,但你不滿足于現(xiàn)狀,因為這個“hello world”并不是你自己的東西,你甚至都不知道里面的代碼是什么含義,可能當(dāng)時只是 copy 過來的。

你不在需要一個手把手教你的書籍,更多的是需要告訴你通用的原理,以及操作系統(tǒng)思想的書籍。

我在這個時期的書籍是《操作系統(tǒng)真相還原》,這本書一上來就講述了一些你可能感到困惑的問題

0.1 操作系統(tǒng)是什么

0.2 你想研究到什么程度

0.3 寫操作系統(tǒng),哪些需要我來做

0.4 軟件是如何訪問硬件的

0.5 應(yīng)用程序是什么,和操作系統(tǒng)是如何配合到一起的

0.6 為什么稱為“陷入”內(nèi)核

0.7 內(nèi)存訪問為什么要分段

0.8 什么是平坦模型

我一看這目錄我的媽呀,這不就是我讀完《30 天自制操作系統(tǒng)》后所產(chǎn)生的疑問么!于是這本書可以說是我在這條路上,讀的最爽的書,一個個疑問就是在這本書里被一一找到答案的。

不過其實我覺得對于有計算機基礎(chǔ)并且還不錯的人來說,這本書完全可以作為冷啟動時期的第一本書了。

這本書不會像 30 天一樣,在手把手這種細(xì)節(jié)上下太大功夫,比如 30 天這本書很逗,居然在教你如何用鍵盤按出 512 個 0 這個問題上寫了好多行,還說你家如果有小貓的話可以棒棒忙。所以這本書的篇幅會放在一些真正重點的問題上。

你讀完這本書,結(jié)合著網(wǎng)上的資料和自己動手實踐,已經(jīng)可以用自由意志來對照葫蘆畫瓢的操作系統(tǒng)進行微調(diào)了。此時你已經(jīng)成功度過了初期,開始向中期邁進!

不過別看一句話就總結(jié)完了,這中間你很可能會放棄,因為單單這本書的知識量就非常龐大了,如果之前從沒有接觸過,想要消化它,不是一件簡單的事。

比如我在這個階段,就中途放棄過兩三次,因為我老想著跳過一些我覺得“沒用的”章節(jié),可往往都是看到后面,又要重新翻回來把前面的補上。有的時候也因為,明明和書上寫的一樣,但我的程序就是報錯,導(dǎo)致后面的沒法進行。操作系統(tǒng)就是這樣,前面的加載 loader、設(shè)置中斷、設(shè)置分段分頁、進入保護模式這些步驟是串行的,每一步都不能出一丁點錯誤,否則后面的步驟會被前面的步驟卡住,遇到問題沒法跳過,就像你做一張數(shù)學(xué)試卷,必須從第一題開始順序做到最后一題,而且前面的正確了才能往后繼續(xù)做一樣。

虛擬機崩了...

中期

千辛萬苦來到中期,這里的人可能已經(jīng)不多了,但到了這里你會認(rèn)識一大批和你一樣在掙扎的人,新世界的大門可能就此打開,所以對你來說,其實你會覺得自己做操作系統(tǒng)的人好多啊,而且高手如云。

因為雖然你可以按照自己的意志對寫好的操作系統(tǒng)有一些微調(diào),也對操作系統(tǒng)的各個部分有了一個模糊的認(rèn)識,但總是甩不開你所看的書的影子,簡單說就是沒見識

我當(dāng)時呢,就被《操作系統(tǒng)真相還原》里的操作系統(tǒng)的思路舒服著,總是認(rèn)為就應(yīng)該把內(nèi)核映射到內(nèi)存高端的空間上,要用很取巧的辦法設(shè)計頁表。總之就是見識少,因為只知道一種實現(xiàn)方式,所以覺得天下的操作系統(tǒng)都是這個鬼樣。

因為好歹是有點知識量在了,這個階段一些操作系統(tǒng)領(lǐng)域的大牛(反正是比你厲害很多的人啦),會稍稍理一理你了,可能語氣會從原來的拉黑,變成“哦”,再到現(xiàn)在的“嗯嗯”。

xbook操作系統(tǒng)開發(fā)者 b站我叫小骨頭

你也會加入到一些群或者一些社區(qū)當(dāng)中,認(rèn)識更多的大佬。你會發(fā)現(xiàn),你眼中的這個操作系統(tǒng),在他們眼里就是個其中一種很常規(guī)的或者說很過時的方式而已。于是乎你在慢慢的影響下,也打開了思路,決定了解更多的操作系統(tǒng)。

我呢,當(dāng)時的選擇是閱讀 linux 源碼,并嘗試仿寫一個(最后仿寫這一步放棄了)。

linux0.11源碼

這我感覺,只要這一步你的選擇是了解一款經(jīng)典的操作系統(tǒng),那還能選什么呢,只能是 linux 吧哈哈。

這一時期的書籍呢,也比較多,我的話是通過《linux 內(nèi)核設(shè)計的藝術(shù)》來簡單了解 linux 的整個流程和脈絡(luò),再通過《linux 內(nèi)核完全注釋》配合著 linux 的源碼進行重點源碼逐行了解,還通過和一款開源操作系統(tǒng) bookos 的作者進行交流,進一步了解一個成熟操作系統(tǒng)需要考慮的問題。

bookos - xbook2 運行截圖(來自該作者的官網(wǎng))

linux 有些了解后,便通過仿寫的形式來進一步加深理解。但仿寫最終放棄了,因為即便是 linux0.11 的源代碼,里面都非常復(fù)雜,完全仿寫還是很費時間的。于是便將自己認(rèn)為純苦力的工作簡化,比如 linux 會根據(jù)內(nèi)存大小來劃分內(nèi)存區(qū)域,我就直接寫死了 32M 內(nèi)存。再比如 linux 支持的硬盤數(shù)是動態(tài)變化的,我就直接只支持一塊硬盤,這樣里面好多數(shù)組,for 循環(huán),就都展開了,我覺得對理解一個操作系統(tǒng),這些工作無關(guān)緊要。

這里說個小插曲,讀 linux 源碼,有時候差點沒把我氣死。linus 這個人太調(diào)皮了,好多地方的注釋寫的大概是這種風(fēng)格。/*_ emm,這里我也不知道有啥用,不過先寫上吧,我樂意,嘿嘿 _/ 對于正在苦苦理解源碼的我,簡直不友好

奉上一段 linux 的源碼,來自 main.c

/**?Yeah,?yeah,?it's?ugly,?but?I?cannot?find?how?to?do?this?correctly*?and?this?seems?to?work.?I?anybody?has?more?info?on?the?real-time*?clock?I'd?be?interested.?Most?of?this?was?trial?and?error,?and?some*?bios-listing?reading.?Urghh.*/#define?CMOS_READ(addr)?({?\ outb_p(0x80|addr,0x70);?\ inb_p(0x71);?\ })#define?BCD_TO_BIN(val)?((val)=((val)&15)?+?((val)>>4)*10)static?void?time_init(void) {struct?tm?time;do?{time.tm_sec?=?CMOS_READ(0);......

插曲結(jié)束,回到正題。

這時候找書便不再是你的難題了,你會自發(fā)的去找自己需要的書籍,并且每個人想關(guān)注的點不同,也會找不同的側(cè)重點去深入了解。比如 linux 早期版本中是沒有網(wǎng)絡(luò)模塊的,所以如果側(cè)重點在網(wǎng)絡(luò)編程,那就專門找如《linux 內(nèi)核網(wǎng)絡(luò)模型》這種書。有時候一些驅(qū)動程序,和一些比較好的操作系統(tǒng)變編程習(xí)慣,我也會通過如《一個 64 位操作系統(tǒng)的實現(xiàn)》這類書的部分章節(jié)來強化。

而且這個階段你不在寂寞,會有很多同行者和你一起,也會有很多小白請教你問題。

后期

此時,一個操作系統(tǒng)的框架,你應(yīng)該已經(jīng)摸清楚了,但你不可能深入每一個細(xì)節(jié)。此時,也不是堅不堅持的問題了,而是選擇的問題。你要你的操作系統(tǒng)不但支持 x86 還支持 arm 么?你要把各種驅(qū)動程序都完善么?你要做優(yōu)美的圖形化界面么?你要深入學(xué)習(xí)顯卡方面的編程么?你要加入制作國產(chǎn)操作系統(tǒng)的大軍么?

我的選擇是不,所以我止步于此了,因為我是

因為我當(dāng)初決定入坑的時候,是為了對我現(xiàn)在所做的工作有更深入的理解。我是個軟件工程師,是 Java 程序員,并不是專門做嵌入式,專門做內(nèi)核開發(fā)的從業(yè)者。所以我認(rèn)為再往后繼續(xù)深入可以,但已經(jīng)沒必要向前中期那樣集中火力搞了,而是利用閑散時間能多了解就多了解,按需學(xué)習(xí)。

當(dāng)然你也可以選擇繼續(xù),我覺得不論是止步于此,還是繼續(xù)往下走,都是有好處的。

我的經(jīng)歷小結(jié)

  • 冷啟動:《30 天自制操作系統(tǒng)》

  • 初期:《操作系統(tǒng)真相還原》

  • 中期:《linux 內(nèi)核設(shè)計的藝術(shù)》《linux 內(nèi)核完全注釋》+ linux0.11 源碼

  • 后期:止步

這個系列要寫什么

要寫一個極簡的操作系統(tǒng)教程,帶你入坑

如果說屬于上述哪個階段的教程的話,我覺得處于冷冷啟動階段,因為無論是冷啟動、初期還是中期,都有讓人放棄的點,而這個冷冷啟動階段的極簡教程,會讓你在上面的各個階段,都不那么容易放棄。

我曾經(jīng)寫過這樣的系列,但一開始總是定很大的目標(biāo),期待讀者除了我的系列文章外,不需要讀任何資料就可以完全按照我的教程完成一個操作系統(tǒng)的制作,但往往很不現(xiàn)實,也沒有必要,完全不是一個系列文章該做的事。下面是我在博客園折騰的系列們...

系列文章無法做到足夠細(xì)致,只有大部頭的書籍才能做到這一點。但上面的每一本書,部頭真的都非常大,很容易讓人放棄,從而錯失一本好書和一個入坑的機會,我在每本書上都放棄過兩三次。而網(wǎng)上,簡單的自制操作系統(tǒng)的文章,又過于簡單,完全無法讓人達(dá)到入坑的標(biāo)準(zhǔn)。

所以為了解決這個痛點,我決定根據(jù)自己的經(jīng)歷,結(jié)合書本上的知識,反思之前寫過的教程中的一些缺點,出這樣一個極簡教程的系列,其知識密度介于大部頭書籍和網(wǎng)上的文章之間

該教程的核心目標(biāo)是,讓讀者對制作一個操作系統(tǒng)的核心流程應(yīng)該掌握的知識需要經(jīng)歷的過程,和需要克服的心理障礙,做到心中有數(shù),不再畏懼,做好入坑自制操作系統(tǒng)的正確姿勢。并且在深入學(xué)習(xí)的過程中,不斷的會有“哦,原來這個系列說的 xxx 就是這個意思呀”的正向反饋,這一點是非常重要的。因為技術(shù)的學(xué)習(xí)過程中之所以會放棄,一個原因是興趣不夠,另一個原因就是“我理解了”這種正向反饋不夠。那本系列,我希望會在你后續(xù)深入學(xué)習(xí)的過程中,這個系列的影子會一直陪伴你,給你這種正向反饋和繼續(xù)下去的動力,當(dāng)然,最好還能讓你提升興趣,甚至讓本不想親手制作操作系統(tǒng)的人,也打開這個新世界的大門。

本來還想寫個目錄,后來想想算了,中途的思路很可能要根據(jù)實際情況來調(diào)整,就當(dāng)作給大家的期待吧。

先送你一份入坑禮物

這可能是 全網(wǎng)最簡單的操作系統(tǒng) demo,啥也不能干,就做到了能接受鍵盤參數(shù)往屏幕上打印。最誘人的一點就是,如果你是 Windows 操作系統(tǒng),你直接源碼下載下來,點擊 run.bat,不用安裝任何環(huán)境,直接就可以運行。這可能是好多入坑小伙伴夢寐以求的一個 demo 吧,地址奉上:

https://gitee.com/sunym1993/flash-4th-os.git

flash-4th-os 運行截圖

為什么是 flash-4th-os 呢?因為我英文名叫 Flash,然后我寫的前三次都放棄了,這是我寫的第四個,哈哈哈。


推薦閱讀

?? ?吳師兄實名吐槽 LeetCode 上的一道題目。。。?? ?面試字節(jié)跳動時,我竟然遇到了原題……????計算機專業(yè)的學(xué)生怎樣練習(xí)編程才能把編程學(xué)精通??? ?為什么 MySQL 使用 B+ 樹?? ?一道簡簡單單的字節(jié)跳動算法面試題


歡迎關(guān)注我的公眾號“五分鐘學(xué)算法”,如果喜歡,麻煩點一下“在看”,點擊左下方閱讀原文,獲取谷歌師兄的算法刷題筆記。

總結(jié)

以上是生活随笔為你收集整理的自制 os 极简教程1:写一个操作系统有多难的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。