原文链接:https://wiki.osdev.org/Getting_Started
主页:https://blog.csdn.net/qq_37422196/article/details/122591214
下面的链接如果指向原网站的话,大概是还没有翻译
在赶了在赶了……
首先,开发操作系统可能是你可以在计算机上完成的最具挑战性的事情之一(仅次于在毁灭战士的噩梦难度级别杀死最终Boss)。编写一个操作系统需要大量关于计算机科学中几个复杂领域的知识。你需要了解硬件的工作原理,并能够读写复杂的汇编语言以及高级语言(例如C、C++或Pascal)。你的头脑必须能够记住大量抽象的理论,并拥有无数的想法。感到气馁了吗?不要害怕!因为这些东西也使操作系统编程变得有趣
没有什么比经过几个小时的努力,终于解决了问题,更有成就感了。一段时间后,你可以回顾并查看你从头开始创建的所有内容。你写的系统能够启动,对硬件进行操作,并为用户提供用户界面和程序来玩
创建操作系统没有固定的方法。一旦写出并运行了初始系统(通过查找适当的教程来做到这一点),你就可以选择接下来该怎么做。你的操作系统是你自己的,你拥有终极控制权,并没有其他限制
一个令人伤心的事实
希望操作系统开发是一个复杂且持续的过程这一基本事实不会让你灰心。事实上,操作系统开发在难度上确实是无可比拟的,因为其需要极大的耐心和仔细的代码设计,并且你只能得到很少的甚至没有那种从开发游戏和基于Web的脚本之类的东西中获得的“即时满足感”
我们已经警告过你未来的工作会非常艰苦,但如果你仍然感兴趣,那么继续进入操作系统程序员的领域。做好困惑、沮丧和短暂的精神错乱的准备。随着时间的推移,只要投入足够的精力,你就会发现自己是为操作系统做出贡献的少数精英之一。如果你在此过程中感到灰心,请看看本书来重拾信心。希望它会提醒你为什么当初踏上了如此疯狂的旅程
在这个阶段,阅读初学者易犯错误也是值得的。论坛上的用户已经注意到这些错误随着时间的推移而重复出现,避开这些错误是一个的好主意
责任
人们通常说编写效率低下的软件是可以的,因为现在计算机系统如此之快,以至于你看不到其影响。这种心态在操作系统设计中是危险的。在制作一个简单的应用程序时编写草率的代码可能是可以的,但是当涉及到每秒可能被调用数千次的关键代码时,你需要尽可能地减少开销。操作系统应该为运行的应用程序提供计算机基本资源,并尽可能减少复杂性、抽象性和开销
在这个时代设计操作系统的人往往有“包揽一切”的心态。他们自己负责所有事情。这当然是好的,但不应该以允许写得不好的程序的数目膨胀为代价。如果这样,当程序发生错误时,有很多事情在“幕后”发生。写得不好的程序会占用宝贵的执行时间,并且任务切换在内存和性能都开销巨大。我们鼓励你停止编写不佳的软件
所需知识
主条目:所需知识
如果你认为你可以跳过这篇文章的话,它正是为你而写的
此部分已移至单独的页面,因为它在论坛讨论中经常被提及
制定你的计划
在继续之前,先考虑一下你想从编写操作系统中得到什么。你参与这个项目的动机是什么?从事一个爱好操作系统项目的原因有很多,而且大多数操作系统开发者有不止一个原因。即使只是说“我就是想”就足够了,尽管你越是考虑和认清你的目标和动机,你就越能专注于你真正想要的东西
对自己也要诚实。对你的项目有更大的野心并不可耻,即使(或特别是)它们不是主要目标。试着承认你所有的目标,而不仅仅是你所认为的主要目的
尝试确定你对操作系统设计的哪些方面最感兴趣或认为哪方面需要处理。操作系统开发的大部分内容,尤其是在早期,是内核设计和开发,但内核本身只是大多数操作系统的一小部分;如果你主要对UX、网络或驱动程序编程感兴趣,你应该考虑你是否真的需要(现在或将来)编写自己的操作系统,或者你只要在现有内核上进行以上开发。很多人在想设计桌面环境时进入了操作系统开发,所以说这个问题非常重要,一定要想清楚
试着想一想你可能想先或同时进行的任何非操作系统项目,尤其是那些可能作为操作系统项目的练习或准备的项目。这些现在通常不需要在操作系统项目上工作,而且你提前准备得越多,你的情况就会越好(至少在某种程度上——准备是一回事,拖延是另一回事)
同样,如果你打算fork现有设计以进行试验或针对某些特定目的进行修改,请专注于该设计而不是一般的开发问题。考虑一下你将需要现有代码库的哪一部分,以及你想要修改哪些部分
尝试制定一些具体的项目目标,并且如果有帮助的话准备好计划单独的项目。如果你只是想四处转转看看它会把你带到哪里,那很好;如果你的意图是推翻微软,那也很好(即使有些不切实际)。一旦你知道你想做什么,你就可以把它的细节分解成具体的目标,并找出实现这些目标需要什么。不要试图将太多不同的目标强加到一个项目中——如果你因为不同的目的想尝试不同的东西,那就把它们分成不同的项目
如果你写出你计划的操作系统设计的概述,包含你认为值得注意的所有特定要求或细节,或者可以阐明你需要帮助的内容,并且如有可能将其添加到你的公共存储库中,这可能会有所帮助。这不仅能让其他人能更好地帮助你,还能帮助组织和稳定你的计划,就像为故事或论文写大纲一样。准备好在你的目标和计划发生变化时对其进行维护,但保留一份旧版本的副本(或者更好的是,将文档托管给版本控制程序),以便你可以了解你的工作随着时间的推移如何发展
最后,审查项目所需的时间和资源,并确定它们是否可行。如果你知道自己只有有限的时间可以投入到该项目中,请考虑到这一点,并且无论你做什么,即使你确定可以完成它,也不要对外承诺截止日期。操作系统开发需要时间——很多时间——并且试图在一个学期内完成一个完整的操作系统项目是不现实的
选择开发环境
你需要一个平台来开发你的新系统。跟随通用计算的趋势,最流行的是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++或汇编开发人员相关的信息
GNU/Linux
最推荐用GNU/Linux系统来进行操作系统开发。使用 GNU/Linux 时,大多数GNU开发工具可能已经有了。如果没有,请使用你的发行版的包管理工具(APT、RPM、Portage、Pacman、Apk等)根据需要安装它们。同样,需要制作交叉编译器,以免链接到开发系统的运行时文件
常见的编辑器有Vim、Emacs、KDevelop、Komodo Edit等。有些人更喜欢轻量级编辑器而不是IDE,例如gedit、Geany和SciTE。许多人喜欢Midnight Commander,它有一个文字界面和一个内置编辑器(mcedit),因此非常轻巧且速度极快
至于你应该使用哪些发行版,请查阅Linux发行版列表. GNU/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
Windows
为了获得必要的工具,你应该安装Cygwin环境。MinGW和DJGPP是替代方案,但强烈建议使用MSYS2,因为它是最完整和兼容的环境,并且还包括用于安装库和工具的包管理器
微软最近(在撰写本文时)发布了适用于Linux的Windows子系统(WSL)作为Windows 10的可选功能。它基本上是一个在Windows之上运行的真正的Ubuntu命令行发行版,而无需使用虚拟机。最新的GCC和binutils(编写时分别为6.1.0和2.27)在此环境中能编译并正常工作。使用Bash shell,你可以通过/mnt/<驱动器号>访问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的操作系统,你将需要一个执行Windows调用而不是 POSIX调用的C库,并且你将需要一个仅使用C库而不会执行POSIX调用的C编译器。GCCWIN+PDPCLIB符合这个要求
MacOS
因为MacOS在底层使用了FreeBSD的用户空间,所以它完全兼容POSIX。所有常用工具(vi、bash、dd、cat、sed、tar、cpio等)都可用,几乎每个教程都是开箱即用的。缺少的工具大多与文件系统相关:没有回环设备、没有fdisk、没有mkfs.vfat和mtools。但是你可以用diskutil来达到这些目的,或者使用brew或macports来安装那些缺少的工具
要获得gcc,对于旧版本在2nd Installation DVD上有mpkg。较新的MacOS版本(10.13 及更高版本)可以通过从终端运行xcode-select --install
来安装命令行XCode(不是 IDE,只是工具链)。这将安装gcc、binutils和make。这个gcc实际上是一个伪装的CLang,但功能齐全,毫无问题可以构建你自己的交叉编译器。最好使用官方编译器来获取gcc,而不是从brew或macports安装
测试你的操作系统
主条目:测试
这篇文章深入探讨了如何测试你的操作系统以及如何将其与你的开发过程集成。既讨论了物理测试环境,也讨论了模拟测试环境
保存好你的代码
在你的代码构建期间,你将编写数百甚至数千行代码。你将花费无数个小时,并且在你应该上床睡觉的时候熬夜编码。最后,你只需要磁盘崩溃或者不小心输入“rm”或“format”命令丢失所有的工作进度
你需要的是一个版本控制系统。CVS已经使用了很多年,但最近受到了来自Subversion、Bazaar、Mercurial和Git的大量竞争。如果可以,你应该将远程计算机或服务器设置为版本控制服务器,但如果你没有这样的机器可用,你也可以在本地开发计算机上托管版本控制系统。只要记住不时将你的代码备份到CD或FTP上
我们对这一点再怎么强调也不为过:如果你还没有使用源代码控制,那么你应该立即开始使用。你只需在代码中犯一次严重错误,就可以意识到让代码安全版本化和易于检索的重要性。虽然对于一个小型的私人爱好项目来说这似乎有点小题大做,但一旦你养成了使用修订控制的习惯,你会无法想象如果没有版本控制该怎么办
对于Git,你可以在GitHub或Bitbucket上创建你的项目。两者都带有免费的私人存储库
在网络连接的存储库上使用版本控制的另一个好处是,它可以让你更轻松地与他人协作并从他人那里获得帮助。这可能非常有用,尤其是在论坛中,因为它可以避免不断地将更新版本的代码发布到消息线程里——你只需在对话中给出存储库的网址,论坛中的其他人将可以直接访问到你最新的更改。随着项目开展,它对于你和他人合作开发也很重要(只是不要指望这会在一夜之间发生)
新手教程
获得“Hello World”64位高半内核的最简单方法是Stivale Bare Bones教程。另一种方法是在引导流程页面上了解计算机本身是如何启动的
还有许多其他可用的教程
深入学习
当今互联网上有大量关于操作系统开发的知识。所有知识网上都有,只要你找得到。首先,有这个wiki本身。此外,我们有很多教程。既然你看到了这里,你可能已经找到了。此站点上还有论坛,许多开发人员在这里闲逛并可以为你提供帮助(但请确保先阅读如何提问)。还有很多关于操作系统开发的书籍。其中一些在我们的操作系统开发相关书籍页面上有列出,在osdever.net上也列出了更多
相关内容
文章
- Bare bone教程
- 资源
- 学习顺序
外部链接
- Bona Fide OS开发包含多个教程和文档
- 《实现一个操作系统》 - Andrew S. Tanenbaum