一个人写的操作系统 - Sparrow OS
一个人写的操作系统 - Sparrow OS
自己写一个操作系统,这是在过去的几年里我一直为之努力的目标,现在终于完成了。
缘起
自己动手写操作系统的动机最初来自于学习Linux遇到的困难。
我是一个Linux爱好者,这里所说的Linux主要指内核。但我的工作从来都没有与Linux联系得上:一开始的几年是做嵌入式Linux手机上的一些应用,在爱可信(ACCESS)和三星(Samsung)工作过;再后来到了爱立信(Ericsson)做3G通信,工作内容与操作系统内核离得更远了。
从大学时代动手配置和编译内核开始,一直对Linux念念不忘,但是总也没有足够的精力去深入学习。看过很多内核方面的书,但是理解得终究是比较肤浅。读代码也不容易,因为内核的代码已经足够庞大和复杂,不太容易入手。
在2010年底的时候,我终于想到了一个突破性的办法:仿照Linux,自己写一个系统。这样做有两个好处,一是当你要完成一个功能的时候,必须要参考Linux的实现,而且必须学懂学通,关键的技术不能绕开,不然自己的系统就运动不起来;二是自己写的小型系统必然以实现基本功能为最大目标,会自然地撇下复杂的高级功能,只关注核心部分,这样在学习Linux的时候针对性就更强,目标明确。
我一直喜欢玩ARM开发板,以前在爱可信工作的时候我就买了S3C2410开发板,在上面移植过DirectFB桌面系统。还一度曾尝试过在上面设计和实现一套3D桌面管理器,但最终因为难度和工作量太大而失败。后来又买了S3C6410X的开发板。
所以我对ARM的架构还是比较熟的,而且也很看好ARM的前景。所以最终决定做一个嵌入式的系统,一开始只支持ARM架构,也只支持S3C6410X一种芯片。
名字
这个系统可以功能简单,但是一定要有现代操作系统的基本功能,比如页式内存管理,多任务等等。所谓“麻雀虽小,五脏俱全”,“麻雀/Sparrow”是我能想到的最符合自己初衷的名字,就叫这个了。
我还为这个系统制作了一个logo:
过程
带着这样的目标,我在2011年春天上路了。
万事开头难。但是事情也有另一方面:一旦你决定开始了,困难都会给你让路。在最开始的阶段,我很幸运地找到了一本书《一步一步写嵌入式操作系统— — ARM编程的方法与实践》,给了我非常大的帮助。这本书的内容也是讲怎样一点一点地搭建起一个操作系统,而且它也是基于ARM处理器的,真是太巧了。它对一些基本原理讲解得非常非常详细,比如处理器的不同模式、MMU的原理以及中断处理代码的设计等等,很多章节我读了一遍又一遍。但这本书的内容比较简单,我的系统的复杂性很快就超过了这本书的覆盖内容,当我开始设计内存分页管理功能的时候它就已经帮不上忙了。
在实现这个操作系统的过程中,我一直牢记这样一条准则:写一个自己的系统不是目的,目的是学习Linux。所以在每开发一个新的功能时都遵循了同样的过程:先学习Linux的设计,完全弄懂原理之后再写自己的设计。而且往往前者的时间比较长。
Sparrow的整个开发过程历时三年(从最开始的准备到现在整理文档)。这个过程听起来太长了,那是因为所有的学习和开发都是在业余时间完成的,而且中间开了几次小差。不过小差也有创造:
- 2012年上半年创造出一个可爱的小男孩,现在可以到处跑了;
- 2012年下半年“分形艺术”的火苗重新点燃,写了一个分形图案生成器,名字叫PyFractal,目前也在GitHub上;
- 2013年初制造了三个精美的蒸汽火车模型,在Flickr上能找到它们。
除去耽搁的时候,Sparrow的开发过程是一年半,业余时间。粗略估计了一下,大约是1200个小时。
对于Sparrow,我的最初构想很简单:只要能同时运行两个进程,每个进程打印"Hellow"然后休眠一会儿,并不停地重复这个过程。最终,Sparrow要比预期强大得多,它可以运行更多的进程和更复杂的功能。我在Sparrow上写的最大的应用程序是一个“数独”游戏,它可以生成一个数独迷题并解决。
感悟
最大的感悟是关于“坚持”。
用大把的业余时间来独自推进一个项目是有挑战的,特别是当你遇到挫折的时候。不记得有多少次,面对那些已经花去了你很多个小时,但仍然看不到希望的技术难题时,信念就变得非常脆弱,自己不停地问自己“继续做下去到底有没有意义”。对意义的怀疑常常让人放弃。
能够坚持把这件事做完也多亏了我妻子的支持,她承担了大量的家务,让我每周六都能专心于这项工作。
分享
Sparrow的全部目前都放在GitHub上面,包括代码、文档和tool-chain。
我相信,即使Sparrow看上去有点意思,也不会有人去研究它的代码。但文档却更能帮助别人。
在这个项目的后期,我精心整理了一批文档用于分享。
如果我写一份面面具到技术文档,枯燥程度足以逼退每一个人;如果其中能有一些插图,读者会感觉好一些;而如果以图片为主,文字很简练的话,可能很多人会乐于翻看一下。
最初我制定了一个详细的文档计划,按照那个计划,最终将会完成一份超过100页的完整设计文档。当我完成最初的10页之后,就果断放弃了。因为我意识到,写文档更主要是为了分享给别人,但那么冗长的文字并不能达到目的,更何况是用英文。
最终我决定把文档制作成ppt,尽可能多地用图片而不是文字,而且只写重要的内容。并且选择了比较卡通的模板,尽可能地让读者感觉轻松。
至于文字就还是用英文了。文字既然少了,也就没有翻译的困难;而且这样可以避免一些术语方面的歧义。
从下一篇开始,我将每天更新一份文档,总共12篇,希望对别人有所帮助:
Chapter 01: Introduction
Chapter 02: User Guide
Chapter 03: Process
Chapter 04: Memory Management
Chapter 05: Boot Memory Allocator
Chapter 06: Page Allocator
Chapter 07: Slab Allocator
Chapter 08: User Space
Chapter 09: File System
Chapter 10: Interrupt
Chapter 11: Tracing
Chapter 12: Programming Guide
作者
本人(赵凤阳)现工作于南京爱立信。您可以通过michael2012zhao@gmail.com找到我。
在CSDN的博客里断断续续地写过一些东西:http://blog.csdn.net/fyzhao或者http://blog.csdn.net/michael2012zhao
在新浪博客也有:http://blog.sina.com.cn/u/3649608795
还有微博:@_第二月_
我有一个网站,但一直疏于维护。不过如果您细心,可以找到一些集邮、蒸汽机车、唯识宗以及《红楼梦》方面的东西:http://www.2ndmoon.net/