为x86体系结构开发操作系统

时间:2020-03-06 14:41:25  来源:igfitidea点击:

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

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

有什么建议?

解决方案

如果要制作完整的操作系统,则需要使用多种语言。我至少希望汇编,C和C ++。

我将使用虚拟机进行大多数测试。

我们可能要查找XINU。这是一个用于x86的微型操作系统,除了被学生解剖外,它并没有真正用于其他用途。

如果要编写操作系统,则需要几个人。一个OS不能写一个人。我认为最好在现有的OS项目上工作

  • Reactos-> C,汇编器
  • SharpOS-> C#
  • JNode-> Java

这只是OS项目的一小部分。我们如何看待每种可能的语言都有一个项目。

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

语言和编译器完全取决于我们要完成的工作。但是,我建议我们可能从太低的水平来解决问题。

那里有关于操作系统基础知识的资料。麻省理工学院有关于该主题的OpenCourseware。通读Andrew Tannenbaum的"操作系统"系列,并查看Minix之类的内容。

了解那里的情况。开始修补事物。借用想法,并观察它们的去向。如果确实需要,我们可以重新发明轮子,但是我们可以通过借鉴他人的作品来学习更多。

使用ANSI C,并从仿真器开始。
当我们移植到真实计算机上时,将有一些汇编代码。例如,上下文切换和中断处理更易于在汇编器中编写。

Andy Tannenbaum写了一本关于OS的好书。存在许多其他好的方法。

祝你好运!没有什么比编写自己的OS小得多了。

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

在我拼贴画的最后一个项目中,我开发了一个小型x86操作系统,其中包含虚拟内存管理器,虚拟文件​​系统和完全抢占式多任务处理。我将其设为开放源代码,并且对该代码进行了大量注释,请在以下位置查看其源伪造页面:

https://github.com/stephenfewer/NoNameOS

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

我们将需要x86汇编语言用于各个部分,这是不可避免的,但是可以将其保持在最低限度。很快,我们就会运行C代码,这是OS开发的公认之选。一旦有了某种可用的内存管理器,就可以根据需要使用C ++(需要使用某种内存管理器来进行诸如new和Delete之类的操作)。

无论我们选择哪种语言,我们都仍然需要Assembly&C才能将系统从引导状态引导至BIOS,使我们可以将其转换为任何可用的形式。

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

我的开发环境是GNU开发工具DJGPP和NASM汇编器的Windows端口。对于我的IDE,我使用了带CDT插件的IBM Eclipse,该插件在Eclipse中提供了C / C ++开发环境。

为了进行测试,我建议使用BOCHS,这是一种开放源代码x86 PC仿真器。它可以让我们快速启动操作系统,这非常适合测试,并且可以集成到eclipse中,因此我们只需按一下按钮就可以构建和运行操作系统。我还建议我们偶尔使用VMWare和物理PC,因为这样可以发现一些细微的错误。

P.S.操作系统开发确实很有趣,但是非常密集,我花了12个月的大部分时间。我的建议是计划周密,设计至关重要!请享用 :)

选择哪种语言并不重要。如果该语言是图灵完备的,则可以在其中编写一个操作系统。

但是,语言的表现力将使某些类型的设计非常容易实现或者很难实现。例如,旧的Smalltalk OS的"生动性"和动态性取决于它们在Smalltalk中实现的事实。我们也可以在C语言中执行此操作,但是它可能会非常困难,以至于我们甚至都不会考虑它。 JavaScript或者Ruby OTOH可能非常适合。

微软研究院的奇点是另一个例子。它根本无法以Sing#,Specand C(或者类似语言)以外的任何方式实现,因为太多的体系结构取决于这些语言的静态类型安全性和静态可验证性。

要记住的一件事:充分探索了用C实现的OS的设计空间。实际上有数千个。但是,用其他语言,我们实际上可能会发现以前没有人发现的东西!用Java编写的操作系统大约只有十几种,用C#编写的操作系统只有大约六种,在Haskell中大约是两种操作系统,在Python中只有一种,而在Ruby或者JavaScript中却没有。

尝试用Erlang或者Io编写一个操作系统,看看它如何影响我们对操作系统的思考!

马里兰大学提供了一个使用GeekOS的OS课程。这是一个为教育目的而设计的小型,广泛注释的操作系统,可以使用Bochs或者QEMU仿真器运行。

有关在课程中如何使用该课程的示例,请在课程网页上查看该课程的先前课程。在这里,我们将找到必须在GeekOS中添加其他功能的任务。

这是熟悉在x86架构上运行的小型且简单的OS的好方法。

确保检查出我的问题的答案:

如何开始进行操作系统开发

毫无疑问,我会使用Ada。这是我遇到过的最好的通用系统编程语言,没有别的。一个示例是,Ada在指定记录中对象的位布局方面比C要好得多。Ada还支持将记录覆盖在特定的存储位置上。 C要求我们使用指针来达到相同的效果。可以,但是更容易出错。 Ada还为中断提供语言支持。

另一个:安全性。 Ada默认为绑定检查数组分配,但允许我们在需要时将其关闭。 C"默认"为不对数组进行无限制检查,因此我们必须在需要时手动进行操作。时间表明这不是正确的默认设置。我们会忘记一个需要它的地方。缓冲区溢出漏洞是破解者使用的最常见的单个安全漏洞。他们有整个网站解释如何找到和使用它们。

至于学习方法,我知道的两本书是XINU(Unix倒退,与Scientology无关)和Project Oberon。第一个用于我的操作系统研究生课程,第二个由Pascal的创建者Nikalus Wirth编写。

C最有可能...所有主要的OS-es都是用C / C ++或者Objective-C(Apple)编写的