QEMU无需bootloader即可运行内核的原理?自制内核可用GRUB引导吗?
QEMU -kernel 参数的内核启动逻辑
你执行qemu-system-x86_64 -kernel kern.bin时,QEMU并没有调用任何外置或内置的独立bootloader,而是自带了对应架构的内核加载逻辑,直接完成了bootloader的核心工作:
- 首先识别内核镜像的格式,x86架构下默认支持Multiboot格式、Linux bzImage格式的镜像,也支持符合规范的raw二进制内核
- 按照对应启动协议的要求,把内核镜像写入模拟内存的指定物理地址,同时把启动参数(比如通过
-append传入的内核命令行、模拟硬件的内存布局信息等)按协议规范写入指定内存位置,和真实bootloader的传参格式完全一致 - 初始化模拟CPU的寄存器上下文,把指令指针寄存器
eip/rip直接指向内核的入口地址,直接跳转执行
整个过程相当于QEMU直接替代了bootloader的加载、传参、上下文初始化功能,所以不需要额外的bootloader参与。
使用GRUB U盘引导自制内核的方案
完全可以,这是新手开发自制内核时最常用的引导方案,无需自行编写bootloader,操作要求如下:
- 你的内核需要先适配Multiboot启动规范,只需要在内镜镜像开头加一段固定格式的Multiboot魔数头部即可,GRUB会自动识别符合该规范的内核
- 制作引导U盘的大致流程:
- 将U盘格式化为FAT32格式,给分区添加可引导标记
- 将GRUB安装到U盘:挂载U盘后执行
grub-install --target=i386-pc --root-directory=你的U盘挂载路径 你的U盘设备路径,注意不要填错设备路径避免覆盖硬盘数据 - 在U盘的
/boot/grub/grub.cfg文件中新增内核启动项,示例配置如下:menuentry "My Custom Kernel" { multiboot /boot/my_kernel.bin boot } - 将你编译好的内核文件放到U盘的
/boot目录下,开机选择从U盘启动,就能引导你的自制内核。
内容的提问来源于stack exchange,提问作者Cool
相关产品推荐
相关产品推荐

