Sparrow操作系统的回顾与总结

到今天为止,Sparrow操作系统的设计文档已经全部发布,代码也不准备继续更新了。在“自己写操作系统”这事儿完成之前,做一个总结。

一个真正的操作系统没有“完成”的时候,但是Sparrow操作系统作为一个“习作”和个人的项目却可以在合适的时候说“完成”,因为它目标明确。最初设计Sparrow系统的目的就是学习Linux内核最基本最核心的部分,现在这个目的达到了。而Sparrow系统上虽然还有很多事情可以做,但是继续投入大量的时间去改造和完善就又与初衷不符了,我认为现在是合适的时刻结束了。

回顾Sparrow

现在回头再看Sparrow,仍然有一些让自己觉得遗憾的地方:

  1. 没有驱动层。Linux的发展在很大程度上得力于它优秀的驱动程序机制,这个机制让Linux能广泛地支持各种设备。驱动程序的开发和驱动机制的进化也是Linux内核最活跃的一部分。Sparrow没有实现这个强大的机制,因为Sparrow使用的设备非常少,跟体系结构相关的特殊设备大概只有串口UART一种,所以就没有把这一块做得太复杂,只是做了一层薄薄的封装。
  2. 支持的芯片少。现在Sparrow只支持S3C6410这一种CPU。其实最开始的计划是最终支持S3C2410、S3C2440和S3C6410三种,以S3C6410开始,完成之后再加入另两种芯片。这个过程会涉及到一些抽象和封装,所以将会是练习代码重构的好机会。这个计划后来取消有两个原因:一是后来认识到这三种芯片其实大同小异,没有很多重构的挑战,练习的意义不大,而对于其它的非ARM芯片,又没有太大兴趣;二是在开发Sparrow的这几年里面,我已经系统地学习了设计模式和重构方面的知识,这个练习已经显得太小了。
  3. 宏内核与微内核。现在的Sparrow是宏内核,但最初我想把Sparrow设计成为一个可以在宏/微架构之间切换的系统,通过配置来选择构建成宏内核还是微内核。微内核方面的学习准备参考Minix系统。这个想法即使到现在我也仍然觉得有点意思,但最终放弃是因为现在我有了一些Linux内核知识作基础,再去学习Minix的微内核会容易一些,不需要再用“照着写一个”的办法了(老实说,这个办法的效率不算高)。
  4. 项目管理。我把Sparrow做为自己经营的一个项目,曾一度在开发的过程中实践过项目管理的技巧。我使用的方法是Scrum,自己以一个星期为Sprint,在开始的时候做plan,并且breakdown成一个个小的task,还自己在小白板上画过burndown曲线。不过问题在于参与项目的人只有我一个,即使没有这个流程我仍然可以把过程管理好,不会有冲突发生,这个流程也就流于形式,所以最终废弃了。如果我从一开始就拉上几个朋友一起做的话,故事可能会不同。

关于测试

除了那些令人遗憾的地方,也有一些心得,我想特别说一下关于测试的事。

Sparrow的单元测试比较充分,这是在一开始就决定的,其初衷是控制风险。内核技术是复杂的,多个“子系统”互相牵扯,而如果一些基础功能不稳定的话,在开发较高级的功能时出现问题就会很难解决。到那时我就得独自面对一团乱麻一样的问题,没有合作者,没有帮助,会浪费很多的时候,甚至让整个项目进展不下去。

为了避免这样的风险,我在每开发完一项功能之后就马上设计单元测试(使用cUnit框架),现在几乎所有与体系结构无关的代码都有单元测试来保证质量。

在Sparrow内核的各个子系统中,内存管理是最健全最稳定的一个。采用了页式存管,并划分出了用于系统启动期间使用的BootMem Allocator、实现Buddy算法的核心内存管理器Page Allocator以及高效的Slab Allocator这样三个层次。

存管系统也是Sparrow内核最复杂的一部分,对它的测试算得上“苛刻”:在内存分配器测试中有这样一个用例,它不断地以随机大小来申请内存,直到内存耗尽,再以随机的顺序来释放所有这些内存,然后查看内存的状态是不是复原。然后再来一次。。。

在测试中的确发现过一些藏得很深的问题,花了不少精力去debug。这样做是值得的,在后来的开发中,内存管理功能没有引起过任何麻烦,特别是在调试进程虚拟空间(栈和堆)的时候,可靠的内存管理让我得益不少。

关于文档

对于Sparrow的文档,我的期望是它能让读者对这个系统的设计“观其大略”,不必太深究细节,所以用了较多的图和较少的文字。如果您需要细节信息的话,不论文档怎么样你都还是会阅读源代码,而Sparrow的代码量并不大,很容易掌握,所以过细的文档在这里用处不大。

比如《[Sparrow OS 设计文档连载(十一)] Tracing》那一章最后的环形缓冲区原理图,如果您在一睥之下能了解到环形缓冲区是一个封闭的区域,打印信息在里面循环更新的话,就已经获取到最有价值的信息了,细节可以到需要的时候再去关心。

画图并不轻松,能让图示形象地表现出抽象的原理是很有挑战的。如果我的图片让您觉得不知所云的话,那完全是我的水平问题,请见谅。

Sparrow的后续维护

Sparrow的全部内容一直都稳定地托管在GitHub上面,它还将一直在那里:https://github.com/michael2012z/Sparrow

同时我还会把所有的东西在我的个人网站上保存一份:http://www.2ndmoon.net/Sparrow/

