本文参考田宇老师的《一个UEFI引导程序的实现》一文,使用U盘进行UEFI的内核引导,在VMware虚拟机上运行内核。
一、工具
- DiskGenius磁盘格式化工具。
- TianoCore EDK2开发环境(编译UEFI程序),本文直接使用了编译后的BootLoader.efi文件。
- 资料链接,主要使用了引导文件Bootloader.efi和kernel文件夹编译后的内核文件kernel.bin。
二、准备工作
- 首先使用磁盘管理软件DiskGenius清空U盘扇区里的所有数据,然后选择磁盘->转换分区表类型为GUID格式。
- 点击新建分区,配置如下:
如果上述步骤成功,在linux下使用ls /dev/sdb*
可以看到如下结果:
[root@promote edk2]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2
三、文件拷贝
- 随后将内核程序复制到U盘下,具体命令如下:
mount /dev/sdb1 /mnt/
mkdir /mnt/EFI/BOOT
cp Bootloader.efi /mnt/EFI/BOOT/BOOTx64.EFI
cp kernel.bin /mnt
sync
umount /mnt/
-
efi文件放在/mnt/EFI/BOOT/目录下,且命名为BOOTx64.EFI的目的是,UFEI可以开机时自动执行该efi并引导内核。
-
同时内核必须放在根目录下,否则无法找到内核文件,下文中为efi的文件操作代码,可以看到kernel.bin为是在根目录下,也可改成绝对路径:
status = RootFs->Open(RootFs,&FileHandle,(CHAR16*)L"kernel.bin",EFI_FILE_MODE_READ,0);
四、在VMware中创建和配置虚拟机运行环境
首先新建虚拟机:
首先在虚拟机创建完毕后还要将虚拟机的引导固件改为UEFI。首先进入虚拟机设置->选项->高级->固件类型界面将固件类型改为UEFI:
如果创建的虚拟机环境中没有USB控制器,可进入虚拟机->硬件界面添加USB控制器,下图示意了USB控制器的添加过程。
当点击“添加硬件向导”对话框的“完成”按钮后,可对USB控制器的兼容性和连接状态进行设置。
单击“打开电源时进入固件”按钮启动虚拟机后,虚拟机直接进入UEFI固件的引导管理界面,与BIOS类似。
主要的操作是将“EFI Network”引导项移动至序列末尾,可避免由于网络检测带来的引导启动速度过慢,同时将将屏幕尺寸从80 * 25改为128 * 40。
之后挂载U盘,重启虚拟机,可以看到内核程序引导成功,泪目。
详细内容可参考田老师的书,图书链接