一个人写的操作系统 - 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/
一个人写的操作系统 - Sparrow OS的更多相关文章
- 自制 os 极简教程1:写一个操作系统有多难
为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...
- 《一步一步写嵌入式操作系统》读书笔记1—Skyeye介绍、安装和HelloWorld
2013-11-14 最近在看<一步一步写嵌入式操作系统>,感觉此书甚好,许多地方讲得很清楚.可操作性强,计划边读边实践边写笔记,希望能够逐步熟悉嵌入式操作系统底层的东西,最终剪裁出一套实 ...
- 第三周作业、实时操作系统µC/OS介绍及其它内容
作业要求 见<实时控制软件设计>第三周作业 1 阅读笔记--µC/OS 1.1 基本介绍 µC/OS是由Micrium公司研发的实时操作系统,以µC/OS-II或µC/OS-III为内核, ...
- 回顾苹果操作系统Mac OS的发展历史
在新的MacBook AIR和Mac OS X Lion即将发布之际,我们仅以此文向伟大的苹果和乔布斯致敬.并祝Apple教主乔布斯早日康复,长命百岁,千秋万载,一统苹果! Mac OS是指运行于苹果 ...
- 我是如何学习写一个操作系统(二):操作系统的启动之Bootloader
前言 今天本来的任务看书和把之前写的FragileOS整理一下,但是到现在还在摸鱼,书也只看一点.后来整理了一下写这个系列的思路,原本的目的是对操作系统原理性的学习和对之前写的一个玩具型操作系统的回顾 ...
- 那些用JavaScript写的操作系统
之前有人说过Chrome是新的C语言运行环境(Chrome Is The New C Runtime) ,不过笔者更倾向于Web是新的C语言运行环境,而且这种技术绝对没有版权问题,也绝不会被一家公司垄 ...
- 苹果操作系统Mac OS X
OS X 是先进的操作系统.基于坚如磐石的 UNIX 基础,设计简单直观,让处处创新的 Mac 安全易用,高度兼容,出类拔萃. UNIX 之威力,Mac 之简单OS X 既简单易用且功能强大.所有的一 ...
- python 操作系统模块 -- OS
os,语义为操作系统,模块提供了访问多个操作系统服务的功能,可以处理文件和目录这些我们日常手动需要做的操作.os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路 ...
- VMware 8安装苹果操作系统Mac OS X 10.7 Lion正式版
今天介绍下VM8下安装Mac OS X 10.7 1.工具篇 下载Vmware Workstation 8.0正式版http://115.com/file/bhyk1l2u# ...
随机推荐
- nanakon
1.安装python pip3 install tornado pip3 install pymysql pip3 install qiniu pip3 install pillow 2.安装mysq ...
- mysql在update时,从其他select结果集更新表
需要使用join,例如 select g.id,g.res_count,count(gr.r_id) cnt from mb_game_res gr left join mb_game g on gr ...
- oracle 常用语句
创建用户及授权create temporary tablespace test_temp tempfile 'C:\oracle\product\10.2.0\oradata\hszxdbtemp.d ...
- PubSub的一种实现
今天在浏览JavaScript事件时,复习了下Dean Edward大神的addEvent.突然觉得可以基于他的思路实现一个结构更好的PubSub. 思路也很简单,就是要维护一个类似如下的一个仓库结构 ...
- Unicode和汉字编码小知识
Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...
- codeforces 340B Maximal Area Quadrilateral(叉积)
事实再一次证明:本小菜在计算几何上就是个渣= = 题意:平面上n个点(n<=300),问任意四个点组成的四边形(保证四条边不相交)的最大面积是多少. 分析: 1.第一思路是枚举四个点,以O(n4 ...
- MySQL安装(图文详解)
下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下!打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”,出现如下界面 my ...
- 使用ncc分析代码
1 ncc是一个编译器, 用于输出程序的一些调用信息等, 可以查看函数调用关系, 支持函数指针, 查看数据结构和代码. 可以用来分析和理解代码. “" ... with ncc, in le ...
- 设计模式 外观 Facade
外观模式的作用是简化接口.它提供一个统一的接口用来访问子系统的一群接口.通过这个高层接口使子系统更容易使用. 同时,通过外观将客户从组件的子系统中解耦. Head 1st中使用了家庭影院的例子来说明外 ...
- Python线程
原文出处: AstralWind 1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样). ...