最近在看 《UEFI 原理与编程》,上面提到一款虚拟机可以运行指定的BIOS,那就是 QEMU (之前我也研究过如何替换 VirtualBox 的BIOS,结果非常沮丧,他不支持独立的 BIOS ,这意味即便是要在ASL中修改一些代码也要花费几个小时重新编译整个VirtualBox)。
书中对于如何在QEMU中跑起来没有详述,我花了一点时间搞定了,下面介绍一下方法:
第1步:下载最主要的软件
1.1 你需要下载 QEMU 这个虚拟机,下载的地址是
http://qemu.weilnetz.de/
我下载的版本是 qemu-w32-setup-20150925.exe
1.2 还要下载一套能够编译出供虚拟机使用的BIOS,这套代码的名字是 OVMF (刚开始我以为普通的EDK2代码即可,研究一段才发现理解错误)
下载的地址是
http://sourceforge.net/p/tianocore/edk2/ci/master/tarball?path=/OvmfPkg
第2步,编译 (大环境来说就是我一直用来编译使用 UDK2014 的环境)
2.1 解压 1.1 的代码 (我解压在名为 "OVMF" 的文件夹中)
2.2 运行 edk2setup.bat (此外还有一个 edksetup.bat ,我不清楚有什么差别)
会提示无法找到关于 python 的设置,我索性在 edk2setup.bat 开始处加入
set PYTHONHOME=C:\Python27 (当然,你需要先安装一套 python2.7 才行)
直接在批处理中添加语句,对整个编译环境没有影响
2.3 编译命令
build -a IA32 -p OvmfPkg\OvmfPkgIa32.dsc
遇到的第一个错误是无法找到 nasm ,我大概看了一下,这套代码的编译除了vc的ml还用到了 nasm 来处理汇编语言。
在 http://www.nasm.us/ 下载,我使用的版本是 nasm-2.11.08-win32。其中有用的只是 nasm.exe 我把它直接放在
C:\ovmf\BaseTools\Bin\Win32 目录下面,这个位置在编译过程中会加入到 path 中,所以一定能访问到。
遇到的第二个错误是无法找到 \asl\iasl.exe
在 https://acpica.org/downloads 可以下载到, 将 iasl.exe 放在 c:\asl\ 下面即可。
按照上述方法设置之后,即可正常编译
2.4 运行方法
在 build 下面找到 ovmf.fd ,拷贝到 qemu 的安装目录下
命令行中运行
qemu-system-x86_64.exe -bios "OVMF.fd"
工作的视频
http://www.tudou.com/programs/view/acRlyVBYLz8/?resourceId=414535982_06_02_99
上面提到的工具,我放在Baidu网盘上,可以从这里下载 http://pan.baidu.com/s/1sjsZhr3 密码:uav4
如果你在具体操作中遇到任何问题可以直接给我留言,我会长期维护本文。
Hi,我研究了一下,有更好使用方式:
//支持debug的build:
build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -D DEBUG_ON_SERIAL_PORT
//command:
//-pflas bios --your bios bin
//-serial stdio --redirect debug-message to stdio
//-hda fat:rw:myFATdir --指向Fat32分区的某文件夹,这里我插了个Fat32的U盘
//-net none --do not try PXE-boot
qemu-system-x86_64.exe -pflash OVMF.fd -serial stdio -hda fat:rw:K:\temp -net none
这样,debug也有了,也可以访问主机硬盘,不过,shell下del file不会真的删掉 。。。
有点麻烦,不过感觉比build run的仿真程度要高。
想请教一下,我想判断一个DXE Driver是否启动失败,在下面添加了DEBUG(xxxxx)的信息。这个DEBUG宏输出信息从哪里可以看啊? 我用QEMU串口输出的信息只有启动UEFI Shell之后的信息,之前的根本看不到...
一般 debug 信息都是按照串口输出, QEMU 上可以看到 debug 信息的地方就可以看到
谢谢回复。我参考您博客里面另一篇文章,已经从串口0x402读取出了DEBUG信息。
你好,想请教一下,如果要测试更改bios数据后再写回去,Vmware和qemu都会提示写保护,有没有办法解决呢,或者有什么其他工具可以测试,真实机太危险了,已经刷坏了。。
QEMU 明确说过自己不支持回写的操作。 VMWare 不知道,但是从经验上看也是不支持回写的。
版主你好,
本人是新手,才接触uefi的知识,现在有个问题,我用VM,或者qemu模拟进入后,脚本会读取bios的原始文件,然后添加section,最后生成出来的bios重新写进入,但是虚拟机BIOS写保护,根本没法模拟这个操作,真实机可以,但是测试的时候刷坏了几次,想用虚拟机的方式测试,不知道有没有什么好的方法建议呢?谢谢
使用Qemu提供的-pflash bios.rom应该就可以了。
请问我的qemu界面看不到fs0,我怎么切换到工作目录来运行efi驱动啊。另外如果我想开发一个驱动,debug方法,我查找网上,双机调试,host端用Intel Target Probe,server用qemu来调试我的硬件,是这样的么?
看不到 fs0: 应该是你没有存储设备吧?光驱、硬盘,软驱至少要有一个的。你说的是 ITP 吗? ITP 只能用在实体机上,无法用来调试虚拟机。
您好,我现在用QEMU+ovmf也碰到没有fs0,以至于无法运行efi文件,请问您之前碰到的问题解决了吗
你需要按照之前文章的方法看一下 QEMU 的Log
遇到同樣問題 , 我參考一樓啟用方式
用 qemu-system-x86_64.exe -bios "OVMF.fd" -hda fat:rw:C:\BIOS\Temp -net none
在這邊開一個資料夾 C\BIOS\Temp\ , 就有fs0: 可以使用了
您好,为啥我打开edk2setup.bat的时候,总是一闪而过,也就是打不开
你是先打卡 cmd 然后进入目录运行 edk2setup.bat 的吗?
您好,进入Edk2Setuo.bat所在的目录执行Edk2Setuo.bat提示不是内部或外部命令,也不是可运行的程序或批处理文件。
你好 我在shell中显示这个 不知是什么原因呢?
Shell> FS0
'FS0' is not recognized as an internal or external command, operable program, or script file.
要写成 fs0: (后面有一个冒号)
我用的Ovmf 能在 Post 时打印debug 的log 但是进了 Setup ,串口只能打印 Setup 界面,不能打印Debug log ,想请教下。
我猜测应该是进入 Setup 之后打开了 Serial 重定向导致的。你研究一下?