type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
首先,开发一个操作系统可能是你在电脑上能做的最具挑战性的事情之一(仅次于在噩梦难度级别的《毁灭战士》中杀死最终 Boss)。构建一个操作系统需要很多关于计算机科学中几个复杂领域的知识。您需要了解硬件的工作原理,并能够读写复杂的汇编语言以及高级语言(如C、C++或Pascal)。你的头脑必须能够围绕抽象的理论,容纳无数的想法。感到气馁了吗?不要害怕!因为所有这些东西也是让OS编程变得有趣和娱乐的东西。
当你经过几个小时的努力,终于解决了问题时,没有什么比这更有成就感了。一段时间后,您可以回顾并查看您从头开始创建的所有内容。你手写的系统能够启动,对硬件施展魔法,并为用户提供用户界面和程序来玩。
创建操作系统时,没有绝对的路径。一旦您启动并运行了您的初始系统(您可以通过找到合适的教程来完成),您就可以选择下一步要走的路。你的操作系统就是你的。你拥有终极控制权,你的前途无量!

1 严酷的事实

希望操作系统开发是一个复杂且持续的过程这一基本事实不会让您气馁。事实上,操作系统开发确实是无与伦比的困难,因为它需要最大的耐心和仔细的代码设计,并且很少获得与从开发游戏和基于 Web 的脚本之类的东西中获得的“即时满足”感,甚至没有回报。
你已经被警告过前方的艰苦工作,但是如果你仍然感兴趣,那么继续前进到操作系统程序员的领域。为偶尔的困惑、沮丧和我们中的一些人……暂时的精神错乱做好准备。随着时间的推移,只要有足够的奉献精神,您就会发现自己是为操作系统做出贡献的少数精英之一。如果你在前进的道路上感到气馁,用这本书的内容来刷新你自己。希望它能提醒你,当初为什么要开始这样一段疯狂的旅程。
在这个阶段,阅读初学者错误页面也是值得的。论坛上的用户已经注意到,随着时间的推移,很多这样的错误会重复出现,避免这些错误是避免自己出丑的好方法。

2 责任

人们倾向于声称写低效的软件是可以的,声称计算机系统现在是如此之快,以至于你看不到它的影响。这种心态在操作系统设计中是危险的。在制作一个简单的应用程序时,编写松散的代码可能没问题,但是当涉及到每秒钟可能被调用数千次的关键代码时,您需要尽可能地减少所有开销。操作系统应该将计算机作为基本资源提供给正在运行的应用程序,尽可能减少复杂性、抽象性和开销。
在这个时代,设计操作系统的人倾向于“除了厨房水槽什么都可以”的心态。他们认为自己应该考虑所有的事情,这当然是好的,但是这不应该以允许糟糕的程序繁荣为代价。当程序出错时,有很多事情在“幕后”发生。写得不好的程序耗费了宝贵的执行时间,并且涉及到在内存和频率上都很昂贵的任务切换。我们鼓励你阻止编写不佳的软件的出现的行为。

3 所需知识

主条目:必备知识 如果你认为你可以跳过这个,它只适合你。
此部分已移至单独的页面,因为它在论坛讨论中经常被提及。

4 组织你的计划

