mat*_*rix 2 assembly operating-system binaryfiles fasm
在编写内核和操作系统时,无论是在汇编还是更高级别,都需要以平面二进制文件的形式汇编或编译代码,对吧?
你无法组装它或将它编译成ELF格式之类的东西,对吧?
如果这样做,处理器会将格式错误地解释为代码并开始执行意外的指令.
毕竟,您可以格式化可执行二进制文件,以便操作系统知道代码和日期段的开始和停止位置,然后将它们加载到GDT中并将它们添加到分页结构中.
但是如果您正在编写的程序实际上是一个操作系统,那么它将不会像用户应用程序那样在操作系统上运行,因为它是操作系统,对吧?
也就是说,操作系统在金属上运行,而不是在任何其他软件上运行.
我在这里纠正吗?
每种平台都有自己的启动顺序,它也定义了用户如何获得对机器的控制权.
例如,在x86世界中,第一个代码运行来自BIOS ROM(来自主板供应商的硬连线固件),然后将加载初始引导加载程序(存储块设备上的扇区0,因此BIOS固件必须已包含一些简单/完整的驱动程序一种不同的设备=它不是某种琐碎的夫妻指令使PC升温,而是一个小型操作系统本身).然后,bootloader将处理剩余代码的进一步加载(如果扩展引导加载程序代码不适合单个扇区或内核或任何用户提供的话).
因此,如果您的引导加载程序足够复杂,它甚至可以理解内核的ELF二进制文件,并从中加载它.
但只要你追踪要运行的最初代码(x86 PC上的BIOS固件),那么那个必须是平面二进制,在某个指定地址启动代码(由CPU /主板供应商定义,具体取决于CPU的状态)在RST信号之后).
操作系统可能已经太晚了,所以它不能保证它直接在裸机上运行,它可能已经进入一些虚拟环境.通常它可以检测到它,但是通过完美的仿真/虚拟化,它可能无法检测到(然后再次实现完美的东西在计算机世界中往往是非常难以捉摸的).但是,从操作系统的角度来看,这并没有改变任何东西(*),它仍然可以继续运行,就好像它在裸机上运行一样,它取决于仿真/虚拟化以赶上操作系统的期望.
*)实际上,对于安全敏感的安装来说,检测环境中的任何篡改并处理这些情况以降低安全风险(自毁或擦除敏感信息)可能非常重要.
更新:现代主板支持UEFI(现代BIOS),TPM(可信平台模块)芯片,IME(英特尔管理引擎),初始平面二进制文件可以加密,并进行数字签名,因此除非解密,否则CPU不会执行签名的验证是成功的.
使用IME的情况更加复杂,就像电脑中的计算机一样,所以即使在没有唤醒包装x86机器的情况下,也可能会在背景中发生一些事情(仅在待机状态下供电).
如果您刚开始研究操作系统开发,请不要担心这一点.如果您计划创建一些基于x86的安全/医疗设备,那么可能会额外关注这些.
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |