你的位置:萧过无痕的栖息地 \ 分类:网络文摘 \ 文章正文

你准备好了吗? 开发自己的操作系统(1)

正在更新 @ 2011年7月10日 20:22:00 周日


自从开始开发我自己的操作系统以来,已经有一年了,这期间我经常停下来,回头看看我已经完成了什么,并好奇当初是什么原因使得项目的开头这么困难。 我得出的一个结论是,虽然有大量的讲述操作系统开发的文档,但这些文档大部分都是从技术角度出发,在项目管理方面着墨不多。也就是说,如何从一个模糊的想 法 (“我想编写自己的操作系统”),到一个精确的规划 (我希望实现什么),或干脆在撞上南墙之前放弃它。本系列文章除了旨在使那些对 OS 开发感兴趣的朋友能够走上正轨外,也希望能兼顾如上所述项目管理的一些方面。

您正阅读的本文将回答一个相当简单,却非常重要的问题:您真的准备好要进入 OS 开发了吗?很少有像编写 OS 这样耗时长,要求高还收获晚的业余爱好。大部分的个人 OS 开发项目最后都进入了一个死角,因为事先没有很好的理解要进入的领域,因此编写了大量很难维护并且设计糟糕的代码,导致项目无疾而忠;或者因为仅仅实现一 个能工作的 malloc() 就耗费了大量的时间而意志消沉,并最终被击倒。
一些不好的想法
“我想引导下一次计算革命”:简单的说,不可能。详细点说,如果设想你自己是一个小的研发团队的话,你也许可以把某个东西做的很优雅,但也就是在一个小的范围内。如果没有一个大的组织或社区在背后支持,你的研究成果无法更大规模的普及。你也不可能通过实现所有 OS 的模拟来运行它们之上的程序以吸引更多用户,因为这实在是太困难了。
“我想精通某一门编程语言,我需要一些大的挑战来练习”:有些人会尝试通过开发一个 OS 来学习一门新的编程语言,他们认为通过完成某些挑战性的工作,可以真正的理解这门语言。坦白说,这并不是一个好的想法。
首先,这会让原本已经非常困难的 OS 开发更加困难,最好还是不要高估自己的能力,尤其在面对挫折和疲惫时。
其次,因为使用一门新的编程语言,你将不可避免的犯更多错误。而这些错误通常都发生在底层,你将无法使用那些用户空间程序可以使用的 GDB 与 Valgrind 等诊断工具。
再者,即使如此,你学到的也不是这门语言的全部,而只是其中一个很小的子集。除了极少数语言以外 (比如专为编写 OS 设计的 C),大部分语言提供的标准库将无法使用,大部分语言都有某些运行时功能,是你在开发 OS 的过程中至少某段时间内无法提供的,比如 C++ 的异常与 vtables,C# 与 Java 的垃圾收集与实时指针检查,Pascal 对象的动态数组与字符串,等等。更多相关细节可以看这里 (1, 2) 。
总之,你将不得不有一段艰难的时间来编写一些丑陋的代码,而这些代码无法让你去学习某门语言,还是放弃这个想法吧。
“实现一个新的内核复杂的可怕,不过我有更简单的方式!我只需将 Linux 源代码拿来,按我的需求做一些修改,这样做应该不会那么难。”:让我通过一个练习例题来告诉你 Linux 源代码 (比如 init/main.c) 实际上是什么样的,你的第一个目标是找出真正的 main 函数;第二个目标是试着理解它所调用的函数的定义位置,以及它们可能用来做什么;第三个目标则是估算一下完全理解这些函数所需要的时间。
你现在应该知道,如果对即将进入的领域没有一个非常好的技术上的理解的话,在已有的代码基础上进行修改将是一个十分困难的选择。代码重用当然是一个 相当不错的可选之路,并且有许多优势,但并不会因此使你的生活更加轻松,相反还会更加困难,因为你不光要全面的学习内核的开发,还得深入细节的学习这些已 有的代码。
“我不喜欢 Linux/Windows/Mac OS X 里实现的某个功能 X,这个功能应该重写”:所有现代的操作系统都有一些自己独特的怪癖,尤其是桌面系统,毫无疑问。不过,如果你的抱怨牵涉到的问题并不大的话,你应该考虑试着去修复它,并贡献给相应的项目,除非这样做失败了,即使重写最好也只重写这个功能牵涉到的功能模块。
“我正在寻找一个令人兴奋的商机”:参见上面第一条。除非你工作一个实验室里,并且专门研究操作系统,否则只要你开发的 OS 没有什么实际用途,那么你很难从它身上赚到一毛钱 (至少很长一段时间内是如此)。
一些好的看法
“我想尝试一个全新的 OS 设计”:你有自己独到的关于 OS 应该如何设计的想法,并且这些想法在当前的 OS 中找不到?那么开发自己的 OS 可以用来验证你的想法是否实际,并进一步完善你的想法。
“我已经熟练掌握了我现在使用的语言,我想找点编程方面的挑战,或者更深入的理解我的电脑在底层是如何工作的”:OS 开发当然能满足你的想法,甚至能提供更多你想不到的。你将学会如何在没有其它诊断工具的帮助下 (除了文本输出) 去调试代码;如何在没有标准库的环境下完成相应的功能;你将了解为什么有这么多人在抱怨 x86 体系架构,即使你的 x86 架构的电脑运行的相当不错;你将了解硬件生产商提供的文档到底有多烂…
“我已经在某个内核上工作了很长时间了,我非常清楚它的代码结构,以及那些令人头大的地方”:如果这些问题需要相当大的改动,或者可能带来不兼容,那么你除了在它的基础上另起分支外,别无选择。这样做当然也是一种正确的方法,甚至比从头重写一个 OS 要更加值得赞赏,不过本系列文章并不针对这种情况。
“我想对这个 OS 所做的改动太大,无法通过简单的补丁或开一个分支就能实现”:这当然是从头开发自己 OS 的最佳选项,如果你的想法确实如此,那么欢迎你来到这儿。
“我正在寻找一个新的令人兴奋的爱好”:这要看你如何定义“兴奋”二 字,如果你准备好了的话,OS 开发绝对可以称得上是这个地球上最令人兴奋的爱好之一。打一个不太恰当的比方,有点类似于培养一个孩子,或者养活一颗树。这个过程无疑是漫长的,有时候甚 至令人疲惫烦躁,以至于你感觉不值得。当然如果你能挺过去,那只会让你的成就感更强烈。此外你还能在这个过程中找到不一样的乐趣,你可以完完全全控制你的 电脑。
那么,你准备好了吗?
在开始项目之前,除了上面的问答阶段以外,为了能够成功上路,你还必须知道或迅速学习如下的这些东西:
普通计算机科学:你必须非常清楚并且能够熟练的操作二进制数与16进制数,布尔逻辑,数据结构 (数组,链表,哈希表,等等),以及排序算法。
计算机架构:你应该知道一个桌面电脑的整体架构。The Words and expressions ALU,中断,内存与 PCI 总线,DMA 等应该不至于对你来说太陌生。了解其它一些更高级的技术比如:TLB,多级缓存,或者 branch prediction 将在你走的更远时大有帮助,比如你开始通过优化你的代码提高效率时。
编译器与可执行文件的内部结构:你必须大体上知道在预编译,编译以及链接阶段都发生了什么,并且能够在需要时从 toolchain 中找出你可以控制的地方。你还必须学会 linker scripting 以及可执行文件的内部结构。
汇编:你必须知道什么是汇编以及它是如何工作的,你必须能够编写一些简单的汇编代码 (操作栈以及寄存器,加减数字,实现 if-else 逻辑…)。你可以用其它语言来实现大部分的 OS 功能,但至少有极少数任务,你只能通过汇编来实现。
C 或 C++:即使你打算使用其它编程语言来开发你自己的 OS,你也需要了解 C 或者 C++,因为你需要参考的其它 OS 实现,或某些 OS 开发教程基本上都是使用 C 或 C++ 完成的。
你将要使用的语言:不管你是用 C#, Java, 汇编, BASIC, C, C++, Pascal, Erlang, REBOL 还是什么其它语言来开发你的 OS,你都必须熟练掌握它。实际上,你甚至应该阅读这门语言的内部实现的文档。举个例子,你应该知道使用你选择的语言进行函数调用最终在汇编那儿是如何实 现的,你应该知道你的语言需要什么样的运行时支持并且如何来实现它。
(以上部分基于 OSdev wiki 上的一些内容,并做了一些修改。)
这就是本系列文章的第一篇所要讲述的内容。如果你已经完成本文中所要求的,那么恭喜你。你应该具备正常的心智与足够的知识来开始你自己的 OS 开发之旅了。在下一篇文章里,我将讲述如何为你的 OS 项目设置一个正确的目标以及期望值,这将是你最终到达目的地的至关重要的一步。

