Getting Started

来自osdev
Zhang3讨论 | 贡献2022年2月13日 (日) 07:55的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

首先,开发一个操作系统可能是你在计算机上能做的最具挑战性的事情之一(仅次于在噩梦难度里杀死Doom最终BOSS)。 编写操作系统需要计算机科学中几个复杂领域的大量知识。 你需要了解硬件是如何工作的,并且能够读写复杂的汇编语言以及更高级别的语言 (例如C,C++或 Pascal)。 你的头脑必须能够把自己包裹在抽象的理论中,并拥有无数的好想法。 感觉到气馁了吗? 别害怕! 因为所有这些都让操作系统编程变得开心有趣。

当你经过几个小时的努力,最终解决问题时,没有什么比这时的成就感更好的了。 一段时间后,你在回顾中会发现你已经从头开始创建了所有内容。 你的手写系统能够启动,对硬件执行魔法,并为用户使用提供了用户界面和程序。

创建操作系统时没有必须采用的绝对路径。 一旦你让你的初始系统启动并运行 (通过找到适当的教程来做到这一点),可以再自由选择采取下一步的路径。 你的操作系统就是你的。 你拥有终极控制权,天空是无限的!

残酷的事实

你得接受操作系统开发是一个复杂且持续的过程,而这一事实不会让你气馁。 事实是,操作系统开发真的是无与伦比的,因为它需要极大的耐心和仔细的代码设计,而且它相比游戏和基于Web脚本开发获得的“即时满足感”很少,甚至没有。

你已经被郑重警告了未来的艰苦工作,但是如果你仍然感兴趣,那就进入操作系统程序员的领域。 为偶尔的困惑、沮丧,对我们中的一些人来说甚至是暂时的精神错乱做好准备。 假以时日,如果你有足够的奉献精神,你会发现自己是为数不多的为操作系统做出贡献的精英之一。 如果你在此过程中确实感到气馁,请刷新本书的内容。 希望它能提醒你当初为什么要开始这样疯狂的旅程。

在这个阶段,阅读起步错误页面也是值得的。 论坛上的用户已经注意到,随着时间的推移,许多这些错误会重复出现,避免这些错误是一个不出丑的好方法。

责任

人们倾向于声称编写低效的软件是可以的,说现在的计算机系统太快了,你看不到它的影响。 这种心态在操作系统设计中是危险的。 在制作一个简单的应用程序时,编写草率的代码是可以的,但是当涉及到每秒可能被调用数千次的关键代码时,你需要尽可能地减少系统开销。 操作系统应该以尽可能少的复杂性、抽象性和开销将计算机作为基本资源提供给正在运行的应用程序。

在当今时代设计操作系统的人往往具有 “该有不该有的全有” 的心态。 反正自己负责一切,这当然是无所谓,但这不应该以让糟糕的程序盘根错节为代价。 当程序错误发生时,有许多事情在“幕后”进行。 编写不良的程序会花费宝贵的执行时间,并且任务切换频率很高,涉及的内存消耗很大。 我们建议你不要给那些编写糟糕的软件以支持。

必备知识

正文: Required Knowledge

在你认为可以跳过这部分前,请稍微阅读一下本页的内容。

因为它在论坛讨论中经常被提及,本节已被移至另一页

组织你的计划

在继续之前,请考虑要从编写操作系统中你想要获得的系统特性。 你参与这个项目的动机是什么? 从事爱好操作系统项目有很多可能的原因,而且大多数操作系统开发人员都有不止一个原因。 虽然 “我就只是想试试” 就足够了,但你越考虑和澄清你的目标和动机,你就越能专注于你真正想要的。

对自己也要诚实。 对你的项目抱有更大的抱负没有什么可羞耻的,即使(或者特别是)如果它们不是你的首要目标。 尝试承认 所有目标,而不仅仅是你认为是主要目标的目标。

试着确定你对操作系统设计的哪些方面最感兴趣,或者你认为有必要去做。 OS dev的大部分工作,特别是早期的工作,都是内核设计和开发,但内核本身只是大多数操作系统的一小部分; 如果你的主要兴趣是在用户体验,或网络,或驱动程序编程,你应该考虑你是否真的需要 (现在或将来) 编写自己的操作系统,也许你会满足于在现有的内核上开发前面这些东西。 很多人在其实是想要设计桌面环境的时候就开始深入操作系统开发,所以是否真的要从零开发一个操作系统是非常重要的问题。

试着考虑一些你可能想要首先承担或同时承担的任何非操作系统级别的项目,特别是那些也可能作为操作系统项目的练习或准备的项目。 通常不需要 “马上” 进行操作系统项目,提前准备的越多,你的路就会越好走 (至少在某种程度上,准备是一回事,拖延是另一回事)。

类似地,如果你打算对现有设计进行分支以进行实验,或者为了某些特定目的进行修改,那么请关注该设计,而不是一般的开发问题。 考虑你将需要现有代码库的哪一部分,以及你想要更改哪些代码库。

