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

  

廢話

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

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

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

     

  我固然爲本身這樣作要找一個藉口, 這本書當然是好書, 但以個人毅力和空餘時間來看, 不適合從頭至尾跟着作.函數

  雖然以前作了錯誤的決定, 這並不意味這我沒有任何收穫, 書裏面有不少有趣的思路, 好比用循環隊列+死循環來處理中斷(相似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總以爲好麻煩.

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

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


  https://github.com/LastAvenger/OS67spa

  我想從新作一個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

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

貼一張圖吧?

 

相關文章
相關標籤/搜索