Beginner Mistakes
“编写自己的操作系统”的想法把你带到了这里。 本维基旨在为您的事业提供帮助、指导和参考。
然而,新来者犯某些错误或对该主题所涉及的内容有共同的误解是很常见的。 这还不错——许多人以前犯过这些初学者错误,将来也会犯。 本页是关于在深入了解所提供的信息之前,确保您知道自己在做什么。
这不是什么
这可能看起来像是一套要复制和粘贴的教程,加上一个论坛,当你遇到困难时可以问你问题。“事实并非如此。“我们完全希望您承担自己的责任,并在开始编写自己的操作系统之前成为一名经验丰富的用户空间应用程序程序员。 我们还希望您已经阅读了操作系统设计,并且已经研究了所选平台的相关文档。 不要期望这个Wiki或论坛成为某种“我自己操作系统的完整指南”,更不要说是编程技能的一般指南。
您在这里找到的是在您之前的人留下的文档,他们通过阅读技术文档、可用的源代码、论坛帖子以及尝试和错误编程发现了这些东西。 其中一些是为了让那些人以后可以再次查找,一些是为了让我们可以指向一篇维基文章,而不是“再次”解释一个主题。
你在这里找到的是一些小提示和路标,它们可能会帮助你走上人生道路。 “这不是一张完整的奥兹地图。”“也不应该。
如果您还不知道 Stack是什么,或者不知道如何使用 debugger,我们不会特意向您解释。 访问这两页;您将看到,它们主要涉及操作系统的细节,而不是对该主题的一般介绍。 这不是一个缺陷,这是故意的。 如果你正在寻找一般编程的启示,你应该访问一般编程网站,如[1]并在您立志成为“操作系统”开发人员之前先成为一名开发人员。
这个维基“不会”扩展成初学者手册,因为这不是它的目的。 它是为了回答当人们觉得他们已经准备好投入内核空间编程时出现的“高级”问题。
确凿的事实
任何一个还没有在多种语言和环境中积累多年经验的开发人员都不应该考虑OS开发。十年的编程,包括几年汇编语言和/或系统语言(如C)的低级编码,几乎是理解该主题的最低要求。
更重要的是,随着不同“标准”、计算机和移动设备型号、外围设备和设计概念的数量不断扩大,这一点逐年增加。
对于像丹尼斯·里奇、理查德·格林布拉特、加里·基尔达尔或史蒂夫·沃兹尼亚克这样的人来说,为硬件编写一个简单的操作系统是一回事,与他们已经非常熟悉的现有机器相比,这个操作系统相对简单,并且没有需要遵守的标准规范,也没有需要保持向后兼容性的现有积垢。 这在当前一代库存硬件上不再适用。 此外,他们中的每一个人都是经验丰富的工程师,已经做了多年的系统编程。 即便如此,它们也只是为这些体系提供了基础;大部分工作是在系统的核心(用现代术语来说就是内核)就位后,由一小群下属开发人员完成的。
这条规则也有例外,但不多;不要指望自己是千里挑一。 如果你认为你是,请仔细阅读[https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effectDunning Kruger效应并再次考虑这件事。
哦,作为记录,Linus Torvalds不是其中之一——他在编写Linux内核时是一名研究生,多年来一直在用C编写代码。 虽然他还差十年,但作为一名将业余爱好转化为硕士论文的研究生,他比大多数人有更多的时间从事这个项目。 无论如何,“Linux 0.0”。他在1991年向USENET发布的1'版本只不过是一个循环调度程序,离完整的系统还差得远。 他花了一年时间才达到这一点。 明白了吗?
诚然,这个维基的大多数贡献者开始得更快,但对我们大多数人来说,这是一个因缺乏经验而产生的错误。 这个团队的大多数先驱者都不知道哪怕是一个小的操作系统项目的规模和复杂性,也不知道自己在做什么。 这是一个难以下咽的药丸,尤其是像这个Wiki这样的“以前”资源被广泛使用。 我们不能强迫你们从错误中吸取教训,但至少我们可以传递这个警告。
现在,你不应该对此感到“太”气馁;重点不是你不能这么做,而是如果你和我们大多数人刚开始的时候一样,你可能“现在”还不能这么做。在开始这么大的项目时,耐心是一种美德。
Is there a tutorial on...?
因为这个地方不能也不适合初学者开发人员,所以经常会问,哪个地方提供教程、好的解释或易懂的阅读。 但是,“它们不存在”。困难的主题不能用轻松的散文来描述,就像有太多太复杂的东西让猴子无法正确学习一样。 如果您在阅读官方文档时遇到困难,这将是一个很好的练习时间。
事实上,目前绝大多数的教程至少有一种方式被破坏了,所以你最好不要一开始就相信它们。
范围
=== 截止日期 ===
无论是大学、业余爱好还是商业用途,操作系统开发都需要时间。Linux内核花了一年多的时间才变得有用,而Linus Torvalds所做的只是“模仿”现有的和有良好文档记录的行为,以获得一个已经存在的用户空间在其上运行。 此外,对于每一个像Linux这样成功的项目,实际上都有“数百”个项目消耗了一个人年或更多的工作,而没有托管一个功能shell。
因此,为你想做的事情规划一个合理的路线图。 不要假设在3个月内,您的操作系统将拥有GUI和语音识别,因为操作系统开发中根本不包含任何RAD工具。 事实上,它们是完全没有的。 (“空虚”。这是个玩笑。 明白吗?)
最终目标定义
当开始一个项目时,你应该估计你的最终目标,你的最终用户,项目开发的目的,等等。 操作系统开发与此无异。 对你的目标有一个大致的了解会给你动力和你需要前进的方向。 然而,当你想到更好的事情时,不要停留在最初的最终目标上。
不幸的是,许多操作系统开发人员没有估计他们最终的操作系统会是什么样子;因此,他们不知道该往哪个方向走,于是问:“下一步怎么办?”
然而,应该提到的是,为了估计最终目标,您应该了解现有操作系统如何工作的整个(技术)概念。
商用OSDev
不要以为构建这么好的操作系统会让你变得富有。如果说有什么不同的话,历史已经告诉我们,最好的操作系统从来没有获得过任何商业成功,而那些几乎完全缺乏设计和灵感的操作系统却获得了商业成功,这是因为它们采取了巧妙的商业行动,在正确的时间,在正确的地点,进行了正确的掩盖。
尽管如此,尽管论坛的“工作”部分相对空白,一些单独开发的操作系统已经取得了一些商业成功。 一个例子是 01000101和“Drop-in-Network Security”,这是一个设计用于充当专用深度数据包分析器的操作系统。 请注意,它专门用于特定的应用程序。 要以这种方式营销您的操作系统,您需要像了解操作系统开发人员一样了解应用程序,可能需要更多,并且您需要非常擅长这两方面的编码。 Your customers will expect you to be professional.
另一种可能是向目前使用MS-DOS进行过程控制的公司销售您的操作系统。 这似乎更容易,因为你不负责最终的应用程序,但你需要专业,并对客户的问题和查询作出响应。 它们可能需要长期支持。 他们可能不喜欢您真正想要实现的功能。
假设它哪儿也去不了
与上述情况相反,一些人认为他们的操作系统将一事无成。 由于这个原因,他们的项目有难看的代码,不考虑重要的方面,并且通常依赖难看的黑客。 最糟糕的是,他们做出的决策不会带来可用性和可扩展性。 这样,他们的假设就变成了一个自我实现的预言。
事实上,虽然让您的操作系统在测试机器之外运行的机会很低,但从这个社区开始的高级操作系统项目已经足够多了。
Avoid Ignorance
初学者经常会问“做X最“简单”的方法是什么?”而不是“做X的最好、正确、正确的方法是什么?”这是危险的,因为新来者不会花时间去理解实现某些东西的高级方法,而是从教程中选择概念上更简单的方法。 事实上,简单的路线往往“过于简单”,最终会导致更多的长期问题,因为初学者不知道更好的选择,也不知道什么时候最好切换。 走艰难的路有什么不好?
常见的例子包括懒得使用交叉编译器,不理解Real Mode、Unreal Mode、Protected Mode,和Long Mode以及从一个到另一个跳得太快,而没有首先了解如何收集所有重要配置并充分利用其所有功能(特别是在引导和初始化期间使用BIOS检测基本功能),依赖于非标准的BIOS调用,不学习在自己的操作系统中以及在Windows和Linux下编写硬件驱动程序以获得最大的便利,在全球范围内公开测试功能,使用平面二进制文件而不是ELF,不学习可执行文件、归档文件、图形、文档和其他文件格式以及压缩算法,等等。 有经验的开发人员使用高级替代方案是有原因的,您可能还不明白。 在某些情况下,有经验的开发人员选择使用较差的方法,但这是因为他们可以仔细分析它是否合适,并且知道何时“不”使用它。 作为初学者或中级开发人员,您可能不太了解这些方法和技术,无法判断劣质解决方案是否适合您。 记住,如果你反对一种方法,你应该非常了解它,知道它的所有错误(和正确)。 不管怎样,懒惰和无知都只会带来麻烦。 当有疑问时,选择看似保守的选项,而不是简单的选项。
设计
设计图形界面
从零开始,您可能需要几年时间才能真正完成任何与GUI相关的工作。 GUI的“外观”充其量只是次要的,因为它们可以很容易地追溯更改;真正决定GUI可用性的是“功能”,而不是用模型图形来表示。 如果您的目标是创建更好的外观而不是更好的操作系统,请考虑实现X窗口管理器而不是整个操作系统。
人气
“我的操作系统将比Windows、Mac操作系统和Linux更受欢迎!”
这是极不可能的。 要做到这一点需要相当多的时间、金钱和知识。 并非所有人都会下载您的操作系统,因为:
- 他们可能不知道什么是操作系统,也不知道如何安装操作系统
- 您的操作系统存在安全风险
- 您的操作系统支持的应用程序更少
- 您的操作系统功能不全(最小的命令行界面或错误的GUI)
你会幸运地得到一些人使用你的。 今天流行的操作系统之所以流行,唯一的原因是因为它们在几十年前就已经可用并满足了人们的需求,当时替代品较少。
内存使用
“我想在我的操作系统中使用不到几千字节!”
对不起,那可能是不可能的。 使用如此少内存的操作系统几乎无法使用。 忘记文件系统驱动程序、磁盘驱动程序、usb驱动程序等。 如果你想开发一些小东西,只需要做一个简单的引导加载程序,而不是一个操作系统。
你可以试试本地的福思;它就像一个小操作系统,内核、命令解释器和汇编程序都在一个微小的二进制文件中!内核的某些部分甚至可以编写脚本。 您甚至不需要文件系统,许多Forth直接编辑和加载磁盘扇区。 这里有一个很大的陷阱:福斯的技术并不轻松。 写“好福思”是一个完全不同的星球,你需要理解它才能超越简单的基础。 令人惊讶的是,一些Forth的粉丝擅长编写Forth口译员,但他们是差劲的Forth程序员。 您需要成为一名优秀的(-ish)Forth程序员,以使操作系统设计概念适合Forth,或者找出哪些概念是不需要的。 如果你不能做到这一点,你的操作系统将比它需要的“大得多”。 ;)
找出如何减少代码大小可能需要花费大量的时间和思考。 Forth的发明者查尔斯·摩尔(Charles Moore)编写了一个仅由5行代码构成的CAD程序。 当被问及写这5行需要多长时间时,他回答说:“哦,大约2年!”!
操作系统仿真
“我的操作系统将能够运行来自Windows、Mac操作系统、Linux甚至PDP-11程序的程序!!!”
我很抱歉打破了你的幻想,但可能不会。 即使只模拟一个系统也需要多年的工作,特别是当它是专有的,例如Windows或Mac OS(Linux可能是四个系统中最简单的一个)。[2],尽管自1993年以来一直在开发中,并且是在用户空间中编写的,但许多程序仍然存在问题。
因此,与其专注于模仿其他系统,不如专注于自己的系统。设计它,开发它,与它成为朋友。
程序设计语言
有些语言非常适合编写内核,而另一些则不太适合。阅读关于使用C以外的其他语言的页面。
内核映像
引导问题
特别是在早期阶段和使用自建引导加载程序时,引导问题的原因通常是从磁盘获取的扇区太少。 调整从磁盘获取的扇区数量,或者让引导加载程序/第二阶段加载程序解析文件系统。
故障排除/寻求帮助
在论坛或IRC上寻求帮助之前,您应该自己采取所有可能的步骤来诊断问题的性质。 在诸如三重故障或“随机”异常等问题的情况下,对问题的原因进行假设是常见的错误。 当异常发生时,使用调试器或print语句来定位准确的点。 使用and emulator和调试器(如GDB和Bochs/QEMU)将帮助您定位难以跟踪的问题。 如果你提供一些关于问题的理论和你已经采取的解决问题的行动,人们会更容易地帮助你(即使你的理论不正确,它至少会让人们了解你对问题的看法、你可能已经尝试过的策略以及你可能错过的东西)。
一般来说,在请求他人帮助之前,尽可能多地自己解决问题。 在你发帖之前,问问自己,“我已经尽了我所能诊断和解决这个问题了吗?”通常,在这个过程中,你会学到很多东西,你很可能能够自己解决问题(以及将来类似的问题),而不需要别人的帮助,这是一件好事。 当您请求帮助时,请提供与您的问题“相关”的代码。 但是,问题可能出在其他地方,因此也给其他人一种方法来查看代码的其他部分(如果您使用的是GitHub或Bitbucket之类的东西,这会稍微容易一些,但肯定还有很多其他方法)。
关于论坛,请阅读论坛规则。 它们是阅读“”所必需的,将提高您帖子的质量,并使人们更有可能帮助您。 在IRC频道,如果你问一个问题,不要期望在10秒钟甚至5分钟内得到答案。 其他人也有生命。 如果您需要离开去做一些事情,并且想检查是否遗漏了任何内容,那么可以查看日志。 请参阅IRC主题中的链接了解这些信息。
有关如何在寻求帮助时成为一名好的社区成员的更深入的指南,请咨询[3]。 这是一本很棒的读物,理想情况下,你应该在向任何地方寻求帮助之前阅读整本书(它没有那么长,很值得一读)。
晋升
命名
命名通常是最后一个要解决的问题,即使我们都希望为我们的酷概念取一个酷的名字。 因为名字的“酷”是一个品味的问题,我们不能帮助你找到它。 此外,如果您将项目名称与某个功能绑定在一起,您可能会在将来的某个地方发现,没有任何概念是完美的,您希望更改您最初认为是关键功能的内容。 没有什么比仅仅因为“想坚持一个名字”而不进化更愚蠢的了。。。
在 this线程中可以找到许多关于命名的好信息。 简单地说,命名您的操作系统<name>OS(JackOS、FredOS等)似乎是个好主意,直到您获得第二个项目成员。 一个好主意(由Solar公司提供)是选择一个代号(如Longhorn、Chicago等),然后在接近发布时间时编一个更好的名字。
项目网站
许多osdev新手在网站上没有任何值得展示的内容之前就创建了项目网站。 在你还不知道你的项目的发展方向或任何代码、截图或下载来展示你已经制作的内容之前,创建一个网站对你的项目的未来计划做出戏剧性的声明是没有价值的。 这样一个网站看起来已经死了,并造成了坏名声。 宣布您的网站(例如在OSDev.org论坛上的公告论坛中)或在您的签名中链接到它时,上面只有一条“欢迎使用<在此插入花式项目名称>”的消息,这只会让人们在您开始之前对您的项目失去兴趣,如果/当你最终做出值得炫耀的东西时,你将面临一个已经很糟糕的名声,很难克服。
团队合作
第一个初学者错误出现在公告论坛上。 它通常以两种形式之一出现,尽管两种形式有相当多的重叠:
社区项目
不要高估你让人们对“你的”项目感兴趣的机会。 即使是更成功的 Projects通常也由一个或两个实际从事代码工作的人组成。 这并不是因为缺乏“需要”。
布鲁克斯定律指出,参与项目的人数越多,项目所需时间越长。 解决这个问题的唯一方法是将项目分成几个部分,让人们参与其中,并且只参与其中。 祝你好运
招聘
你需要一些东西来获得机会(避免痛苦地被告知你是个失败者):
- 如果您没有已建立的代码库,人们将不会加入,因为他们会看到您缺乏经验,并期望项目失败。
- 如果你缺少一个设计,人们不会加入你,因为他们看不到你的操作系统比他们自己的设计更有趣。
- 如果你的名声不如你,尤其是那些更有经验的人,他们会对你非常谨慎,缺乏加入的信任。
- 如果你不具备项目管理技能,那么少数几个“确实”加入的人很快就会辞职,因为他们正在讨论一些东西,而不会编写代码。
然而,加入的人通常比为其编制此列表的人更糟糕。