“Getting Started”的版本间差异

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


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


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


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


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


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


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


在这个时代设计操作系统的人往往有“除了厨房水槽以外的一切”的心态。 他们自己负责一切,这当然是好的,但这不应该以牺牲编写糟糕的程序的繁荣为代价。 当程序错误发生时,有许多事情是在“幕后”进行的。 写得不好的程序会耗费宝贵的执行时间,并且会涉及在内存和频率方面都很昂贵的任务切换。 我们鼓励您不要使用编写糟糕的软件。
在当今时代设计操作系统的人往往具有 “该有不该有的全有” 的心态。 反正自己负责一切,这当然是无所谓,但这不应该以让糟糕的程序盘根错节为代价。 当程序错误发生时,有许多事情在“幕后”进行。 编写不良的程序会花费宝贵的执行时间,并且涉及的任务切换在内存和频率上都很昂贵。 我们建议你不要给那些编写糟糕的软件以支持。


== 所需知识 ==
==必备知识==
{{Main|Required Knowledge}}
{{Main|Required Knowledge}}


''如果你认为你可以跳过这个,那就是为了你。''
''' 就算你认为可以跳过这里,但最好还是阅读一下这些内容。'''


“本节已[[必要知识|移至另一页]],因为论坛讨论中经常提到它。”
''因为它在论坛讨论中经常被提及,本节已被[[Required Knowledge|移至另一页]]。''


==组织你的计划==
==组织你的计划==
在继续之前,考虑一下你想从编写一个操作系统中得到什么。 你参与这个项目的动机是什么?从事业余操作系统项目有很多可能的原因,大多数操作系统开发人员都有不止一个原因。 即使只是说,“我只想”就足够了,尽管你越仔细考虑和明确你的目标和动机,你就越能专注于你真正想要的。
在继续之前,请考虑要从编写操作系统中获得的内容。 你参与这个项目的动机是什么? 从事爱好操作系统项目有很多可能的原因,而且大多数操作系统开发人员都有不止一个原因。 虽然 “我就只是想试试” 就足够了,但你越考虑和澄清你的目标和动机,你就越能专注于你真正想要的。


对自己也要诚实。 对你的项目有更大的雄心壮志并不羞耻,即使(尤其是)这些雄心壮志不是首要目标。 试着承认“所有”你的目标,而不仅仅是你认为是你的主要目的。
对自己也要诚实。 对你的项目抱有更大的抱负没有什么可羞耻的,即使(或者特别是)如果它们不是你的首要目标。 尝试承认 ''所有''目标,而不仅仅是你认为是主要目标的目标。


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


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


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


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


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


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


==选择您的开发环境==
==选择你的开发环境==
你需要一个平台来开发你的新系统。 遵循通用计算的趋势,最流行的是GNU/Linux,但许多人也使用Windows。 使用GNU/Linux系统的开发人员在工具可用性方面稍有优势,但这可以在Windows上使用[[Cygwin]]或[[MinGW]]等系统来解决。
你需要一个平台来开发你的新系统。 遵循通用计算的趋势,最流行的是GNU/Linux,但许多人也使用Windows。 使用GNU/Linux系统的开发人员在工具可用性方面略有优势,但这可以在Windows上使用[[Cygwin]]或[[MinGW]]这样的系统来解决。


