为x86架构开发操作系统

时间:2008-09-24 21:22:51

标签: operating-system x86 osdev

我打算为x86架构开发一个操作系统。

  • 我有哪些编程语言选项?
  • 哪些类型的编译器可用,最好是在Windows环境中?
  • 是否有任何有用的资源可以帮助我了解有关操作系统开发的更多信息?
  • 在虚拟机或物理硬件上测试操作系统是否更好?

有什么建议吗?

13 个答案:

答案 0 :(得分:42)

对于我拼贴的最后一年项目,我开发了一个带有虚拟内存管理器,虚拟文件​​系统和完全抢占式多任务处理的小型x86操作系统。我把它作为开源代码并且代码被大量评论,请查看其源代码页面:

https://github.com/stephenfewer/NoNameOS

根据我的经验,我可以推荐以下内容:

需要x86汇编语言用于各个部分,这是不可避免的,但可以保持在最低限度。相当快,您将获得运行C代码,这是OS开发的可靠选择。一旦你有了某种内存管理器,如果你愿意,你可以使用C ++(你需要某种内存管理器来处理新的和删除)。

无论您选择何种语言,您仍然需要组装和安装。 C将系统从BIOS离开你的系统带入任何可用的形式。

最终,您选择的主要语言取决于您要开发的操作系统类型。

我的开发环境是GNU开发工具DJGPP的Windows端口以及NASM汇编程序。对于我的IDE,我使用IBM的Eclipse和CDT插件,它在Eclipse中提供了一个C / C ++开发环境。

为了测试,我推荐BOCHS,一个开源的x86 PC模拟器。它允许您快速启动操作系统,这非常适合测试,并且可以集成到eclipse中,因此您只需按一下按钮即可构建和运行操作系统。我还建议偶尔使用VMWare和物理PC,因为你可以通过这种方式获取一些微妙的错误。

P.S。操作系统开发非常有趣,但是非常密集,我的开发时间为12个月。我的建议是做好计划,你的设计是关键!享受:)

答案 1 :(得分:5)

语言和编译器完全取决于您尝试完成的任务。不过,我建议您可能从太低的水平接近问题。

有关于操作系统基础知识的资料。 MIT has OpenCourseware on the subject。仔细阅读Andrew TannenbaumOperating Systems series,然后查看Minix之类的内容。

了解那里有什么。开始摆弄东西。借用想法,看看他们去哪里。如果你真的想要,你可以重新发明轮子,但你可以通过建立他人的作品来学习更多。

答案 2 :(得分:5)

这并不重要,你选择什么语言。如果语言是Turing-complete,那么您可以在其中编写OS。

然而,语言的表现力会使某些类型的设计变得非常容易或很难实现。例如,旧的Smalltalk操作系统的“活力”和动态取决于它们是在Smalltalk中实现的。你也可以在C中做到这一点,但它可能会非常难以让你想到它。 JavaScript或Ruby OTOH可能非常合适。

Microsoft Research's Singularity是另一个例子。除了Sing#,Spec#C#(或类似语言)之外,它根本无法实现,因为很多架构依赖于这些语言的静态类型安全性和静态可验证性

要记住的一件事是:用C实现的操作系统的设计空间已经得到了充分的探索。其中有成千上万。但是,在其他语言中,您可能会发现以前没有人发现过的东西!只有大约十几个用Java编写的操作系统,大约六个用C#编写,大约在Haskell中的两个操作系统的顺序,只有一个在Python中而 none 在Ruby或JavaScript。

尝试在Erlang或Io中编写操作系统,看看它会如何影响您对操作系统的思考!

答案 3 :(得分:4)

马里兰大学提供的课程使用GeekOS。这是一个小型,广泛评论的操作系统,专为教育目的而设计,可以使用Bochs或QEMU模拟器运行。

有关如何在课程中使用它的示例,请查看课程webpage上课程的上一个课程。在那里,你会发现你必须为GeekOS添加不同功能的作业。

这是熟悉在x86架构上运行的小而简单的操作系统的好方法。

答案 4 :(得分:3)

您可能想要查找XINU。它是x86的一个小操作系统,除了被学生解剖之外,还没有真正用于其他任何东西。

答案 5 :(得分:3)

使用ANSI C,然后从模拟器开始。 当您移植到真正的机器时,会有一些汇编程序代码。上下文切换和中断处理(例如)在汇编程序中更容易编写。

Andy Tannenbaum撰写了一本关于操作系统的好书。还有很多好的。

祝你好运!没有什么比编写自己的操作系统更好了。无论多么小。

答案 6 :(得分:3)

另请查看OSDev.org,其中包含您开始使用所需的所有信息。

答案 7 :(得分:2)

我曾经为PCI板上的386SX做过一次。关于如何在保护模式下启动X86 cpu的一个很好的资源是linux的源代码。这只是一些汇编语句。之后,您可以使用gcc编译C代码。结果是ELF格式的目标代码。我编写了自己的链接器,用于从对象代码中创建程序。是的,它奏效了!祝你好运。

答案 8 :(得分:2)

请务必查看我的问题的答案:

How to get started in operating system development

答案 9 :(得分:1)

如果您要制作完整的操作系统,则需要使用多种语言。我至少会期待Assembly,C和C ++。

我会在大多数测试中使用虚拟机。

答案 10 :(得分:1)

毫无疑问,我会使用Ada。这是我遇到的最好的通用系统编程语言,没有。例如,Ada更适合指定记录中对象的位布局而不是C.Ada还支持在特定内存位置上覆盖记录。 C要求你使用指针来实现相同的效果。这有效,但更容易出错。 Ada还为中断提供语言支持。

另一个:安全。 Ada默认绑定检查数组分配,但允许您在需要时将其关闭。 C“默认”对数组没有绑定检查,因此您必须在需要时自己手动执行。时间已经表明这是正确的默认值。你会忘记一个需要它的地方。缓冲区溢出漏洞是破解者使用的最常见的安全漏洞。他们有整个网站解释如何查找和使用它们。

关于这样做的学习,我所知道的两本书是XINU(Unix向后,与科学论无关)和Project Oberon。第一个用于我的操作系统研究生课程,第二个是由Pascal的创建者Nikalus Wirth编写的。

答案 11 :(得分:1)

C最有可能......所有主要操作系统都是用C / C ++或Objective-C(Apple)编写的

答案 12 :(得分:-5)

如果您想编写操作系统,那么您需要几个人。操作系统不能写一个人。我认为最好处理现有的OS项目

这只是OS项目的简短列表。你怎么看到每种可能的语言都有一个项目。