废话
从初中的时候我就对计算机和程序之类的东西比较感兴趣,那时候某周玩电脑的时候就会写写代码啥的。其实最早的契机来源于打电动的时候,当时的网络游戏外挂挺多的,然后网络上的外挂软件多多少少要么没有作用,要么不大干净,于是某天我的脑子里面突然蹦出了一个比较鬼使的想法:“为什么我不能去学习怎么制作外挂呢?”
有了这个想法以后,我直接去百度“如何制作外挂”,借此也了解到了计算机的程序、内存和网络数据包之类的相关知识,同时也了解到了“易语言”这个东西,后来编程也成为了我最大的爱好......到现在,我仍对计算机相关的内容特别感兴趣,也不止编程,任何方面都想去学习,而编程也成为了我的职业。
高中的时候,我又有了另一个鬼使的想法:“我写了这么多代码,都是跑在系统上的应用程序,那我能不能自己动手写一个操作系统呢?”后来,我在网上了解到了《30天自制操作系统》这本书,这本书门槛比较低,不需要太多的基础知识,只需要跟着做就能实现一个图形操作系统,不过因为是高中嘛,能接触计算机的时间也不是很多,所以在跟着书上把系统实现出来以后就没有再去进一步了解了,当时仍有很多模块和功能的相关实现没有理解。
在上大学的时候,因为我有一定的计算机基础,所以学校专业课基本上也学不到什么东西(因为要么自己学过了,要么还不如我自己学得快),所以从大一开始,我就养成了逃课的“好习惯”,当然,我逃课也不是为了玩游戏,而是有时间去自学更多的东西。:) 有了一大段时间,我终于能用来研究一些自己感兴趣的东西了,于是我又重新拾起了高中丢下的操作系统,买了一堆操作系统相关的书(这里列一下方便大家参考《一个64位操作系统的设计与实现》、《X86汇编语言:从实模式到保护模式》、《Linux内核完全注释》、《操作系统真象还原》、《自己动手写操作系统》、《深入理解Linux内核》、《Linux设备驱动程序》),重新比较深地去学习了相关的知识,现在把学到的东西整理成一系列文章,方便随时进行参考和复习,同时也方便分享给大家。值得一提的是,我开发操作系统的思路也参考了一部分上述书籍,所以如果有读过上述书籍的同学,可能可以在该系列文章中找到其影子。
准备工作
2.1 需要的知识储备
我们的系统基本上都是基于C语言和汇编来进行开发,对于这两门语言的要求也会比较高,熟悉C语言和汇编的同学可能能够更快地理解相关代码。不过不是很熟悉的同学也不用担心,在使用到的时候我应该会详细说明用法(如果我记得的话)。
如果你的计算机组成原理、操作系统原理、C语言、汇编语言等相关知识不是很牢固的话,完成这个操作系统系列的学习,你将对这些知识有进一步的了解。
除了编程语言工具以外,由于操作系统需要对硬件设备和软件程序进行管理,所以一些算法也是必要的,关于算法这一块,我们在讲到相关功能的时候再详细介绍。
对于硬件方面,需要的电路相关知识储备不会太多,我们在开发时,如果遇到需要了解硬件电路的情况,可以去参考相关开发手册。
说到参考开发手册,如果要阅读手册或者其他相关资料,英语阅读能力也挺重要的,虽然可以借助翻译软件来阅读,但是当然自己有能力直接读更好,毕竟有些时候翻译软件翻译出来的内容跟正确内容差别还是挺大的,特别是技术文档这种专业术语比较多的东西。
2.2 相关参考资料及网站
这里推荐一些相关参考资料的网站:
Expanded Main Page - OSDev Wiki
这是一个wiki式的资料网站,里面能查询到大量开发操作系统所需的知识,这个系列也会引用到里面的相关内容。
这是因特尔的资料站,里面能找到大量的因特尔设备开发资料,一般来说读起来比较痛苦,但是这里面的内容是最全面、最权威的,后续的文章同样会引用到里面相关的内容。既然都说到这里了,需要提一句,本系列的操作系统全部基于Intel平台进行开发,所以AMD的CPU可能没有办法正常运行,这个我们在后面还会提到。
这是linux源代码的网站,linux作为一个较为完善的开源操作系统,我们在进行系统开发的时候也可以参考其中很多功能的实现方法。
暂时想到的就这些,如果还有其他的网站的话,后续在进行补充。
上面提到的几个网站都是全英文的,所以也体现出了英语的重要,像我这种英语不好的,读起资料来就特别痛苦。:(
2.3 开发进度简介
整个文章系列会分为几个部分:引导启动部分、内核开发、驱动开发、应用程序开发、C标准库开发。下面单独简单介绍一下:
引导启动部分:这一部分基本上完全使用汇编语言实现,主要的作用是将系统从存储设备中加载到内存中,并设置好相关基础功能(后续文章中详细介绍),然后将程序跳转到内核程序继续执行。这一部分设计到的知识点有FAT12文件系统、显卡功能设置、BIOS功能调用、CPU模式转换和初始化等。
内核开发部分:这一部分会使用C语言和汇编结合开发。主要涉及到的内容就是异常、陷阱和中断的处理、内存管理、任务调度、文件系统、设备驱动、系统调用等等。
驱动开发部分:这一部分会涉及到鼠标、键盘、硬盘、时钟之类的外部设备的驱动开发,这一部分会参考大量的相关资料,这一部分主要也是使用C语言进行开发。
应用程序和C标准库开发:这一部分会通过系统调用来完善C语言标准库(比如stdio.h等),并且根据这些系统调用和标准函数开发一些实用的外部应用程序,比如文本浏览器、图片查看器、小游戏甚至是图形渲染器等等。
下一章我们将简单介绍开发和测试环境,然后补充一些后续需要用到的相关基础知识。