*''Binutils'':操作对象文件的基本工具。
* '''Binutils''': 操作对象文件的基本工具。
*'''[[GCC]]'':GNU编译器集合。 GCC包含C、C++、FORTRAN和艾达等编译器。
*'''[[GCC]]''': GNU编译器集合。GCC包含C,C++,Fortran和Ada等的编译器。
*[[Makefile | Make]]”:用于自动化构建过程,当您拥有多个文件时,这将非常有用。
* '''[[Makefile | Make]]''' 用于自动化构建过程,一旦你拥有大量文件,这将变得非常有用。
*“Grep”和“sed”:用于执行更强大的搜索、搜索和替换(在用数据填充表格时很有用)。
* '''Grep''' 和 '''sed''': 用于执行更强大的搜索、替换(在用数据填写表格时很有用)。
*'Diffutils'”:对于显示两个文件之间的差异非常有用。
* '''Diffutils''': 对于显示两个文件之间的差异非常有用。
*[[Wikipedia:Perl | Perl]]”或“[[Wikipedia:Python(编程语言)| Python]]”:应安装这两种脚本语言之一。 用于字符串操作等。 Perl过去是推荐的,但Python现在已经相当成熟,可能更容易学习。 两者都有数百个包/模块可用于执行各种任务。
* '''[[Wikipedia:Perl | Perl]]'''或 '''[[Wikipedia:Python_(programming_language)|Python]]''': 应该安装这两种脚本语言中的一种。 它们可用于字符串操作等其它工作。 Perl曾经是推荐,但Python现在已经相当成熟,可能更容易学习。 两者都有数百个包/模块可用于执行各种任务。
*[[我应该使用哪个汇编器?(x86)|汇编器]]”:例如NASM或GAS。 This varies depending on your target CPU architecture.
* '''[[Which assembler should I use?(x86)| 一个汇编器]]''': 例如NASM或GAS。这取决于你的目标CPU体系结构。
* '''[[List of editors|An editor]]''': For writing your Assembly, C, and other (code) files.
*‘[[List of editors|编辑器]]’‘: 用于编写汇编、C和其他 (代码) 文件。


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


===GNU/Linux===
==GNU/Linux===


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


常见的编辑器有[[Wikipedia:Vim(文本编辑器)| Vim]]、[[Wikipedia:Emacs | Emacs]]、[[Wikipedia:KDevelop | KDevelop]]、[[Wikipedia:Komodo|u Edit | Komodo Edit]]等。 有些人更喜欢轻量级编辑器而不是IDE,例如[[Wikipedia:gedit | gedit]]、[[Wikipedia:Geany | Geany]]和[[Wikipedia:SciTE | SciTE]]。 很多人喜欢[[Wikipedia:Midnight_Commander | Midnight Commander]],它有一个[[Text UI]]和一个内置编辑器(mcedit),因此非常轻量级和闪电般的速度。
常见的编辑者有 [[Wikipedia:Vim (text editor)| Vim]] 、 [[Wikipedia:Emacs | Emacs]] 、 [[Wikipedia:KDevelop | KDevelop]] 、 [[Wikipedia:Komodo_Edit | Komodo Edit]] 等。 有些人更喜欢轻量级编辑器而不是IDE,比如[[Wikipedia:gedit | gedit]]、[[Wikipedia:Geany | Geany]和[[Wikipedia:SciTE | SciTE]]。 很多人喜欢[[Wikipedia:Midnight_Commander|Midnight Commander]],它有一个[[Text UI]]和一个内置编辑器(Mcedit),因此非常轻便,速度也非常快。


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


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


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


===Windows===
===Windows===


为了获得必要的工具,您应该安装[[Cygwin]]环境。 [[MinGW]]或[[DJGPP]]是备选方案,但[https://www.msys2.org/强烈建议使用MSYS2],因为它是最完整、最兼容的环境,还包括一个用于安装库和工具的软件包管理器。
为了获得必要的工具,你应该安装[[Cygwin]]环境。 [[MinGW]] 或 [[DJGPP]] 是替代方案,但强烈建议 [https://www.msys2.org/ MSYS2],因为它是最完整和兼容的环境,并且还包括用于安装库和工具的软件包管理器。


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


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


你还需要一个编辑。 使用记事本可以,但是如果你有一个更完整的编辑器,它会更容易。 比如说,[http://notepad-plus-plus.org/记事本+++]或[http://www.flos-freeware.ch/notepad2.html注2]被许多人使用。 如果您熟悉Unix编辑器,可以从Cygwin提供的选项中选择一个(包括Vim和Emacs,这需要一些时间才能习惯,但功能非常强大)。
你还需要一个编辑器。 使用记事本可以,但如果你有一个更完整的编辑器,它会更容易。 例如,[http://notepad-plus-plus.org/ 记事本++]或[http://www.flos-freeware.ch/notepad2.html Notepad2]被很多人使用。 如果你对Unix编辑器感到满意,你可以从Cygwin提供的选择中选择一个(例如,包括Vim和Emacs,它们需要一些习惯,但功能非常强大)。


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


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


另一个考虑因素是,您的操作系统可能有一个自我托管的目标,也就是说,您可以使用您的操作系统编译您的操作系统。 如果您的操作系统是用C编写的,那么您的最低要求就是C编译器和C库。 如果您希望您的操作系统是Windows克隆而不是另一个兼容POSIX的操作系统,那么您需要一个执行Windows调用而不是POSIX调用的C库,并且您需要一个只使用C库而不是POSIX调用的C编译器。 [http://pdos.orgGCCWIN+PDPCLIB]符合这一要求。
另一个考虑因素是,你打算开发的操作系统目标可能是自我托管,也就是说,你打赏在你的操作系统中编译你的操作系统。 如果你的操作系统是用C编写的,那么你要达到的最低要求将是一个C编译器和C库。 如果你打算让你的操作系统成为一个Windows克隆,而不是另一个POSIX兼容的操作系统,你将需要一个做Windows调用而不是POSIX调用的C库,你将需要一个只使用C库而不是做POSIX调用的C编译器。[http://pdos.org GCCWIN + PDPCLIB] 符合这个要求。


===MacOS===
===MacOS===


因为它使用FreeBSD的用户区,所以完全兼容POSIX。 所有常用工具都可用(vi、bash、dd、cat、sed、tar、cpio等)。)几乎每个教程都是开箱即用的。 缺少的工具大多与文件系统相关:没有[[Loopback_Device | Loopback Device]],没有fdisk,没有mkfs。vfat或mtools。 但是您可以使用diskutil来实现这些目的,或者使用[https://brew.sh/brew]或[https://www.macports.org/macports]以安装缺少的工具。
因为在幕后它使用的是FreeBSD的用户空间,所以它完全兼容POSIX。 所有常用工具都可用 (vi,bash,dd,cat,sed,tar,cpio等)几乎每个教程都是开箱即用的。 缺少的工具大多与文件系统相关:没有[[Loopback_Device | Loopback Device]],没有fdisk,没有mkfs.vfat和mtools。 但是你可以使用diskutil来实现这些目的,或者使用[https://brew.sh/ BREW]或[https://www.macports.org/ macports]来安装那些缺少的工具。


为了获得gcc,旧版本的第二次安装DVD上通常有mpkg。 较新的MacOS版本(10.13及更高版本)可以通过从终端运行“XCode select--install”来安装命令行XCode(不是IDE,只是工具链)。 这将安装gcc、binutils和make。 这个gcc实际上是一个伪装的叮当声,但功能足够完善,可以毫无问题地构建您自己的[[gcc_交叉编译器|交叉编译器]]。 最好使用官方编译器引导gcc,而不是从brew或macports安装。
要获得gcc,以前可以在旧版本的第二个安装DVD上有一个mpkg。 较新的MacOS版本(10.13及更高版本)可以通过从终端运行“XCode select--install”来安装命令行XCode(不是IDE,只安装工具链)。 这将安装GCC、binutils和make。 这个gcc实际上是一个改头换面的CLang,但功能足够充分,可以毫无问题地构建自己的 [[GCC_Cross-Compiler | 交叉编译器]]。 最好使用官方编译器引导gcc,而不是从brew或macports安装。


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


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


你需要的是一个[https://en.wikipedia.org/wiki/Version_control版本控制系统]。 [http://www.nongnu.org/cvs/ CVS] has been used for a number of years, but has gotten a lot of competition from [http://subversion.apache.org/ Subversion], [http://bazaar-vcs.org/ Bazaar], [https://www.mercurial-scm.org// Mercurial], and [http://git-scm.com/ Git] lately. 如果可以,您应该将远程计算机或服务器设置为版本控制服务器,但如果您没有这样的计算机,您也可以在本地开发计算机上托管版本控制系统。 只需记得偶尔将代码备份到CD或FTP即可。
你需要的是一个[https://en.wikipedia.org/wiki/Version_control 版本控制系统]。 [http://www.nongnu.org/cvs/Cvs]已经使用多年,但最近受到了来自[http://subversion.apache.org/Subversion][http://bazaar-vcs.org/Bazaar][https://www.mercurial-scm.org//Mercurial][http://git-scm.com/Git]的激烈竞争。 如果可以,你应该将远程计算机或服务器设置为版本控制服务器,但是如果你没有这样的计算机,你也可以在本地开发计算机上托管版本控制系统。 只需记得偶尔将代码备份到CD或FTP即可。


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


对于Git,您可以在其上创建项目[https://github.com/GitHub]或[https://bitbucket.org比特桶]。 两者都有免费的私有存储库。
对于Git,你可以在 [https://github.com/ GitHub] 或 [https://bitbucket.org Bitbucket] 上创建项目。两者都有免费的私人存储库。


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


==共同出发点==
==共同的起点==


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


还有许多其他[[教程]]可用。
这里还有许多其他的[[Tutorials|教程]]可用。


==获得进一步的知识==
==获取更多知识==
今天,互联网上有大量关于操作系统开发的知识。这只是找到它的问题。首先,这就是维基本身。除其他外,我们还有很多[[:类别:教程|教程]]。既然你在这里,你可能已经找到了。在这个网站上还有[http://www.osdev.org/phpBB2/论坛),许多开发者都会在这里闲逛,并可以帮助您(但请确保您首先阅读[[如何提问|如何提问]]。已经写了不少关于操作系统开发的书。我们的[[Books]]页面上介绍了其中一些内容,更多内容请访问[http://www.osdever.net/tutorials/奥斯德弗。net也一样。
今天,互联网上有大量关于操作系统开发的知识。 只是看你能不能找到它。 首先,这就是维基本身。 除其他外,本站还有很多[[:Category:Tutorials|Tutorials]]。 既然你已经访问到这里了,你可能已经找到了。 这个网站上还有[http://www.osdev.org/phpBB2/ 论坛),许多开发者都会在那里闲逛,并可以帮助你(但一定要先阅读[[How_To_Ask_Questions|如何提问]]。 现在已经有相当多关于操作系统开发的书。 其中许多内容在我们的 [[Books|书籍]] 页面上进行了介绍,并且在 [http://www.osdever.net/tutorials/ osdever.net] 上进行了更多介绍。


== See Also ==
==另见==


=== 文章 ===
===文章===
* [[:Category:Bare bones tutorials |Bare bones tutorials]]
* [[:Category:Bare bones tutorials |Bare bones tutorials]]
* [[Resources]]
* [[Resources|资源]]
* [[What order should I make things in]]?
*[[What order should I make things in|我应该按什么顺序进行]


=== 线程 ===
=== 论坛主题 ===


=== 外部链接 ===
=== 外部链接 ===
* [http://www.osdever.net/ Bona Fide OS Development] contains several tutorials and documentation.
* [http://www.osdever.net/ Bona Fide OS Development]包含几个教程和文档。
* [http://www.informit.com/articles/article.aspx?p=26396 Implementing an Operating System] by Andrew S. Tanenbaum.
*[http://www.informit.com/articles/article.aspx?p=26396 Implementing an Operating System]作者:Andrew S.Tanenbaum。


[[Category:OS Development]]
[[Category:OS Development]]

2022年2月13日 (日) 05:24的版本

首先,开发一个操作系统可能是你在计算机上能做的最具挑战性的事情之一(仅次于在噩梦难度里杀死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,比如 gedit、[[Wikipedia:Geany | Geany]和 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]已经使用多年,但最近受到了来自[2][3][4][5]的激烈竞争。 如果可以,你应该将远程计算机或服务器设置为版本控制服务器,但是如果你没有这样的计算机,你也可以在本地开发计算机上托管版本控制系统。 只需记得偶尔将代码备份到CD或FTP即可。

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

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

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

共同的起点

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

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

获取更多知识

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

另见

文章

论坛主题

外部链接