Build/Launch EDKII emulator in Windows and Linux:编译/运行Windows和Linux环境下EDKII模拟器[4]

本文介绍了如何在Windows和Linux环境下编译和运行EDKII模拟器,包括Nt32模拟器和Emulator模拟器的具体步骤。涵盖了设置环境变量、修改配置文件、编译过程及运行模拟器等内容。

Build/Launch EDKII emulator in Windows and Linux:编译/运行WindowsLinux环境下EDKII模拟器[4]

2015-07   北京海淀区  张俊浩 

本篇博文《Build/Launch EDKII emulator in Windows and Linux(编译/运行WindowsLinux环境下EDKII模拟器)[4]》是基于在前几篇博文搭建Windows/LinuxEDKII开发环境、配置/编译EDKII源码项目的基础之上。本篇博文参考EDKII_UserManual_0_7》和戴正华《UEFI原理与编程》,简介了EDKII模拟平台,介绍Windows环境下Nt32模拟器、Linux环境下Emulator模拟器的编译和运行过程。博文框架安排如下:

4.Build/Launch EDKII emulator in Windows and Linux(编译/运行EDKII模拟器)

      ->4.1 Emulation Platforms Introduction (EDKII模拟器平台介绍)

      ->4.2 In WindowsNt32Pkg(Windows环境下编译/运行Nt32模拟器)

            ->4.2.1 Tool chain:BaseTools

            ->4.2.2 Setup Nt32 build shell environment

            ->4.2.3 Modify Conf Files

            ->4.2.4 Build Nt32Pkg

            ->4.2.5 Run Nt32

      ->4.3 In LinuxEmulatorPkg(Linux环境下编译/运行Emulator模拟器)

            ->4.3.1 Tool chain:BaseTools

            ->4.3.2 Setup Emulator build shell environment

            ->4.3.3 Modify Conf Files

            ->4.3.4 Build EmulatorPkg

            ->4.2.5 Run Emulator  

4.1 Emulation Platforms Introduction (EDKII模拟器平台介绍)

一个仿真平台并不是一个实际的硬件平台,但它旨在证明EDKII核心模块的稳定性和独立于硬件可以开发模块。仿真平台和实际平台之间的差异是其加载器和仿真的硬件设备。

EDKII提供三种模拟器平台:Nt32, Unix and Duet platforms