我在Github上面没有做任何权限方面的限制,也无所谓版权了,我非常愿意让它保存开放。如果您感兴趣,可以继续发展它。

写在最后

Sparrow即已完成,也就已经成为了过去,不应该为这一点成绩(其实算不得什么成绩)而沾沾自喜,如果再喋喋不休就更不好了。

Sparrow操作系统的事就说到这里,但我对内核技术的学习还将继续。

谢谢您的关注。

Sparrow操作系统的回顾与总结相关推荐

  1. 我是如何学习写一个操作系统(二):操作系统的启动之Bootloader

    前言 今天本来的任务看书和把之前写的FragileOS整理一下,但是到现在还在摸鱼,书也只看一点.后来整理了一下写这个系列的思路,原本的目的是对操作系统原理性的学习和对之前写的一个玩具型操作系统的回顾 ...

  2. 2022 年 3 月 — 区块链操作系统的开发回顾

    我们致力于让我们的社区了解来自 Cartesi Machine.Cartesi Rollups 和 Noether 的最新发.开发进展. 让我们来看看我们在创建一个 DApp 生态系统可以蓬勃发展的家 ...

  3. 2022 年 4 月 — 区块链操作系统的开发回顾

    区块链操作系统组件的最新开发更新 作为总结,请参阅我们最近发布的路线图,了解区块链操作系统组件的概述: The Cartesi Machine Cartesi Machine 是 Cartesi 的确 ...

  4. Jeff Dean回顾谷歌2021

    Jeff Dean回顾谷歌2021 新年伊始,谷歌AI掌门人Jeff Dean的年度总结「虽迟但到」,这篇万字长文系统回顾了过去一年来机器学习领域的五大趋势.除了超大AI模型,谷歌去年还做了啥? 20 ...

  5. 上周新闻回顾:Vista麻烦不断 Office波澜再起(2.26-3.4)

    上周是春节之后第一周,总体说来IT网络技术市场比较平静--也许是中国的影响力越来越大的原因,全球似乎也都在和中国一起放假. 看点一:各方面报告陆续出台 有人欢喜有人愁   2007过去2个月之后,各大 ...

  6. FPGA逻辑设计回顾(11)FPGA以及PC中的RAM与ROM

    文章目录 前言 RAM以及ROM在计算机中的应用 什么是存储器? 什么是硬盘驱动器? 其他类型的存储器 什么是RAM? RAM的类型 SRAM DRAM 什么是ROM? ROM的类型 掩膜ROM PR ...

  7. 51单片机多任务操作系统的原理与实现

    写在前面的话:这篇文章值得看十遍.分享一下 51单片机多任务操作系统的原理与实现 -- 一个超轻量级的操作系统 前言 想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧.我不一定能 ...

  8. 回顾我走过的编程之路

    前些日子被华南理工大学软件学院邀请回去参加一些活动,其中包括跟一些师弟师妹们进行座谈.期间就有一个人问,要怎么样才可以去微软.其实我从来没有想过这个问题,所以那个时候的答案自然就是微软的广告(编程好, ...

  9. 鸟哥的Linux私房菜(基础篇)-第三章、主机规划与磁盘分区(三.4. 重点回顾)

    第三章.主机规划与磁盘分区 最近升级日期:2009/08/06 4. 重点回顾 5. 本章习题 6. 参考数据与延伸阅读 7. 针对本文的建议:http://phorum.vbird.org/view ...

最新文章

  1. 注册表 ControlSet001、ControlSet002以及CurrentControlSet
  2. 怎么用pycharm更新python_利用PyCharm操作Github(仓库新建、更新,代码回滚)
  3. 通用mapper 如何处理多表条件查询通过list封装(一对多)
  4. java log4j 实例_log4j使用例子 - 小代码2016的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. cdn 内容分发 资源放在更接近用户的网络边缘
  6. Java继承结构中类的初始化
  7. 各编程语言用途及分类
  8. VBox下频繁出现0x00000000指令引用的0x00000000内存,该内存不能为written:解决方案(附文件)
  9. 程序设计基础java_Java程序设计基础
  10. 数据结构_树与二叉树总结
  11. java计算机毕业设计H5女娲宫旅游网站设计与实现源码+mysql数据库+系统+lw文档+部署
  12. 一些对模糊搜索的思考
  13. java android时间工具类 week 月年
  14. 游戏中子弹的回收重用
  15. c语言编程酱油和醋互换,c语言 有两个瓶子A和B,分别盛放醋喝酱油,要求将他们互换...
  16. No.5 Python数字
  17. CEO、COO、CFO、CTO是什么意思?
  18. 如何做好数据治理平台
  19. 读书笔记 之《Thinking in Java》(对象、集合)
  20. K3S和 K8S 有何不同?

热门文章

  1. 不能错过的徒步欢乐:从秦皇岛到北戴河
  2. 如何在Google文档中添加文本框
  3. gee微端服务器系统设置,geem2微端服务器设置
  4. 单片机模拟iic从设备-主要代码(2)
  5. python12306抢票_Python 版 12306 抢票神器
  6. 470万条12306用户信息遭泄露
  7. C#、winfrom打印pnl订单窗体
  8. python中fabs什么意思_Python中abs()和fabs()方法之间的区别
  9. pngimg 可以商用吗_推荐几个个人收藏的外国高清、免费、无版权可商用的网站...
  10. 冰尘社补丁php,300英雄冰尘社盒子ios