如果这样做有帮助的话,可以尝试制定一些特定的项目目标,并准备计划单独的项目。 如果你只是想各处了解一下,看看它会带你去哪里,那很好;如果你的意图是推翻微软,那也没关系(哪怕可能不现实)。 一旦你知道你想要做什么,你就可以把它的细节分解成具体的目标,然后计算出需要什么才能实现这些目标。 不要试图将太多不同的目标强加于一个项目--如果你有不同的目标,你想尝试不同的东西,就把它们分成不同的项目。

如果你写下计划中的操作系统设计的概述,列出你认为值得注意的任何特定要求或细节,也可以澄清你需要帮助的内容,并在可能的情况下将其添加到你的公共存储库,这可能会有所帮助。 这不仅会使其他人更容易帮助你,还有助于组织和稳定你的计划,就像为一篇故事或论文写大纲一样。 当你的目标和计划发生变化时,准备好维护它,但保留一份旧版本的副本(或者更好的是,将文档置于版本控制之下),这样你就可以看到你的工作随着时间的推移是如何发展的。

最后,审查项目所需的时间和资源,并确定它们是否可行。 如果你知道你只有一定的时间投入到这个项目中,考虑到这一点,无论你做什么,“不要” 承诺一个对外的截止日期,即使你确定你能达到它。 操作系统开发需要时间——很多时间——而试图在一个学期内完成一个完整的操作系统项目是不现实的。

选择你的开发环境

你需要一个平台来开发你的新系统。 遵循计算通用性的趋势,最流行的是GNU/Linux,但许多人也使用Windows。 使用GNU/Linux系统的开发人员在工具可用性方面略有优势,但这可以在Windows上使用CygwinMinGW这样的系统来解决。

  • Binutils: 操作对象文件的基本工具。
  • GCC: GNU编译器集合。GCC包含C,C++,Fortran和Ada等的编译器。
  • Make 用于自动化构建过程,一旦你拥有大量文件,这将变得非常有用。
  • Grepsed: 用于执行更强大的搜索、替换(在用数据填写表格时很有用)。
  • Diffutils: 对于显示两个文件之间的差异非常有用。
  • PerlPython: 应该安装这两种脚本语言中的一种。 它们可用于字符串操作等其它工作。 Perl曾经是推荐,但Python现在已经相当成熟,可能更容易学习。 两者都有数百个包/模块可用于执行各种任务。
  • 一个汇编器: 例如NASM或GAS。这取决于你的目标CPU体系结构。
  • 编辑器: 用于编写汇编、C和其他 (代码) 文件。

你可能不会使用所有这些工具,但最好是“以防万一”手头有它们,并且知道如何使用它们,即使仅在基本层面上。 但是,如果你决定换一种语言,那么工具在很大程度上取决于你,也许上面的列表对你没有任何帮助。 以下是主要与C/C++或汇编开发人员有关的信息。

GNU/Linux

最推荐的操作系统开发系统是GNU/Linux。 使用GNU/Linux时,大部分GNU开发工具很可能已经存在。 如果没有,请根据需要使用发行版的软件包管理工具(APT、RPM、Portage、Pacman、Apk等)进行安装。 同样,需要制作交叉编译器,以免链接到开发系统的运行时文件中。

常见的编辑器有 Vim Emacs KDevelop Komodo Edit 等。 有些人更喜欢轻量级编辑器而不是IDE,比如 geditGeany SciTE。 很多人喜欢Midnight Commander,它有一个Text UI和一个内置编辑器(Mcedit),因此非常轻便,速度也非常快。

关于应该使用哪些发行版,请查阅 Linux发行版列表。 它们有各种形式和大小,并不都适合内核开发。 不要使用有特定目标的发行版,如安全性(Kali、Qubes、Back Track、Parrott等)、科学应用程序(例如: Scientific)、防火墙和路由(例如,DD-WRT)、系统恢复或嵌入式环境(Knoppix、Rescatux、TinyCore)或专门针对初学者的发行版(如Linux Mint、Nitrux等) 尽管初学者友好的Linux也可以用,但请选择一个通用发行版。 还可以使用具有最新软件包的发行版,最好选择使用滚动发布的发行版。 Debian很容易使用,但通常会附带古老的补丁版本(这些工具可能不会像所描述的那样运行)。 许多初学者喜欢Ubuntu,这很好,但据报道它有一些工具链和编译环境的问题 (如果你编译自己的 交叉编译器 而不是使用安装的,这不是问题)。

用于内核开发的最佳发行版是(但请记住,这也是个人喜好的问题,因此这些发行版不是必需的,而是建议的,它们通常需要一些技术经验): Arch,Gentoo,Solus,Slackware,VOID等等,甚至Puppy。

如果不确定,请尝试Ubuntu或Manjaro。

Windows

为了获得必要的工具,你应该安装Cygwin环境。 MinGWDJGPP 是替代方案,但强烈建议 MSYS2,因为它是最完整和兼容的环境,并且还包括用于安装库和工具的软件包管理器。

