gpt4 book ai didi

c - linux引导代码怎么用C写的?

转载 作者:太空狗 更新时间:2023-10-29 17:02:20 26 4
gpt4 key购买 nike

我是学习操作系统开发的新手。从我读的书上说,引导加载程序会将第一个 MBR 复制到 0x7c00,并从那里以实模式启动。

并且,示例以 16 位汇编代码开头。但是,当我查看今天的 linux 内核时,arch/x86/boot有 'header.S' 和 'boot.h',但实际代码在 main.c 中实现。

这似乎对“不写汇编”很有用。但是,这在 Linux 中具体是如何完成的呢?我可以粗略地想象可能会有特殊的 gcc 选项和链接策略,但我看不到细节。

最佳答案

我更多地将此问题视为 X-Y 问题。在我看来,问题更多的是关于您是否可以在 C 中为您自己的操作系统开发编写引导加载程序(引导代码)。简单的答案是,但不推荐。现代 Linux 内核可能不是创建用 C 编写的引导加载程序的最佳信息来源,除非您了解它们的代码在做什么。

如果使用 GCC,您可以对生成的代码执行的操作会受到限制。在较新版本的 GCC 中,有一个 -m16 选项以这种方式记录:

The -m16 option is the same as -m32, except for that it outputs the ".code16gcc" assembly directive at the beginning of the assembly output so that the binary can run in 16-bit mode.

这有点骗人。虽然代码可以在16位实模式下运行,但是后端生成的代码使用了386地址和操作数前缀,使得正常的32位代码在16位实模式下运行。这意味着 GCC 生成的代码不能用于早于 386 的处理器(如 8086/80186/80286 等)。如果您想要一个可以在最广泛的硬件阵列上运行的引导加载程序,这可能是个问题。如果您不关心 386 之前的系统,那么 GCC 就可以了。

使用 GCC 的引导加载程序代码还有另一个缺点。添加到许多指令中的地址和操作数前缀加起来会使引导加载程序变得臃肿。引导加载程序的第一阶段通常在空间上非常受限,因此这可能会成为一个问题。

您将需要具有与硬件交互功能的内联汇编或汇编语言对象。您无权访问引导加载程序代码中的 Linux C 库(printf 等)。例如,如果您想写入视频显示器,您必须自己编写该功能的代码,要么直接写入视频内存,要么通过 BIOS 中断。

要将其完全绑定(bind)并将内容放入可用作 MBR 的二进制文件中,您可能需要一个特制的链接描述文件。在大多数项目中,这些链接描述文件都有一个 .ld 扩展名。这插入了获取所有目标文件的过程,将它们以与传统 BIOS 启动过程兼容的方式(代码在 0x07c00 以实模式运行)。

这样做有很多陷阱,我建议不要这样做。如果您打算编写 32 位或 64 位内核,那么我建议您不要编写自己的引导加载程序并使用现有的引导加载程序,例如 GRUB。在 1990 年代的 Linux 版本中,它有自己的引导加载程序,可以从软盘执行。现代 Linux 现在依靠第三方引导加载程序来完成大部分工作。特别是它支持符合 Multiboot specification 的引导加载程序。

Internet 上有许多使用 GRUB 作为引导加载程序的教程。 OS Dev Wiki是一种宝贵的资源。他们有一个 Bare Bones使用原始多重引导规范(由 GRUB 支持)引导基本内核的教程。可以使用最少的汇编语言代码轻松开发 Mulitboot 规范。 Multiboot 兼容的引导加载程序会自动将 CPU 置于保护模式,启用 A20 线,可用于获取内存映射,并可被告知在引导时将您置于特定的视频模式。


去年有人在 #Osdev聊天询问编写一个位于软盘(或磁盘镜像)前 2 个扇区的 2 阶段引导加载程序,完全在 GCC 和内联汇编中开发。我不推荐这样做,因为它相当复杂,而且内联汇编很难正确。很easy to write bad inline assembly这似乎有效但不正确。

我已经提供了 some sample code它使用带有内联汇编的链接器脚本 C 来处理 BIOS 中断,以从磁盘读取数据并写入视频显示器。如果有的话,这段代码应该是一个例子,说明为什么做你所要求的事情并非易事。

关于c - linux引导代码怎么用C写的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43564672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com