您组装或编译OS源代码的格式是什么?

时间:2017-09-19 16:01:55

标签: assembly operating-system binaryfiles fasm

在编写内核和操作系统时,无论是在汇编还是更高级别,都需要以平面二进制文件的形式汇编或编译代码,对吧?

你无法组装它或将它编译成任何类似ELF格式的东西,对吗?

如果您这样做,处理器会将格式错误解释为代码并开始执行意外指令。

毕竟,您可以格式化可执行二进制文件,以便操作系统知道代码和日期段的开始和停止位置,然后将它们加载到GDT中并将它们添加到分页结构中。

但是,如果您正在编写的程序实际上是一个操作系统,那么它就不会像用户应用程序那样在操作系统上运行,因为它 操作系统,对吧?

也就是说,操作系统在金属上运行,而不是在任何其他软件上运行。

我在这里纠正吗?

1 个答案:

答案 0 :(得分:5)

排序,每个平台都有自己的启动顺序,这也定义了用户如何获得对机器的控制。

例如在x86世界中,第一个代码运行来自BIOS ROM(来自主板供应商的硬连线固件),然后将加载初始引导加载程序(存储块设备上的扇区0,因此BIOS固件必须已包含一些简单/完整所有不同设备的驱动程序=它不是某种简单的夫妇指令使PC升温,而是一个小型操作系统本身)。然后引导加载程序将处理剩余代码的进一步加载(如果它不适合单个扇区或内核或任何用户提供的扩展引导加载程序代码)。

因此,如果您的引导加载程序足够复杂,它甚至可以理解内核的ELF二进制文件,并从中加载它。

但只要您追踪要运行的最初代码(x86 PC上的BIOS固件),那么那个必须是平面二进制文件,在某个指定地址启动代码(由CPU /主板供应商定义,具体取决于RST信号后的CPU状态。)

此外,操作系统可能已经太晚了,因此无法保证它直接在裸机上运行,​​它可能已经进入某些虚拟化环境。通常它可以检测到它,但是使用完美的仿真/虚拟化它可能无法检测到(然后再次,实现完美的东西在计算机世界中往往是非常难以捉摸的)。但是从操作系统的角度来看,这并没有改变任何东西(*),它仍然可以继续运行,就像它在裸机上运行一样,它可以通过仿真/虚拟化来赶上并辜负操作系统期望。

*)实际上,对于安全敏感的安装,检测环境中的任何篡改以及处理此类情况以降低安全风险(自毁或擦除敏感信息)可能非常重要。

更新:现代主板支持UEFI(现代BIOS),TPM(可信平台模块)芯片,IME(英特尔管理引擎),初始平面二进制文件可以加密,并进行数字签名,因此CPU不会执行它除非签名的解密和验证成功。

使用IME情况更加复杂,它就像计算机内的计算机一样,所以在后台可能会发生一些事情,即使在没有唤醒包装x86机器的情况下(只需备用电源) )。

如果您刚刚开始研究操作系统开发,请不要担心这一点。如果您打算创建一些基于x86的安全/医疗设备,那么可能会额外关注这些设备。