solidot新版网站常见问题,请点击这里查看。

现代操作系统如何启动的魔法

Linux 安全
WinterIsComing (31822)发表于 2022年09月14日 15时23分 星期三

来自少年地球护卫队:地球人觉醒
HardenedVault 写道 "在x86/amd64架构下,Linux内核通常被打包成bzImage格式,其中包含用于引导参数的部分填充数据结构,以及16位实模式,32位保护模式和64位长模式的多个阶段入口点(如果为amd64构建),最后一个阶段是自解压缩平面二进制文件,它将正确解压缩和执行gzip压缩的内核映像, 也以平面二进制的格式,存储在其数据段中。每个阶段都将初始化下一阶段的正确执行环境,将CPU切换到下一阶段可以工作的模式,然后执行下一阶段。当然,Linux内核能够从16位实模式启动,但它也允许引导加载程序为以后阶段准备执行环境(例如32位保护模式或64位长模式),并从相应的入口点执行Linux内核。例如,如果引导加载程序本身主要在 32 位保护模式下工作,那么从其 32 位保护模式入口点引导 Linux 内核将是最有效的方法,而为 amd64 构建的 Linux 内核将在使用 kexec 引导另一个为 amd64 构建的 Linux 内核时选择 64 位长模式的入口点。最近,QEMU 的一个bug导致 kexec 之后的内核崩溃,因为 kexec-ed 内核将无法解压缩压缩的 initrd。此错误仅影响在 QEMU 中使用压缩内联的新 Linux 内核。物理机器上的 kexec,以及在 QEMU 中使用压缩的 initrd 引导 Linux 内核的其他方法,均不受影响。

当然,在 QEMU 中,使用未压缩的initrd来创建新Linux内核是有效的,因此,如果您想在 QEMU中使用基于kexec的引导加载程序,则可能必须使用未压缩的initrd才能引导目标系统。HardenedVault(赛博堡垒)的Vault Labs使用此类方法成功完成了vTPM环境下的远程证明。"