Step to UEFI (68) ----- 编译一个能在 QEMU 上跑的BIOS

最近在看 《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\ 下面即可。

按照上述方法设置之后,即可正常编译

ovmf

2.4 运行方法

在 build 下面找到 ovmf.fd ,拷贝到 qemu 的安装目录下

命令行中运行

qemu-system-x86_64.exe -bios "OVMF.fd"

ovmf2

ovmf3

工作的视频

http://www.tudou.com/programs/view/acRlyVBYLz8/?resourceId=414535982_06_02_99

上面提到的工具,我放在Baidu网盘上,可以从这里下载 http://pan.baidu.com/s/1sjsZhr3 密码:uav4

如果你在具体操作中遇到任何问题可以直接给我留言,我会长期维护本文。

《Step to UEFI (68) ----- 编译一个能在 QEMU 上跑的BIOS》有20个想法

  1. 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的仿真程度要高。

    1. 想请教一下,我想判断一个DXE Driver是否启动失败,在下面添加了DEBUG(xxxxx)的信息。这个DEBUG宏输出信息从哪里可以看啊? 我用QEMU串口输出的信息只有启动UEFI Shell之后的信息,之前的根本看不到...

  2. 你好,想请教一下,如果要测试更改bios数据后再写回去,Vmware和qemu都会提示写保护,有没有办法解决呢,或者有什么其他工具可以测试,真实机太危险了,已经刷坏了。。

  3. 版主你好,
    本人是新手,才接触uefi的知识,现在有个问题,我用VM,或者qemu模拟进入后,脚本会读取bios的原始文件,然后添加section,最后生成出来的bios重新写进入,但是虚拟机BIOS写保护,根本没法模拟这个操作,真实机可以,但是测试的时候刷坏了几次,想用虚拟机的方式测试,不知道有没有什么好的方法建议呢?谢谢

  4. 请问我的qemu界面看不到fs0,我怎么切换到工作目录来运行efi驱动啊。另外如果我想开发一个驱动,debug方法,我查找网上,双机调试,host端用Intel Target Probe,server用qemu来调试我的硬件,是这样的么?

    1. 看不到 fs0: 应该是你没有存储设备吧?光驱、硬盘,软驱至少要有一个的。你说的是 ITP 吗? ITP 只能用在实体机上,无法用来调试虚拟机。

      1. 遇到同樣問題 , 我參考一樓啟用方式
        用 qemu-system-x86_64.exe -bios "OVMF.fd" -hda fat:rw:C:\BIOS\Temp -net none
        在這邊開一個資料夾 C\BIOS\Temp\ , 就有fs0: 可以使用了

      1. 您好,进入Edk2Setuo.bat所在的目录执行Edk2Setuo.bat提示不是内部或外部命令,也不是可运行的程序或批处理文件。

  5. 你好 我在shell中显示这个 不知是什么原因呢?
    Shell> FS0
    'FS0' is not recognized as an internal or external command, operable program, or script file.

  6. 我用的Ovmf 能在 Post 时打印debug 的log 但是进了 Setup ,串口只能打印 Setup 界面,不能打印Debug log ,想请教下。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注