在继续之前,考虑一下你想从编写操作系统中得到什么。你参与这个项目的动机是什么?从事一个业余爱好的操作系统项目有许多可能的原因,而且大多数操作系统开发人员有不止一个原因。即使只是说,“我只是想”就足够了,但你考虑得越多,越清楚你的目标和动机,你就越能专注于你真正想要的东西。
对自己也要诚实。对你的项目有更大的雄心并不可耻,即使(或者特别是)它们不是主要目标。试着承认你所有的目标,而不仅仅是你认为是你主要目的的那个。
试着确定你对操作系统设计的哪些方面最感兴趣,或者认为需要改进的地方。操作系统开发的大部分,尤其是早期,是内核设计和开发,但是内核本身只是大多数操作系统的一小部分;如果你的主要兴趣是UX、网络或驱动编程,你应该考虑一下你是否真的需要(现在或将来)编写你自己的操作系统,或者你是否满足于在现有的内核上开发这些东西。当很多人真的想设计桌面环境时,他们已经进入了操作系统开发,所以这是一个非常重要的问题。
试着想一想你可能首先或者同时想从事的任何非操作系统项目,尤其是那些可能作为操作系统项目的实践或准备的项目。通常没有必要马上着手操作系统项目,你提前准备得越多,你的情况就越好(至少在一定程度上——准备是一回事,拖延是另一回事)
类似地,如果您打算派生一个现有的设计来进行试验,或者为了某个特定的目的进行修改,那么就要把重点放在这个问题上,而不是放在一般的开发问题上。考虑您将需要现有代码库的哪一部分,以及您想要更改哪一部分。
试着制定出你的一些具体的项目目标,如果有帮助的话,准备好计划单独的项目。如果你只是想四处逛逛,看看它会把你带到哪里,那很好;如果你的意图是推翻微软,那也没问题(虽然有点不切实际)。一旦你知道你想做什么,你就可以把它的细节分解成具体的目标,并计算出达到这些目标需要什么。不要试图把太多不同的目标强加到一个项目中——如果你有不同的事情想要用矛盾的目标去尝试,把它们分成不同的项目。
如果您写下您计划的操作系统设计的概述,以及您认为值得注意的任何具体要求或细节,或者可以澄清您需要帮助的内容,并尽可能将其添加到您的公共存储库中,这可能会有所帮助。这不仅会让别人更容易帮助你,还会帮助你组织和稳定你的计划,就像为一个故事或论文写一个大纲一样。当您的目标和计划改变时,准备好维护它,但是保留一份旧版本的副本(或者更好的是,将文档置于版本控制之下),以便您可以看到您的工作如何随着时间的推移而发展。
最后,检查项目所需的时间和资源,并决定它们是否可行。如果你知道你只有一定的时间投入到这个项目中,考虑到这一点,无论你做什么,不要承诺一个外部的截止日期,即使你确信你能达到它。操作系统开发需要时间——很多时间——试图在一个学期内完成一个完整的操作系统项目是不现实的。

5 选择您的开发环境

你需要一个平台来开发你的新系统。按照通用计算的趋势,最流行的是GNU/Linux,但许多人也使用Windows。使用GNU/Linux系统的开发人员在工具的可用性方面有一点优势,但这可以在Windows上使用Cygwin或MinGW这样的系统来解决。
  • Binutils:操纵目标文件的基本工具。
  • GCC:GNU编译器集合。GCC包含C、C++、Fortran和Ada等语言的编译器。
  • Make:用于自动化构建过程,这在您拥有大量文件时非常有用。
  • Grep和sed:用于执行更强大的搜索和搜索替换(在用数据填充表格时很有用)。
  • Diffutils:对于显示两个文件之间的差异非常有用。
  • Perl或Python:应该安装这两种脚本语言中的一种。对字符串操作非常有用。Perl曾经是推荐的语言,但是Python现在已经相当成熟,可能更容易学习。两者都有数百个包/模块可用于完成各种任务。
  • 汇编程序:例如 NASM 或 GAS。这取决于您的目标 CPU 架构。
  • 编辑器:用于编写汇编、C和其他(代码)文件。
您可能不会使用所有这些工具,但是最好将它们放在手边“以防万一”,并且知道如何使用它们,即使是在基本级别上也是如此。但是如果你决定使用另一种语言,那么工具主要取决于你,也许上面的列表对你没有任何帮助。以下是主要与C/C++或汇编开发人员相关的信息。

5.1 GNU/Linux

OS开发最推荐的系统是GNU/Linux。当使用GNU/Linux时,大多数GNU开发工具可能已经存在。如果没有,使用你的发行版的包管理工具(APT,RPM,Portage,Pacman,Apk等)。)根据需要安装它们。同样,需要制作一个交叉编译器,以便不链接开发系统的运行时文件
常见的编辑器有Vim、Emacs、KDevelop、Komodo Edit等。有些人更喜欢轻量级编辑器而不是IDE,如gedit、Geany和SciTE。许多人喜欢Midnight Commander,它有一个文本用户界面和一个内置编辑器(mcedit ),因此非常轻便和快速。
关于应该使用哪些发行版,请查阅Linux发行版列表。它们有各种形状和大小,并不都适合内核开发。不要使用有特定目标的发行版,比如安全(Kali,Qubes,BackTrack,Parrot等等。)、科学应用程序(例如 Scientific)、防火墙和路由(例如 DD-WRT)、系统恢复或嵌入式环境( Knoppix、Rescatux、TinyCore)或专门针对初学者(如 Linux Mint、Nitrux 等)虽然对初学者友好的 Linux 可以做到,但请选择一个通用发行版。还要使用具有最新软件包的发行版,最好选择使用滚动发行版的发行版。Debian 易于使用,但通常会发布古老的补丁版本(这些工具的行为可能与描述的不同)。很多初学者喜欢Ubuntu,这没问题,但是据报道它在一些工具链和编译环境上有问题(如果你自己编译交叉编译器,而不是使用已安装的,这不是问题)。
内核开发的最佳发行版是(但是记住这也是个人喜好的问题,所以这些发行版不是必需的,而是建议的,它们通常需要一些经验):Arch、Gentoo、Solus、Slackware、void等等。甚至是 Puppy 。
如果你不确定,试试Ubuntu或者Manjaro。

5.2 Windows操作系统

为了获得必要的工具,您应该安装 Cygwin 环境。 MinGW 或 DJGPP 是替代方案,但强烈建议使用 MSYS2,因为它是最完整和兼容的环境,并且还包括用于安装库和工具的包管理器。
微软最近(截至发稿时)发布了 Windows 的 Linux 子系统,作为 Windows 10 的可选功能。它基本上是一个运行在 Windows 之上的真正的 Ubuntu 命令行发行版,不需要使用虚拟机。最新的 GCC 和 Binutils (撰写本文时为6.1.0和2.27) 可以在这种环境下正确编译和运行。使用 Bash shell,您可以通过 /mnt/<drive letter > 访问您的Windows硬盘。这个解决方案的优点是,您可以使用您需要的任何 Windows 或 Linux 工具,而不必了解它们是否在 Cygwin 中工作。使用 “apt-get” 可以安装许多需要的工具。
对于以上所有情况,强烈建议构建一个交叉编译器,不仅仅因为默认编译器针对不同的可执行格式,而且因为它通常是一个好主意。检查 GCC 交叉编译器页面以获取详细信息和说明。。
你还需要一个编辑器。使用记事本也可以,但是如果你有一个功能更完整的编辑器会让一切变得更容易。比如 Notepad++ 或者 Notepad2,很多人都在用。如果您熟悉 Unix 编辑器,您可以从 Cygwin 提供的选项中挑选一个(包括Vim和Emacs,它们需要一些时间来适应,但是非常强大)。
也可以使用 Visual Studio 或可免费下载的 Visual C++ Express Edition 来编写和编译您的操作系统。您将需要一个特殊的配置文件,您肯定是少数,但它确实工作得很好。您甚至可以在上面安装 Windows SDK,实现 64 位开发。唯一的缺陷是它不支持内嵌汇编。
也可以使用 Watcom 或 Borland 等其他工具,但是它们都有自己的特定需求,并没有广泛用于这种工作。
另一个需要考虑的问题是,你可能会把操作系统的自托管作为一个目标,也就是说,你可以使用你的操作系统来编译你的操作系统。如果你的操作系统是用 C 语言编写的,那么你的最低要求就是 C 编译器和 C 库。如果你想让你的操作系统成为一个 Windows 克隆,而不是另一个 POSIX 兼容的操作系统,你将需要一个 C 库来执行 Windows 调用而不是 POSIX 调用,并且你将需要一个 C 编译器来使用 C 库而不是 POSIX 调用。GCCWIN + PDPCLIB 符合这个法案。