[译者前言] 本系列译文译自 OSNews 网站的 Hobby OS-deving 系列,原文作者为 Hadrien Grasland,该系列文章的版权属于原文作者及 OSNews 所有。本文是该系列第一篇的译文,Hobby OS-deving 1: Are you ready?

设定目标和期望:开发自己的操作系统(2) 

 

引用地址:

说说看:(点击申请属于你的个性头像)

(*)

关于站长
网站公告
  • O(∩_∩)O
分类
最近关注
  • 最近关注着的娱乐节目有:
    1.0CSI现场犯罪调查迈阿密 第十季
    1.1CSI现场犯罪调查纽约 第八季
    1.2CSI现场犯罪调查 第十二季
    2.危机边缘第四季
刚刚说过……
随便溜达
最新评论
言论
  • ⒈决不能因为一件伤心的失望的事,就从此放弃生活中一切有价值的东西;
    ⒉要像一颗青树,大风将树根吹折,然而巨大的树干,却永远树立;
    ⒊想匆匆忙忙地完成一件事以期达到加快速度的目的,结果总是要失败的;
    ⒋如果你是对的,就要试着温和地,技巧地让对方同意你;如果你错了,就要迅速而热诚地承认。这要比为自己争辩有效和有趣的多;
    ⒌"思考"应当走到众人前面去,"冤枉"不妨留在后面;
    ⒍如果试图改变一些东西,首先应该接受很多东西;
    ⒎以后更新^_^
友情连接
存档