「30天自制操作系統」 Stop & 「OS67 」 Start


  

廢話

  整個十月都沒有再寫一點什么, 其實沒什么好寫的, 把書里的東西碼出來貼在博客里實在沒什么意思, 況且書里已經寫得夠詳細了.

  這本書給我最深刻的感覺是, 作者通過簡化一些細節, 一步一步地模擬整個開發過程, 把做一個操作系統中最有趣的部分展示了出來. 最大的簡化大概使用了他那一整套工具, 把編譯出裸機可用C語言程序這一個麻煩給忽略了.

  經過一個多月的練習, 已經完成了700頁中的300多頁, 最后大概是停留day 12這里, 我開始有點厭倦. 從一開始完成一點功能就很興奮, 到最后發現自己只是不停地抄實例代碼, 所以我決定停下來, 這一停就是一個多月.

     

  我當然為自己這樣做要找一個借口, 這本書固然是好書, 但以我的毅力和空余時間來看, 不適合從頭到尾跟着做.

  雖然之前做了錯誤的決定, 這並不意味這我沒有任何收獲, 書里面有很多有趣的思路, 比如用循環隊列+死循環來處理中斷(類似Windows里面的消息泵), 如何繪制出鼠標, 用緩沖區來避免畫面閃爍, 作者提供的方法不見得是最高效的做法, 但卻讓我知道這些東西可以這樣實現, 這在動手做之前我是沒有想過的, 作為一本講操作系統的最簡單的書籍, 它簡化了硬件細節, 總還是能對整個計算機組成有個大概的把握.

  當然不止這些, 在這個過程中我還收集了很多零碎的知識, 就像點亮技能樹一樣, 在做這個項目的過程, 你感覺這樣不方便, 於是去網上尋求一種更好的操作途徑.

  • (最大的收獲)我需要在Shell, Makefile, 匯編, C語言直接切換着編輯, 之前一直在用的Code::Blocks顯然沒有這個功能, 記事本又不能忍, 所以我就去學了vim, 從此再也離不開:w , 又順手用了火狐的pentadactyl.
  • Makefile讓我知道如果不借助IDE的話, 一個項目是怎么被編譯的.
  • 我的代碼放在一個目錄, 書里的示例代碼在另一個目錄, 為了跳轉方便又用了它Total Commander, 雖然只用了最簡單的功能.
  • 每次打完代碼把整個目錄<c-c>再<c-v>一點都不Geek, 所以就開始用Github, 不得不說GitHub 的Windows客戶端操作簡便又直觀, 后來環境換到了Linux每次add + commit + push總覺得好麻煩.

  其實上面這些只是花幾天或者幾個小時就能學會的小技能, 但如果不是做這個的話, 我想短期內我是不會有動力去學習的.

事實上我還得承認是我沒有堅持做完它, 棄坑是一件挺丟人的事情, 但這並不是終點, 而是另一個開始.


  https://github.com/LastAvenger/OS67

  我想重新做一個OS, 和上次的區別是, 這次我用了現在流行的編譯工具鏈, 在Linux下的make + gcc + nasm + ld, 結合網上的各種教程, (其實網上很多的, 尤其是國外, 只是一開始孤陋寡聞沒有聽說過, 當然現在也好不到那里去).

   不知道話會不會說太早? 前面有多少困難呢?

一些要注意的

      對一些不了解的人來說, 編寫操作系統聽起來很高大上,  網上充斥的各種操作系統教程也只是一個簡單的bootsector, 無非是兩個關鍵字: 0x7c00 和 0xAA55,  只能當做匯編的練習而已, 再進哪怕一步的, 如果有, 也都是按書上的做的(於淵的Orange's, 30 天, Liunx 0.11), 再發到博客上, 基本不能講清楚問題(這里突然覺得我之前發的那些博客蠢到家了).  要想更好地了解, 直接看於淵的Orange's, 30 天, Liunx 0.11就好了.

     網上的資料當然不止這幾本書, http://wiki.osdev.org/Main_Pagehttp://www.osdever.net/tutorials/是OS的Wiki網站, 

另外有一個教程叫 Bran's Kernel Development Tutorial寫得簡明易懂, 大概我會在里面抄很多代碼, 而且國內竟然有完整的翻譯版, 感謝譯者huigezi.

「x86匯編語言 從實模式到保護模式」 這本書也是值得借鑒的.

以上的書我沒有完全看完, 但里面確實涵蓋了全部的知識, 問題在於看得懂看不懂而已.

     有了教程, 就可以着手制作了, 你需要了解一點匯編語言和C語言. 一開始比較重要的是保護模式和C語言的編譯鏈接.

比如分段有什么用, GDT IDT里面放的是什么, CPL, DPL, RPL 的不同作用, 特權級的轉移,  個人認為這是一個接受與否而非理解與否的問題, 有時候真不明白為什么CPU里面要加入這些奇奇怪怪的規則, 但實際上除去歷史原因, intel的設計者們肯定是比我等厲害得多, 先接受它這種奇怪的機制, 慢慢的就會理解保護模式了. (當然細枝末節我還是記不住的.

     如何用C語言寫內核? 一開始這真的無法想象的, 而且我百度了好久都無果, 我看到的幾乎所有中文教程都忽略了這一步, 而偏偏Orange's的內核是先用匯編解析ELF,再用C編譯出ELF格式的內核的, 而我需要的是一個純二進制的內核, 當然最終我求助於知乎的某個前輩, 從他提供的Bran's 的教程里面找到了答案, 在此表示感謝.

  要生成一個二進制的內核, 你需要在匯編寫的loader里面指定C語言里面的入口函數, 並在合適的時候跳轉到他, 比較重要的地方是C編譯器的編譯選項,(之前我不知道有那么多的選項, 做題的時候一律gcc -o), 你要對程序編譯的流程有一點點的了解, 你才能理解這個過程, -> 指定參數讓gcc不引用任何標准庫, 使用自己的頭文件, 而且只生成目標文件(你還可以生成一份gas的匯編文件用以對照), 然后在鏈接的時候合並好loader與kernel的各個段, 具體的做法參見: https://github.com/LastAvenger/OS67/blob/master/makefile https://github.com/LastAvenger/OS67/blob/master/kern/link.ld

說實話我也不能完全理解, 但至少程序跑起來了.

貼一張圖吧?

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM