其实操作系统不是个clean problem,我个人是认为写编译器对学习、工作的帮助更大啦(大很大,比更大更大),并且更干净(比干净更干净)更好写(比好写更好写),当然不可否认操作系统看上去是挺高深莫测的。。(而且挺没用的。。。我认为主要原因是很多人没学好cpu原理,觉得底层的一切都那么神奇,并无限渲染放大「底层高手论」。。。学EE的同学,大部分不还是被坑了)
如果你执意要写操作系统的话。。。
我的建议如下:
学习、理解CPU,自己设计一个指令集,这个主要是让你明白计算机是怎么工作的,在没有OS的情况下如何使用。
你最好能对这个指令集写一个模拟器,写不出来,是因为你对理论和原理掌握不够。
如果你想要简单,可以采用stack-based模型,但是其实register-based模型用起来更方便也更熟悉。
学习OS其实不应该用x86这种工业品,太脏太杂,就算用也可以只用一个子集。所以如果上面自定义指令集的cpu模拟器你写出来后,就可以扔掉x86了。
如果你不扔,用x86也不必看什么保护模式之类的东西,脏自己的手。
——————————
一个简单的OS,应该由这三部分组成:
进程管理
内存管理
驱动程序
——进程管理——
理论知识不表,实践上,你应该实现这两个函数:_execute和_exit
而且你如果实现单进程OS,那就更简单了,多进程就是多点苦力活。
_execute用来开一个进程,做的事情是保存当前寄存器状态,设置新进程属性,然后让新进程开始执行。
_exit用来结束一个进程,做的事情是结束当前进程,恢复到上一个进程的状态。
状态保存在一块特殊的内存区域内,按照x86的做法,是用一个寄存器以stack的方式来管理那段内存,那个寄存器叫SP
——内存管理——
内存管理也是两个函数:_alloc和_free
内存管理其实也很简单,_alloc的时候,记下size和地址,放入一个链表中,_free的时候,遍历链表,把那一块相应的记录标示一下,这个理论知识也说过,最好用装箱问题那一套解法,但其实你就裸来就可以了。。。反正是简单操作系统,原理比算法重要得多。
这样管理内存足矣,再高级点的话,现在的OS都带有分页功能,这个理论上也写了,你照着看就是了,话说前几天还做梦梦到页面置换算法来着。。。这个算法在我梦中的形象是一根白萝卜片烤串。。。
——驱动程序——
显示设备:
现在的显示设备都是光栅(raster)技术,光栅其实就是像素点。。意思是屏幕由无数像素点组成。
用一段内存来当做显示设备的source,比如显示器是400*300的,不考虑颜色,就用一字节代表一个点,那就要开一块400*300的内存当显存,显示设备每帧通过对这块内存的扫描来实现显示功能。
你的显示设备驱动需要实现的函数也很简单,大致就是_drawPixel、_drawLine、_drawRectangle、_drawCharacter之类的。
这几个东西你可以看看我写的一个答案里面的例子
地址是能不能设计出一个终极傻瓜编程软件,让普通人可以完美编程? - 知乎用户的回答
当然那个例子还是太简单了,因为是伪光栅,实际上画线算法要麻烦一点,这个图形学的书上会有写,不过你搜点博客看看就好了,很简单,无非是套公式计算而已,没必要自己想。如果这样写的话用汉编没个把小时很难调试正确。。。还不如汇编。所以我的例子就用伪光栅了。。。
显示字符的方法是这样的,对于每个字符,你都要画一份字符的图片(最简单的就是一个m*n的像素图),然后_drawCharacter函数的实现是把这个字符的图片复制到显存中去(你想象一下,体会一下我说的脏是什么意思。。。。)
输入设备:
键盘,一段内存空间映射成按键,通过对这段内存的操作来实现输入。
当然还有文件系统啊鼠标啊什么的,但其实没有文件系统也没什么,本来硬盘就不是计算机的标配,鼠标更不是必须,而且鼠标要配合GUI或者字符GUI来用,那就更脏了,所以就这样吧。。简单操作系统嘛
你或许会觉得我说的东西很奇怪,和书上讲得不一样,但其实操作系统就这么回事,书上写得太深层太详细了,我不是说书写得不好,书很好,很理论,但是你看书的时候应该要学会看到它背后的意思。
书会告诉你这是什么,有什么用,甚至为什么要这样,但你要学会思考「如果不这样会怎样?」
好,现在你可以在这个操作系统上实现一个俄罗斯方块(其实贪食蛇更好实现,让我写俄罗斯方块不如杀了我。。。)来忽悠那帮老师了。
否则他们会问你:「这黑乎乎的就就算完事了?写的什么东西!」
不过这里还是真诚建议楼主,不要写操作系统,付出远大于回报,写编译器吧。
你还年轻,以后实在想写,再写不迟