为何Qemu加载ELF与BIN格式镜像时进入不同异常等级?
Qemu模拟Raspberry Pi 4B时ELF与BIN镜像启动异常等级差异原因
这个差异来自Qemu对不同格式镜像的默认加载逻辑,针对Raspberry Pi 4B的模拟环境,具体如下:
ELF镜像的处理
Qemu通过-kernel加载ELF文件时,会识别ELF文件中的元数据(比如入口地址、目标平台信息),并且针对RPi4平台,默认将ELF镜像当作早期bootloader/监控程序处理,直接在EL3异常等级下启动执行。这和树莓派原生硬件的启动流程一致——原生的第一阶段bootloader就是运行在EL3的。BIN镜像的处理
纯BIN文件没有任何元数据,Qemu无法判断它的预期运行环境,因此针对RPi4平台,默认将BIN文件当作内核镜像处理,会先切换到EL2异常等级,再加载执行BIN的入口代码。这是因为在RPi4的正常启动流程中,内核是在EL2(由bootloader切换而来)运行的,Qemu对无格式二进制文件采用了这个默认行为。
你的测试代码通过mrs x0, currentel指令读取当前异常等级,正好验证了这个逻辑:
- 使用
qemu-system-aarch64 -nographic -kernel benos.bin -S -s启动时,Qemu在EL2环境执行BIN代码,读取到的异常等级为2 - 若换成ELF格式的镜像,Qemu会在EL3环境启动,读取到的异常等级为3
需要注意的是,这个行为是Qemu针对RPi4平台的特定实现,不同ARM模拟目标可能有不同的默认规则。如果需要调整启动的异常等级,可以通过修改ELF镜像的头部信息,或者指定Qemu的-machine相关参数来实现。
内容的提问来源于stack exchange,提问作者chneg
相关产品推荐
相关产品推荐

