资讯动态

x86平台加电后执行的第一行代码

发布时间:2026/8/6 23:17:23 来源:尧图企业网站定制
x86平台加电后执行的第一行代码其物理地址位于0xFFFFFFF0这个地址也被称为复位向量Reset Vector。第一条指令的寻址奥秘这里有个很巧妙的设计。在刚上电时CPU处于实模式这个模式下理论上只能访问1MB的内存空间。但0xFFFFFFF0这个地址远大于1MB它是如何工作的呢关键在于CPU内部代码段CS寄存器的初始值被特殊处理了。特殊的初始状态上电时CPU的指令指针EIP寄存器被设为0x0000FFF0而代码段CS的“基址”部分被硬件强制设为0xFFFF0000而不是常规的0x000F0000。地址合成第一条指令的物理地址由CS基址 EIP合成即0xFFFF0000 0x0000FFF0 0xFFFFFFF0。硬件映射这个特殊的物理地址在硬件层面会被主板映射到存放BIOS/UEFI固件的ROM芯片或SPI Flash上因此CPU可以在这里取到第一条指令。这条指令长什么样0xFFFFFFF0处存放的并非复杂的操作系统代码通常是一条跳转Jump指令它的作用是“接力”将执行流引导到BIOS/UEFI固件代码真正开始的地方。例如在开源的UEFI参考实现EDK2中这里的代码简单到只有两条NOP空操作指令和一条JMP跳转指令; 位于地址 0xFFFFFFF0 nop ; 第一条指令 nop ; 第二条指令 jmp ... ; 跳转到真正的BIOS启动代码后续启动流程简述执行完这第一条跳转后CPU就正式进入了固件的世界之后会经历一个类似“接力赛”的过程BIOS/UEFI固件进行上电自检POST并初始化硬件。主引导记录MBR固件将启动设备的第一个扇区512字节加载到内存地址0x7C00并跳转执行。BootloaderMBR中的代码如GRUB stage1会加载更完整的Bootloader再由后者将Linux内核加载到内存地址0x100000。Linux内核内核接手后开始执行其自身的初始化代码入口在arch/x86/kernel/head_32.S等文件中最终将控制权移交给操作系统。所以0xFFFFFFF0是x86系统上电后一个至关重要的物理坐标它连接了硬件电路和复杂的软件世界。这个过程非常巧妙用一段小小的代码就完成了从硬件到固件再到操作系统的跨越。x86平台开机执行的第一行代码位于主板固件BIOS/UEFI的ROM或Flash芯片中。因此它并不属于Linux内核源码的一部分而是由固件厂商如Intel、AMI等提供的代码。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价