Getting Started
首先,开发一个操作系统可能是你在计算机上能做的最具挑战性的事情之一(在噩梦难度级别上仅次于杀死末日中的最后一个老板)。编写一个操作系统需要大量关于计算机科学中几个复杂领域的知识。 您需要了解硬件是如何工作的,并且能够读写复杂的汇编语言以及高级语言(如C、C++或[[PASCAL] ]。你的头脑必须能够将自己包裹在抽象的理论中,并拥有无数的思想。 感到气馁了吗?不要害怕!因为所有这些都使操作系统编程变得有趣和有趣。
当你经过几个小时的努力终于解决了问题时,没有什么比这种成就感更好的了。 过了一段时间,你就能回过头来,看到你从头开始创造的一切。 您的手写系统能够启动,对硬件执行魔术,并为用户提供用户界面和程序。
在创建操作系统时,没有绝对路径可供选择。 一旦您启动并运行了初始系统(您可以通过查找适当的教程来实现这一点),就可以选择下一步要采用的路径。 你的操作系统就是你的。 你有最终的控制权,而天空就是极限!
残酷的事实
希望操作系统开发是一个复杂且持续的过程这一基本事实不会让您气馁。 事实上,操作系统的开发确实是无与伦比的,因为它需要极大的耐心和仔细的代码设计,并且从游戏和基于web的脚本开发中获得的“即时满足”很少甚至没有。
You have been fairly warned of the hard work ahead, but if you are still interested then proceed forward into the realm of the operating system programmer. Prepare yourself for occasional bouts of confusion, discouragement, and for some of us...temporary insanity. In time, and with enough dedication, you will find yourself among the elite few who have contributed to a working operating system. If you do get discouraged along the way, refresh yourself with the content of this book. Hopefully it will remind you why you started such an insane journey in the first place.
在这个阶段,阅读初学者错误页面也是值得的。 论坛上的用户已经注意到,随着时间的推移,这些错误会反复出现,避免这些错误是避免自己出丑的好方法。
责任
人们倾向于声称编写低效的软件是可以的,他们说现在计算机系统速度太快了,你看不到它的影响。 这种心态在操作系统设计中是危险的。 在制作一个简单的应用程序时,编写草率的代码是可以的,但是当涉及到每秒可能被调用数千次的关键代码时,您需要尽可能减少所有开销。 The operating system should supply the computer as a basic resource to the running applications, with as little complication, abstraction, and overhead as possible.
在这个时代设计操作系统的人往往有“除了厨房水槽以外的一切”的心态。 他们自己负责一切,这当然是好的,但这不应该以牺牲编写糟糕的程序的繁荣为代价。 当程序错误发生时,有许多事情是在“幕后”进行的。 写得不好的程序会耗费宝贵的执行时间,并且会涉及在内存和频率方面都很昂贵的任务切换。 我们鼓励您不要使用编写糟糕的软件。
所需知识
如果你认为你可以跳过这个,那就是为了你。
“本节已移至另一页,因为论坛讨论中经常提到它。”
组织你的计划
在继续之前,考虑一下你想从编写一个操作系统中得到什么。 你参与这个项目的动机是什么?从事业余操作系统项目有很多可能的原因,大多数操作系统开发人员都有不止一个原因。 即使只是说,“我只想”就足够了,尽管你越仔细考虑和明确你的目标和动机,你就越能专注于你真正想要的。
对自己也要诚实。 对你的项目有更大的雄心壮志并不羞耻,即使(尤其是)这些雄心壮志不是首要目标。 试着承认“所有”你的目标,而不仅仅是你认为是你的主要目的。
试着确定你对操作系统设计的哪些方面最感兴趣,或者认为有必要去做。 操作系统开发的大部分内容,特别是早期,都是内核设计和开发,但内核本身只是大多数操作系统的一小部分;如果您的主要兴趣是UX、网络或驱动程序编程,那么您应该考虑是否真的需要(现在或将来)编写自己的操作系统,或者您是否会对在现有内核上开发这些东西感到满意。 在真正想要设计桌面环境的时候,已经有很多人进入了OS开发,所以这是一个非常重要的问题。
试着想想你可能想首先或同时进行的任何非操作系统项目,尤其是那些可能作为操作系统项目实践或准备的项目。 通常不需要“现在”就着手操作系统项目,提前准备的越多,你的境况就会越好(至少在某种程度上——准备是一回事,拖延是另一回事)。
类似地,如果您打算对现有设计进行分叉以进行实验,或者为了某些特定目的进行修改,那么请关注该设计,而不是一般的开发问题。 考虑您需要的现有代码库的哪些部分,以及哪些要更改。
试着制定一些具体的项目目标,如果这样做有帮助的话,准备好计划单独的项目。 如果你只是想四处走动,看看它会把你带到哪里,那很好;如果你的意图是推翻微软,那也没关系(如果可能不现实的话)。 一旦你知道你想做什么,你就可以把它的细节分解成具体的目标,并计算出达到这些目标需要什么。 不要试图在一个项目中强加太多不同的目标——如果你有不同的事情想要尝试,目标相互矛盾,就把它们分成不同的项目。
如果您对计划中的操作系统设计进行概述,列出您认为值得注意的任何特定需求或细节,或澄清您需要帮助的内容,并将其添加到公共存储库(如果可以的话),可能会有所帮助。 这不仅能让别人更容易地帮助你,还能帮助你组织和稳定你的计划,就像为一篇故事或论文写提纲一样。 当你的目标和计划改变时,准备好维护它,但保留一份旧版本的副本(或者更好的是,保持文档处于版本控制之下),这样你就可以看到你的工作随着时间的推移是如何发展的。
最后,审查项目所需的时间和资源,并决定其是否可行。 如果你知道你只有一定的时间投入到项目中,要考虑到这一点,无论你做什么,“不要”承诺一个超出期限的时间,即使你确信你能达到它。 操作系统开发需要时间——很多时间——而试图在一学期内完成一个完整的操作系统项目是不现实的。
选择您的开发环境
你需要一个平台来开发你的新系统。 遵循通用计算的趋势,最流行的是GNU/Linux,但许多人也使用Windows。 使用GNU/Linux系统的开发人员在工具可用性方面稍有优势,但这可以在Windows上使用Cygwin或MinGW等系统来解决。
- Binutils:操作对象文件的基本工具。
- 'GCC:GNU编译器集合。 GCC包含C、C++、FORTRAN和艾达等编译器。
- “ Make”:用于自动化构建过程,当您拥有多个文件时,这将非常有用。
- “Grep”和“sed”:用于执行更强大的搜索、搜索和替换(在用数据填充表格时很有用)。
- “'Diffutils'”:对于显示两个文件之间的差异非常有用。
- “ Perl”或“ Python”:应安装这两种脚本语言之一。 用于字符串操作等。 Perl过去是推荐的,但Python现在已经相当成熟,可能更容易学习。 两者都有数百个包/模块可用于执行各种任务。
- “汇编器”:例如NASM或GAS。 This varies depending on your target CPU architecture.
- An editor: For writing your Assembly, C, and other (code) files.
您可能不会使用所有这些工具,但最好是手头有它们“以防万一”,并且知道如何使用它们,即使是在基本层面上。 但是如果您决定使用另一种 language,那么工具主要取决于您,而上面的列表可能对您没有任何帮助。 以下是主要与C/C++或汇编开发人员相关的信息。
GNU/Linux
最推荐的操作系统开发系统是GNU/Linux。 在使用GNU/Linux时,大多数GNU开发工具可能已经存在。 如果没有,请根据需要使用发行版的软件包管理工具(APT、RPM、Portage、Pacman、Apk等)进行安装。 同样,需要制作一个交叉编译器,以避免链接到开发系统的运行时文件中。
常见的编辑器有 Vim、 Emacs、 KDevelop、u Edit | Komodo Edit等。 有些人更喜欢轻量级编辑器而不是IDE,例如 gedit、 Geany和 SciTE。 很多人喜欢 Midnight Commander,它有一个Text UI和一个内置编辑器(mcedit),因此非常轻量级和闪电般的速度。
关于应该使用哪些发行版,请参阅[1]。 它们有各种形状和大小,并不都适合内核开发。 不要使用有特定目标的发行版,如安全(Kali、Qubes、BackTrack、Parrot等)、科学应用程序(如Scientific)、防火墙和路由(如DD-WRT),系统恢复或嵌入式环境(Knoppix、Rescatux、TinyCore)或专门针对初学者的环境(如LinuxMint、Nitrux等)。虽然初学者友好的Linux可以做到这一点,但请选择一个通用发行版。 还可以使用具有最新软件包的发行版,最好选择使用滚动发布的发行版。 Debian很容易使用,但通常会提供古老的、经过修补的版本(这些工具可能不会像上面描述的那样工作)。许多初学者喜欢Ubuntu,这很好,但据报道它在某些工具链和编译环境中存在问题(如果您编译自己的 Cross-Compiler而不是使用已安装的工具,这不是问题)。
用于内核开发的最佳发行版是(但请记住这也是个人喜好的问题,因此这些发行版不是必需的,而是建议的,它们通常需要一些经验):Arch、Gentoo、Solus、Slackware、void等,甚至Puppy。
如果您不确定,请尝试Ubuntu或Manjaro。
Windows
为了获得必要的工具,您应该安装Cygwin环境。 MinGW或DJGPP是备选方案,但[2],因为它是最完整、最兼容的环境,还包括一个用于安装库和工具的软件包管理器。
微软最近(在撰写本文时)发布了Linux的Windows子系统,作为Windows 10的可选功能。它基本上是一个真正的Ubuntu命令行发行版,运行在Windows上,不使用VM。 最新的GCC和Binutils(编写时为6.1.0和2.27)在此环境中编译并正常工作。 使用bashshell,您可以通过/mnt/<drive-letter>访问Windows硬盘。 此解决方案的优点是,您可以使用所需的任何Windows或Linux工具,而无需了解它们是否在Cygwin中工作。 许多需要的工具可以使用“apt-get”安装。
对于以上所有内容,强烈建议构建交叉编译器,这不仅是因为默认编译器针对不同的 Executable format,而且因为这通常是一个好主意。 有关详细信息和说明,请查看GCC交叉编译器页面。
你还需要一个编辑。 使用记事本可以,但是如果你有一个更完整的编辑器,它会更容易。 比如说,[3]或[4]被许多人使用。 如果您熟悉Unix编辑器,可以从Cygwin提供的选项中选择一个(包括Vim和Emacs,这需要一些时间才能习惯,但功能非常强大)。
也可以使用Visual Studio,或免费下载[http://www.microsoft.com/express/Visual C++快件版,编写和编译你的操作系统。 您将需要一个特殊的配置文件,您当然是少数,但它确实工作得很好。 您甚至可以在上面安装Windows SDK,支持64位开发。 唯一的缺陷是它不支持内联汇编。
也可以使用Watcom或Borland等其他工具,但它们都有自己的特定要求,并且没有广泛用于此类工作。
另一个考虑因素是,您的操作系统可能有一个自我托管的目标,也就是说,您可以使用您的操作系统编译您的操作系统。 如果您的操作系统是用C编写的,那么您的最低要求就是C编译器和C库。 如果您希望您的操作系统是Windows克隆而不是另一个兼容POSIX的操作系统,那么您需要一个执行Windows调用而不是POSIX调用的C库,并且您需要一个只使用C库而不是POSIX调用的C编译器。 [5]符合这一要求。
MacOS
因为它使用FreeBSD的用户区,所以完全兼容POSIX。 所有常用工具都可用(vi、bash、dd、cat、sed、tar、cpio等)。)几乎每个教程都是开箱即用的。 缺少的工具大多与文件系统相关:没有 Loopback Device,没有fdisk,没有mkfs。vfat或mtools。 但是您可以使用diskutil来实现这些目的,或者使用[6]或[7]以安装缺少的工具。
为了获得gcc,旧版本的第二次安装DVD上通常有mpkg。 较新的MacOS版本(10.13及更高版本)可以通过从终端运行“XCode select--install”来安装命令行XCode(不是IDE,只是工具链)。 这将安装gcc、binutils和make。 这个gcc实际上是一个伪装的叮当声,但功能足够完善,可以毫无问题地构建您自己的交叉编译器。 最好使用官方编译器引导gcc,而不是从brew或macports安装。
测试您的操作系统
- 正文: Testing
上面的文章深入讨论了如何选择测试操作系统以及如何将其与开发过程集成。 讨论了物理和仿真测试环境。
保护您的代码
在代码构建过程中,您将编写成百上千行代码。 你会花上数不清的时间,在你真正应该睡觉的时候熬夜编码。 您最不需要的是磁盘崩溃或写得不好的“rm”或“format”命令,这会使您的工作付诸东流。
你需要的是一个[8]。 CVS has been used for a number of years, but has gotten a lot of competition from Subversion, Bazaar, Mercurial, and Git lately. 如果可以,您应该将远程计算机或服务器设置为版本控制服务器,但如果您没有这样的计算机,您也可以在本地开发计算机上托管版本控制系统。 只需记得偶尔将代码备份到CD或FTP即可。
我们不能过分强调这一点:如果您还没有使用源代码管理,您应该立即开始这样做。 您只需在代码中犯一次严重错误,就可以认识到安全地对代码进行版本控制并易于检索的重要性。 对于一个小型的私人爱好项目来说,这似乎有些过分,但一旦你养成了使用修订控制的习惯,你就会想,没有修订控制你会怎么做。
对于Git,您可以在其上创建项目[9]或[10]。 两者都有免费的私有存储库。
在网络可访问的存储库上使用版本控制的另一个好处是,它使与他人协作和获得他人帮助变得更加容易。 这非常有用,尤其是在论坛中,因为它可以避免不断向消息线程发布代码的更新版本——您只需将对话指向您的存储库,线程中的其他人就可以直接访问您最新的更改。 随着项目的发展,如果您开始与其他开发人员合作开发项目,这一点也很重要(只是[[初学者错误#团队合作|不要期望一夜之间发生])。
共同出发点
获取64位 Higher Half Kernel的“Hello World”的最简单方法是Stivale Bare Bones教程。 另一种方法是在Boot Sequence页面上了解计算机本身是如何启动的。
还有许多其他教程可用。
获得进一步的知识
今天,互联网上有大量关于操作系统开发的知识。这只是找到它的问题。首先,这就是维基本身。除其他外,我们还有很多教程。既然你在这里,你可能已经找到了。在这个网站上还有[http://www.osdev.org/phpBB2/论坛),许多开发者都会在这里闲逛,并可以帮助您(但请确保您首先阅读如何提问。已经写了不少关于操作系统开发的书。我们的Books页面上介绍了其中一些内容,更多内容请访问[http://www.osdever.net/tutorials/奥斯德弗。net也一样。
See Also
文章
线程
外部链接
- Bona Fide OS Development contains several tutorials and documentation.
- Implementing an Operating System by Andrew S. Tanenbaum.