整个十月都没有再写一点什么, 其实没什么好写的, 把书里的东西码出来贴在博客里实在没什么意思, 何况书里已经写得够详细了.git
这本书给我最深入的感受是, 做者经过简化一些细节, 一步一步地模拟整个开发过程, 把作一个操做系统中最有趣的部分展现了出来. 最大的简化大概使用了他那一整套工具, 把编译出裸机可用C语言程序这一个麻烦给忽略了.github
通过一个多月的练习, 已经完成了700页中的300多页, 最后大概是停留day 12这里, 我开始有点厌倦. 从一开始完成一点功能就很兴奋, 到最后发现本身只是不停地抄实例代码, 因此我决定停下来, 这一停就是一个多月.vim
我固然为本身这样作要找一个借口, 这本书当然是好书, 但以个人毅力和空余时间来看, 不适合从头至尾跟着作.函数
虽然以前作了错误的决定, 这并不意味这我没有任何收获, 书里面有不少有趣的思路, 好比用循环队列+死循环来处理中断(相似Windows里面的消息泵), 如何绘制出鼠标, 用缓冲区来避免画面闪烁, 做者提供的方法不见得是最高效的作法, 但却让我知道这些东西能够这样实现, 这在动手作以前我是没有想过的, 做为一本讲操做系统的最简单的书籍, 它简化了硬件细节, 总仍是能对整个计算机组成有个大概的把握.工具
固然不止这些, 在这个过程当中我还收集了不少零碎的知识, 就像点亮技能树同样, 在作这个项目的过程, 你感受这样不方便, 因而去网上寻求一种更好的操做途径.学习
其实上面这些只是花几天或者几个小时就能学会的小技能, 但若是不是作这个的话, 我想短时间内我是不会有动力去学习的.网站
事实上我还得认可是我没有坚持作完它, 弃坑是一件挺丢人的事情, 但这并非终点, 而是另外一个开始.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_Page和http://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
说实话我也不能彻底理解, 但至少程序跑起来了.
贴一张图吧?