c - 为什么/arch/x86/boot/header.S 在汇编中?

标签 c assembly linux-kernel operating-system

为什么这个文件是用汇编写的,而它可以简单地使用像c这样更简单的语言?为什么还没有人尝试用 c 重写它?

最佳答案

这是一个与引导相关的代码,并且依赖于体系结构。在不违反其主要约定的情况下,一些引导加载程序代码结构(例如,与堆栈相关的)可能无法在 C 中表示。同时,在引导过程中通常不可避免地使用此类构造。

好吧,有一种观点认为您可以用 C 编写与引导相关的代码,但无论如何您仍然必须在其中使用大量内联汇编来访问非常低级的功能在您的代码中。

此外,典型的引导加载程序必须处理一些限制。 限制之一(至少对于 x86)是当机器开机时,处理器开始以 16 位运行 real mode .可供使用的 RAM 不到 1 MB(引导设施需要足够小以适合),没有可用的虚拟内存机制,并且一般来说,内存寻址模式非常受限。当 BIOS POST 程序从任一引导设备(例如 HDD)读取引导扇区时,加载的程序必须从磁盘读取更多设施到内存并将控制权传递给它们。显然,由于此时没有操作系统在运行,因此没有可用的 OS 设备驱动程序,并且没有适用的标准 C 方法(例如,使用标准 IO 库)。相反,它是 BIOS 提供的设备驱动程序服务于一组定义明确的中断(例如 https://en.wikipedia.org/wiki/INT_13H )以访问不同引导驱动器上的数据。因此,粗略地说,启动管理器必须用汇编编写,以便在实模式下使用一组非常具体的 BIOS 功能。

总而言之,考虑到所有要点(代码大小、16 位实模式限制、使用 BIOS 特定功能的需要和 C 中无法表示的代码结构),答案是用汇编编写整个代码将是最有效和明确的方式,而不是扩展 C 来处理非标准结构或使用 C 和内联汇编代码的可读性差的混合体。

附言如果您对引导加载程序内部的更详细描述感兴趣,引用一个非常 Eloquent FreeBSD 引导和内核初始化示例会很有用:https://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/boot-overview.html

关于c - 为什么/arch/x86/boot/header.S 在汇编中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46757978/

相关文章:

c - 为什么我的程序永远重复而不是给出最大整数值?

python - 你对这些汇编助记符有什么建议吗?

assembly - 如何反汇编 fasm 生成的二进制文件?

linux - Linux 上的 Zigbee 堆栈(主线内核)?

c - pthread_self() 和 gettid() 返回值之间的差异

使用 memcmp 比较两个字符串文字

linux - 当用户提供文件名时无法读取文件(使用 nasm 的 x86 汇编程序)

linux - 如何从 Linux 内核中的 struct dentry 获取完整路径名

linux - 设备驱动程序堆栈

c - 为什么 stat 返回错误结果?