5.3 MacOS

因为它在底层使用了 FreeBSD 的用户空间,所以完全兼容 POSIX 。所有常用工具都可用(vi、bash、dd、cat、sed、tar、cpio等。)几乎每个教程都是现成的。缺少的工具大多与文件系统相关: 没有环回设备、没有 fdisk、没有mkfs.vfat或mtools。但是您可以使用 diskutil 来实现这些目的,或者使用 brewmacports 来安装那些缺失的工具。
要获得 gcc,您需要在旧版本的第二张安装 DVD 上安装一个 mpkg。较新的 MacOS 版本(10.13及更高版本)可以通过从终端运行 “xcode-select - install” 来安装命令行 XCode(不是IDE,只是工具链)。这将安装 gcc,binutils 和 make。这个 gcc 实际上是一个伪装的 CLang,但是功能足够强大,可以毫无问题地构建自己的交叉编译器。最好使用官方编译器来引导 gcc,而不是从 brew 或 macports 安装一个。

6 测试你的操作系统

主条目:测试 上面的文章深入探讨了如何选择如何测试您的操作系统以及如何将其与您的开发过程集成。讨论了物理和模拟测试环境。

7 保护您的代码

在你构建代码的过程中,你将会写几百行,甚至几千行代码。你将花费难以名状的时间,在你真正应该上床睡觉的时候熬夜编码。你最不需要的就是一个磁盘崩溃或者一个写得很差的 “rm” 或者 “format” 命令把你所有的工作都丢掉。
你需要的是一个版本控制系统。CVS 已经使用了很多年,但是最近受到了 Subversion、Bazaar、Mercurial 和 Git 的激烈竞争。如果可以,您应该将远程计算机或服务器设置为版本控制服务器,但是如果没有这样的计算机,您也可以在本地开发计算机上托管版本控制系统。只是记得偶尔将代码备份到 CD 或 FTP 上。
我们再怎么强调这一点也不为过:如果您还没有使用源代码控制,那么您应该立即开始使用。您只需在代码中犯一次严重错误,就可以意识到让代码安全版本化和易于检索的重要性。虽然对于一个小型的私人爱好项目来说,这似乎有些矫枉过正,但是一旦你养成了使用修订控制的习惯,你就会想知道没有它你是怎么过的。
对于Git,你可以在 GitHub 或 Bitbucket 上创建你的项目。两者都有免费的私人资料库。
在网络可访问的存储库上使用版本控制的另一个好处是,它使得与他人协作和获得他人的帮助变得更加容易。这可能非常有用,尤其是在论坛中,因为它可以避免不断向消息线程发布代码的更新版本——您只需将对话指向您的存储库,线程中的其他人将直接访问您最新的更改。随着项目的发展,您是否开始与项目的其他开发人员合作也很重要(只是不要指望这会在一夜之间发生)。

8 共同的起点

获得 “Hello World” 64位高半内核的最简单方法是 Stivale Bare Bones 教程。另一种方法是在 Boot Sequence 页面上了解计算机本身是如何启动的。
也有许多其他教程可用。

9 获得更多的知识

如今,互联网上有大量关于操作系统开发的知识。只是找到它的问题。首先有这个维基本身。其中我们有很多教程。既然你来了,你可能已经找到了。在这个网站上还有一个论坛,许多开发人员在那里闲逛,可以帮助你(但是要确保你先阅读了如何提问)。已经写了相当多的关于操作系统开发的书。其中一些在我们的图书页面上有特别介绍,在 osdever.net 也有更多。

10 See Also

10.1 Articles

10.2 Threads

10.3 External Links

wiki.osdev.org 系列之(八)- 开发教程概述wiki.osdev.org 系列之(六)- GCC Cross-Compiler