(An Emulation platform is not an actual platform, but is designed to prove the stability of EDKII's core modules and develop a hardware-independent module. The differences between emulated platforms and actual platforms are its loader and emulated hardware devices.EDKII provides three emulation platforms: Nt32, Emulator(UnixPkg过时) and Duet platforms. ) 

*NT32 platform

Nt3232Windows操作系统下提供UEFI运行环境的模拟器。SecMain模块[edk2\Build\NT32IA32\DEBUG_VS2013x86\IA32\SecMain.exe]Nt32平台加载器,是Windows可执行程序。Nt32建立了模拟硬件环境,如分配Windows内存为Nt32平台来模拟系统的内存,映射FD(Flash Description Files)文件到Windows的内存区域来模拟Flash设备。之后,SecMain程序调用PeiCore[Pre-EFI Initialization]作为实际的平台入口移交给PEI[Pre-EFI Initialization,UEFI的第二个启动阶段]阶段。

(Nt32 platform is launched in the 32-bit Microsoft Window operating system and provides UEFI runtime environment.

The SecMain module, the Nt32 platform loader, is a Windows application. It establishes emulated hardware environment such as allocating Windows memory to simulate system memory for Nt32 platform and mapping FD file to a Windows memory region to simulate flash device. After that, SecMain invokes PeiCore's entry as an actual platform handing off to the PEI phase.) 

*Emulator platform

EDKII_UserManual_0_7》第4章《EDKII Emulation Environment》关于Linux环境下的模拟器介绍的是Unix模拟器。


 但进入UnixPkg包下发现只有空目录结构没有源文件,在顶层目录下有Deprecated.txt过时声明的文件:

UnixPkg is deprecated.(UnixPkg过时了)

The same functionality is supported using the EmulatorPkg.(同样的功能可由EmulatorPkg实现)

Please see EmulatorPkg/README for more information about EmulatorPkg.

(参考EmulatorPkg/README获取更多信息)

EmulatorPkg/READMEEmulatorPkg的介绍:EmulatorPkg在与UEFI运行不完全兼容环境下提供了UEFI模拟运行环境,例如运行在一个操作系统进程建立的UEFI模拟环境。

EmulatorPkg provides an environment where a UEFI environment can be emulated under an environment where a full UEFI compatible environment is not possible. (For example, running under an OS where an OS process hosts the UEFI emulation environment.)

 *Duet platform 

Duet在硬件平台虚拟出实际的 UEFI BIOS 工作环境,并且提供基于 Legacy BIOS 的 Runtime 环境的支持库。

4.2 In WindowsNt32Pkg(Windows环境下编译/运行Nt32模拟器)

 4.2.1 Tool chain:BaseTools

Windows开发环境下EDKII可执行工具链位于\edk2\BaseTools\Bin\Win32目录下。

4.2.2 Setup Nt32 build shell environment

D:\> cd edk2
D:\edk2> edksetup.bat --nt32
[ 注: edksetup.bat 脚本参数“ --nt32 , 是为了设置 Nt32 编译环境变量 ]  

 

4.2.3 Modify Conf Files

4.2.3.1 Set Build Target Information:配置target.txt文件

将当前模块配置为Nt32Pkg

D:\edk2> notepad Conf\target.txt
ACTIVE_PLATFORM should look like this in Conf\target.txt:

ACTIVE_PLATFORM       = Nt32Pkg/Nt32Pkg.dsc

Conf\target.txt其他配置采用之前的默认配置:

TOOL_CHAIN_TAG        = VS2013x86
TARGET                 = DEBUG
TOOL_CHAIN_CONF       = Conf/tools_def.txt
MAX_CONCURRENT_THREAD_NUMBER = 1
BUILD_RULE_CONF = Conf/build_rule.txt

4.2.3.2 Check/Modify tools_def Information:检查tools_def.txt确保编译器路径正确

之前的博客中环境EDKII项目编译器路径已经做了检查。

4.2.4 Build Nt32Pkg

D:\edk2> build

 


编译时间大概10min左右。 

4.2.5 Run Nt32

D:\edk2> build run

或者在build命令行指定平台:[不过-a/-p平台架构和目标平台我们在target.txt中配置,作为build默认选项参数]

D:\edk2> build -a IA32 -p Nt32Pkg/Nt32Pkg.dsc run
或者是执行 edk2\Build\NT32IA32\DEBUG_VS2013x86\IA32\SecMain.exe可执行文件;

 

通常模拟器最终会进入UEFI ShellEDKII默认将目录:

edk2\Build\NT32IA32\DEBUG_VS2013x86\IA32\映射为文件系统FS0,shell中执行命令(FS0:/fs0:,大小写均可)

Shell> fs0:

Shell将会打开FS0分区并将当前目录切换到FS0分区的根目录,可执行UEFI应用程序HelloWorld.efi,向屏幕终端打印输出字符串“UEFI Hello World!”。

FS0:\> HelloWorld.efi


4.3 In LinuxEmulatorPkg(Linux环境下编译/运行Emulator模拟器)

4.3.1 Tool chain:BaseTools

Linux开发环境下EDKII可执行工具链位于edk2/BaseTools/BinWrappers/PosixLike目录下。

4.3.2 Setup Emulator build shell environment

linux@ubuntu:~$ cd ~/src/edk2
linux@ubuntu:~/src/edk2$ export EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools
linux@ubuntu:~/src/edk2$ . edksetup.sh BaseTools


4.3.3 Modify Conf Files

4.3.3.1 Set Build Target Information:配置target.txt文件

将当前模块配置为EmulatorPkg

ACTIVE_PLATFORM should look like this in Conf\target.txt:

ACTIVE_PLATFORM       = EmulatorPkg/EmulatorPkg.dsc

Conf\target.txt其他配置采用之前的默认配置:

TOOL_CHAIN_TAG        = GCC46
TARGET                  = DEBUG
TOOL_CHAIN_CONF       = Conf/tools_def.txt
MAX_CONCURRENT_THREAD_NUMBER = 1
BUILD_RULE_CONF = Conf/build_rule.txt

4.3.3.2 Check/Modify tools_def Information:检查tools_def.txt确保编译器路径正确

之前的博客中环境EDKII项目编译器路径已经做了检查。

 4.3.4 Build EmulatorPkg

编译EmulatorPkg有两种方式,一个是通过最基本build命令,build命令解析target.txt中的配置参数进行编译;而是运行EmulatorPkg包下的build.sh脚本来调用build命令完成EmulatorPkg编译。

编译进行大约5min左右(I5-3337U处理器1.8G主频,单线程)

linux@ubuntu:~/src/edk2$ build 


EmulatorPkg/READMEEmulatorPkg的编译/运行方式介绍:

On systems with the bash shell you can use EmulatorPkg/build.sh to simplify building and running EmulatorPkg.

On X64 host machines, you can build + run IA32 mode as well:

$ EmulatorPkg/build.sh -a IA32

或者进入EmulatorPkg目录下,执行build.sh脚本:

linux@ubuntu:~/src/edk2$ cd EmulatorPkg/
linux@ubuntu:~/src/edk2/EmulatorPkg$ ./build.sh -a IA32



[注:通过"./EmulatorPkg/build.sh -a IA32"脚本编译的模块最终生成的.efi放在:

         edk2/Build/Emulator32/DEBUG_GCC46/IA32路径下;

    通过"build -a IA32"命令编译的模块最终生成的.efi放在:

    edk2/Build/Emulator/DEBUG_GCC46/IA32。两者输出目录不同]

4.2.5 Run Emulator

EmulatorPkg/READMEEmulatorPkg的编译/运行方式介绍:

On systems with the bash shell you can use EmulatorPkg/build.sh to simplify building and running EmulatorPkg.

On X64 host machines, you can build + run IA32 mode as well:

$ EmulatorPkg/build.sh -a IA32 run 



通常模拟器最终会进入UEFI ShellEDKII会将目录:

edk2/Build/Emulator32/DEBUG_GCC46/IA32/映射为文件系统fsnt0,shell中执行命令(FSNT0:/fsnt0:,大小写均可)

Shell> FSNT0:

Shell将会打开fsnt0分区并将当前目录切换到fsnt0分区的根目录,可执行UEFI应用程序HelloWorld.efi,向屏幕终端打印输出字符串“UEFI Hello World!”。

fsnt0:\> HelloWorld.efi

<think>我们正在处理用户关于编译aosp_x86_64-eng后启动模拟器失败的问题。根据之前的对话,用户已经尝试了编译该版本,但启动模拟器失败。我们需要分析可能的原因。 根据引用[1][2],用户需要执行source build/envsetup.shlunch aosp_x86_64-eng来设置环境。如果模拟器启动失败,可能有多种原因。 我们将分析可能的原因: 1. 环境变量设置不正确:每次打开新终端都需要执行sourcelunch命令,否则emulator可能找不到路径。 2. 编译未完全成功:编译过程中可能有错误,导致生成的镜像文件不完整。 3. 模拟器依赖的库缺失:运行模拟器需要一些系统库,如SDL、OpenGL等。 4. 内核问题:虽然aosp_x86_64-eng通常使用预编译的内核,但如果有自定义内核,可能会导致问题。 5. 硬件加速问题:模拟器需要KVM(Linux)或HAXM(Windows/macOS)等硬件加速支持,如果未安装或配置不正确,会导致启动失败。 6. 端口冲突:模拟器默认使用55545555端口,如果被占用会导致启动失败。 7. 磁盘空间不足:运行模拟器需要足够的磁盘空间。 具体步骤: 1. 验证环境设置: 用户必须在编译后的AOSP根目录下执行: source build/envsetup.sh lunch aosp_x86_64-eng 然后运行emulator2. 检查编译是否成功: 查看编译结束时的输出,是否有成功提示。同时检查生成的镜像文件,通常在$OUT目录(例如out/target/product/generic_x86_64/)下,应该有system.img, ramdisk.img, userdata.img等。 3. 检查模拟器依赖库: 在Linux上,确保安装了必要的库,例如: sudo apt-get install libsdl1.2-dev libgl1-mesa-dev 4. 检查硬件加速: Linux下检查KVM: lsmod | grep kvm # 检查kvm模块是否加载 kvm-ok # 如果命令不存在,安装cpu-checker包 确保当前用户在kvm组中: groups | grep kvm 如果不在,则添加:sudo usermod -aG kvm $USER 5. 检查端口占用: 使用命令查看55545555端口是否被占用(Linux): netstat -an | grep 5554 6. 检查磁盘空间: df -h # 检查当前分区剩余空间 7. 查看错误信息: 运行emulator时加上-verbose参数,输出详细日志: emulator -verbose 根据日志中的错误信息进行排查。 8. 尝试使用标准镜像: 如果用户编译的版本有问题,可以尝试使用预编译的镜像(但用户编译后应该使用自己编译的镜像): emulator -system $OUT/system.img -ramdisk $OUT/ramdisk.img -data $OUT/userdata.img 9. 检查$PATH: 确保emulator的路径在$PATH中,通常是prebuilts/android-emulator/linux-x86_64/emulator 根据引用[2],还提到了adb连接问题,但模拟器启动失败通常与adb无关,不过可以检查adb版本是否匹配。 常见错误: - 如果报错:emulator: ERROR: x86_64 emulation currently requires hardware acceleration! 则需要开启硬件加速(安装KVM并配置)。 - 如果报错:Failed to open lib64OpenglRenderemulation.so,则可能是OpenGL库问题。 解决方案: 1. 确保硬件加速已启用并配置。 2. 尝试使用软件渲染:emulator -gpu off 另外,根据引用[3],编译AOSP并启动模拟器是一个复杂的过程,需要多个步骤正确。 因此,我们给用户提供详细的排查步骤。 注意:用户使用的是x86_64架构的模拟器,所以硬件加速尤其重要。 我们将按以下结构回答: 1. 环境设置确认 2. 检查编译输出 3. 硬件加速检查 4. 依赖库检查 5. 端口磁盘检查 6. 详细日志分析 最后,生成相关问题。 </think>编译`aosp_x86_64-eng`版本后启动模拟器失败,可能涉及以下几个核心原因及排查方案: ### 一、环境配置问题(最常见) 1. **终端环境未激活** 每次新开终端必须执行: ```bash source build/envsetup.sh # 激活编译环境 lunch aosp_x86_64-eng # 指定目标架构 ``` 否则会出现`emulator: command not found`错误。验证命令: ```bash which emulator # 应返回AOSP路径如/prebuilts/android-emulator/linux-x86_64/emulator ``` [^1][^2] 2. **SDK工具链缺失** 检查必要工具是否安装: ```bash ls $ANDROID_HOME/platform-tools/adb # 验证adb ls $ANDROID_HOME/emulator/emulator # 验证模拟器二进制 ``` 缺失时需通过SDK Manager安装`Android Emulator``Platform-Tools`。 --- ### 二、编译产物问题 1. **镜像文件未生成** 检查输出目录: ```bash ls -lh $OUT/*.img # 应有system.img, vendor.img, ramdisk.img等 ``` 若文件缺失或大小异常(如<500MB),说明编译未完成。 2. **内核架构不匹配** x86_64架构必须使用对应内核: ```bash file $OUT/kernel-ranchu # 应显示"x86-64" ``` 若不匹配需重新配置: ```bash make clean lunch aosp_x86_64-eng m -j$(nproc) # 完整编译 ``` [^1] --- ### 三、硬件加速问题 | 加速方案 | 验证命令 | 解决方案 | |------------|----------------------|------------------------------| | **KVM** (Linux) | `lsmod \| grep kvm` | 安装:`sudo apt install qemu-kvm` | | **HAXM** (Win/Mac)| `cat /proc/cpuinfo \| grep vmx` | 下载Intel HAXM安装包 | | **GPU渲染** | `emulator -gpu auto -verbose \| grep 'GPU emulation'` | 尝试`-gpu swiftshader_indirect` | --- ### 四、端口占用冲突 模拟器默认占用5554-5585端口,检查并释放: ```bash lsof -i :5554 # 查看占用进程 kill -9 <PID> # 强制结束进程 emulator -port 5570 # 指定新端口启动 ``` --- ### 五、系统级依赖缺失 **Linux系统需安装**: ```bash sudo apt install libgl1-mesa-dev libpulse-dev libasound2-dev ``` **Windows需安装**: [Visual C++ Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe) --- ### 排查流程 1. **开启详细日志**: ```bash emulator -verbose 2> emulator.log ``` 重点检查日志中的`ERROR``Failed`条目。 2. **最小化启动测试**: ```bash emulator -no-window -no-audio -no-snapshot -memory 2048 ``` 逐步添加参数定位故障模块。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值