为什么这个文件是用汇编编写的,而它可以简单地使用像c这样的简单语言?为什么还没有人试图在c中重写它?
答案 0 :(得分:4)
这是一个与启动相关的代码,它依赖于架构。一些引导加载程序代码构造(比如堆栈相关)可能无法在C中表示而不会破坏其主要约定。同时,在引导过程中通常不可避免地使用此类构造。
嗯,有一种想法,你可以在C中编写与启动相关的代码,但无论如何你仍然需要在其中使用很多内联汇编来访问非常低级的功能在你的代码中。
此外,典型的引导加载程序必须处理少数限制。
其中一个限制(至少对于x86
)是当机器启动时,处理器开始以16位real mode运行。可以使用不到1 MB的RAM(引导设备需要足够小以适应),没有可用的虚拟内存机制,并且通常,内存寻址模式非常有限。当BIOS POST程序从任一引导设备(例如HDD)读取引导扇区时,加载的程序必须从磁盘读取更多设施到内存并将控制传递给它们。显然,由于当时没有OS正在运行,因此没有 OS 设备驱动程序可用,并且没有标准C方法(例如,使用标准IO库)适用。相反,它是提供设备驱动程序的BIOS,它提供明确定义的中断集(例如,https://en.wikipedia.org/wiki/INT_13H)来访问不同引导驱动器上的数据。因此,粗略地说,必须在程序集中编写引导管理器,才能在实模式下使用一组非常具体的BIOS功能。
总而言之,考虑到所有要点(代码大小,16位实模式限制,需要使用特定于BIOS的功能和代码构造在C中无法表示),答案是在汇编中编写整个代码将是最有效和明确的方式,而不是扩展C来处理非标准结构或使用C和内联汇编代码的可读混合。
P.S。如果您对引导加载程序内部的更详细描述感兴趣,那么引用一个非常雄辩的FreeBSD引导和内核初始化示例会很有用:https://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/boot-overview.html