【问题标题】:How to create a bootable x86_64 program?如何创建可启动的 x86_64 程序?
【发布时间】:2020-04-07 10:07:38
【问题描述】:

一些背景: 我现在是一名计算机工程专业的学生,​​我刚刚完成了一个项目,该项目创建了一个微处理器,该微处理器具有在 FPGA 上运行的超级简单指令集。我选择实现一个简单的文件存储方案、一个 VGA 纯文本显示输出和一个 PS/2 键盘输入。我编写了两个主要程序,一个在处理器的 ROM 中的固件和一个提供一堆库类型函数的内核,并且能够从文件系统加载和执行文件。这个项目很有挑战性,总体来说很有趣。

我的问题: 我想在现代计算机上进行一些超低级编程,但我似乎找不到任何可以帮助我入门的资源或文档。明确地说,我想找到合适的文档来帮助我用 C、x86 或 x86-64 程序集编写我可以编译的程序,并将其格式化为某种形式的可引导数据。我知道这是一项艰巨的任务,通常不是业余爱好者会承担的,但我知道这是可能的 (Terry Davis's TempleOS)。

是否有任何我可以阅读的网站或书籍包含制作这样的东西所需的细节?

【问题讨论】:

  • 问:你到底想写什么?听起来像bootloader?注意:在您的项目中 1) 您有某种带有处理器、存储设备的系统板。 2)主板有一些固件(BIOS?),以允许系统从存储加载操作系统并开始在 CPU 上运行它。 3) 一旦操作系统运行,您就可以运行您的“其他”软件——程序、驱动程序等。这是一个示例引导加载程序:apriorit.com/dev-blog/66-develop-boot-loader
  • 您可以尝试学习类似的程序,例如memtest (github.com/Distrotech/memtest86) & grub (github.com/coreos/grub)

标签: operating-system kernel low-level


【解决方案1】:

当心,你可能会发现错误。操作系统开发,虽然人口很少,但仍然是一个相当繁荣的爱好。一旦开始,您可能永远不会放弃。

由于您的主题行声明 64 位并且您使用术语现代硬件,请注意现代硬件不再具有旧式 BIOS,开发人员在旧式 BIOS 中编写了引导过程,其中包括视频输出、文件系统输入和其他标准程序。现代硬件现在使用 EFI 固件,它为您完成所有引导,包括从文件系统读取。对于现代硬件,OS 开发实际上是从 OS Loader 开始的,它是加载 OS 的部分,这是用 C/C++ 等高级语言完成的。几乎没有任何组装,事实上这就是它的重点/目的。

不要太气馁,目前很多电脑仍然允许旧式启动。但是,旧式引导以 16 位模式启动,然后转移到 32 位模式,然后如果需要,转移到长模式(64 位)。您还可以使用模拟器,因此您不必拥有单独的系统,只需测试您的开发。我自己更喜欢Bochs,但我有点偏见,因为我为它编写了一些代码,即大部分(原始)USB 仿真。

如果您想涉足这个爱好,有很多地方可以开始。 I personally wrote a few books on the subject。它们向您展示了如何从 POST 放弃对您的引导代码的控制开始,一直到最小的循环式任务/线程切换操作系统,以及所有必要的硬件和软件基础知识。 OS Development 有一个forum 及其 wiki。

同样,这样的项目不适合胆小的人,尽管它是一种令人愉快的爱好,大多数人都认为这是一种非常好的学习体验。

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 2010-10-08
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多