微软最近(在撰写本文时)发布了Windows Linux子系统,作为Windows 10的可选功能。 它基本上是一个真正的Ubuntu命令行发行版,运行在Windows之上,不需要使用VM。 最新的GCC和Binutils (编写时的6.1.0和2.27) 都可以在此环境中编译并正常工作。 使用Bash shell,你可以通过/mnt/<drive letter>访问Windows硬盘。 此解决方案的优势在于,你可以使用所需的任何Windows或Linux工具,而不必了解它们在Cygwin中是否可以工作。 其它许多需要的工具可以使用 “apt-get” 安装。

对于以上所有内容,强烈建议构建一个交叉编译器,这不仅是因为默认编译器针对不同的可执行格式s,这通常是一个好主意。 有关详细信息和说明,请查看GCC Cross-Compiler页面。

你还需要一个编辑器。 使用记事本可以,但如果你有一个更完整的编辑器,它会更容易。 例如,记事本++Notepad2被很多人使用。 如果你对Unix编辑器感到满意,你可以从Cygwin提供的选择中选择一个(例如,包括Vim和Emacs,它们需要一些习惯,但功能非常强大)。

也可以使用Visual Studio或可免费下载的Visual C++ Express Edition来编写和编译你的操作系统。 你将需要一个特殊的配置文件,这样做的人数比较少,但它确实工作得很好。 你甚至可以在上面安装Windows SDK,支持64位开发。 唯一的缺陷是这不支持内联汇编。

也可以使用其他工具,例如 WatcomBorland,但是它们都有自己的特定要求,并且并未广泛用于此类工作。

另一个考虑因素是,你打算开发的操作系统目标可能是自我托管,也就是说,你打赏在你的操作系统中编译你的操作系统。 如果你的操作系统是用C编写的,那么你要达到的最低要求将是一个C编译器和C库。 如果你打算让你的操作系统成为一个Windows复刻,而不是另一个POSIX兼容的操作系统,你将需要一个做Windows调用而不是POSIX调用的C库,你将需要一个只使用C库而不是做POSIX调用的C编译器。GCCWIN + PDPCLIB 符合这个要求。

MacOS

因为在幕后它使用的是FreeBSD的用户空间,所以它完全兼容POSIX。 所有常用工具都可用 (vi,bash,dd,cat,sed,tar,cpio等)几乎每个教程都是开箱即用的。 缺少的工具大多与文件系统相关:没有 Loopback Device,没有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安装。

测试你的操作系统

正文: Testing

上面的文章链接深入介绍了选择如何测试操作系统以及如何将其与开发过程集成。 讨论了物理和仿真测试环境。

保护你的代码

在代码构建过程中,你将编写数百甚至数千行代码。 你会花上数不清的时间,在你真正应该睡觉的时候熬夜编码。 你最不想遇到的事情就是磁盘崩溃,让一个写得不好的‘rm’或‘format’命令让你的所有工作付之东流。

你需要的是一个版本控制系统[1]已经使用多年,但最近受到了来自SubversionBazaarMercurialGit的激烈竞争。 如果可以,你应该将远程计算机或服务器设置为版本控制服务器,但是如果你没有这样的计算机,你也可以在本地开发计算机上托管版本控制系统。 只需记得偶尔将代码备份到CD或FTP即可。

我们再怎么强调这一点也不为过: 如果你尚未使用源代码管理,则应立即开始使用。 你只需要在代码中犯一次严重错误,就可以意识到安全地对代码进行版本控制并易于检索的重要性。 虽然对于一个小型的私人爱好项目来说,这看起来有点过头了,但是一旦你养成了使用修订控制的习惯,你就会难以想象没有它你要怎么办。

对于Git,你可以在 GitHubBitbucket 上创建项目。两者都有免费的私人存储库。

在网络可访问的存储库上使用版本控制的另一个好处是,它使与他人协作和获得他人帮助变得更加容易。 这可能非常有用,特别是在论坛中,因为它可以避免不断向消息论坛发布代码的更新版本--你只需将对话指向你的存储库,论坛主题中的其他人就可以直接访问你的最新更改。 如果随着项目的发展,你开始与项目的其他开发人员一起工作,这也是至关重要的 (只是 不要期望这种情况会在一夜之间发生)。

共同的起点

Higher Half Kernel是一个64位的“Hello World”教程,获取它的最简单方法是学习Stivale Bare Bones。 另一种学习路径是在 Boot Sequence 页面上了解计算机本身是如何启动的。

这里还有许多其他的教程可用。

获取更多知识

今天,互联网上有大量关于操作系统开发的知识。 只是看你能不能找到它。 首先,这个维基网站本身就有很多内容。 除其他外,本站还有很多Tutorials。 既然你已经访问到这里了,你可能已经找到了。 这个网站上还有论坛),许多开发者都会在那里闲逛,并可以帮助你(但一定要先阅读如何提问。 现在已经有相当多关于操作系统开发的书。 其中许多内容在我们的 书籍 页面上进行了介绍,并且在 [http://www.osdever.net/tutorials/ osdever.net 上进行了更多介绍。

另见

文章

论坛主题

外部链接