在Android上使用qemu-user运行可执行文件

本文介绍了如何在Android设备上使用qemu-user运行可执行文件,以及遇到错误"FATAL: kernel did not supply AT_SECURE"时的两种解决方案。涉及修改Android源码、qemu源码以及相关库的处理。

在Android上使用qemu-user运行可执行文件

作者:寻禹@阿里聚安全



前言

QEMU简要介绍:

QEMU可以解释执行可执行程序。既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行了哪些指令,从而可以跟踪指令的执行。QEMU编译出来的结果分为系统模式和用户模式,QEMU用户模式编译出来的可执行文件名为:qemu-user。关于QEMU更多的介绍请浏览官方网站:QEMU


关于如何编译QEMU用户模式可执行文件,请参考这篇文章:编译可在Android上运行的qemu user mode

    qemu-user的main函数源码在文件”linux-user/main.c”中。


设置前提

本文研究的QEMU用户模式的可执行文件运行在(Android & arm cpu)上,下文中说的“设备”一词指的就是Android arm设备,设备的系统是CyanogenMod12.1 ROM,该ROM基于Android5.1.1。


运行qemu-user

QEMU 1.2.0 编译好的可执行程序,可以直接运行于windows平台,可以模拟各种硬件平台,例如ARM,X86,Sparc,PPC,MIPS等等。下面是文件列表 2012-09-20 00:18 3,211 bamboo.dtb 2012-09-20 00:18 131,072 bios.bin 2012-09-20 00:18 4,335 cpus-x86_64.conf 2012-09-20 00:18 keymaps 2012-09-20 00:18 9,216 kvmvapic.bin 2012-09-20 00:18 1,024 linuxboot.bin 2012-09-20 00:18 1,024 multiboot.bin 2012-09-20 00:18 729,908 openbios-ppc 2012-09-20 00:18 381,764 openbios-sparc32 2012-09-20 00:18 1,598,648 openbios-sparc64 2012-09-20 00:18 185,703 palcode-clipper 2012-09-20 00:18 9,982 petalogix-ml605.dtb 2012-09-20 00:18 8,259 petalogix-s3adsp1800.dtb 2012-09-20 00:18 524,288 ppc_rom.bin 2012-09-20 00:18 67,072 pxe-e1000.rom 2012-09-20 00:18 61,440 pxe-eepro100.rom 2012-09-20 00:18 61,440 pxe-ne2k_pci.rom 2012-09-20 00:18 61,440 pxe-pcnet.rom 2012-09-20 00:18 61,440 pxe-rtl8139.rom 2012-09-20 00:18 60,416 pxe-virtio.rom 2012-09-20 00:18 281,956 qemu-doc.html 2012-09-20 00:18 630 qemu-icon.bmp 2012-09-20 00:18 1,565,705 qemu-img.exe 2012-09-20 00:18 1,589,020 qemu-io.exe 2012-09-20 00:18 2,292,224 qemu-system-alpha.exe 2012-09-20 00:18 3,225,088 qemu-system-arm.exe 2012-09-20 00:18 1,677,312 qemu-system-cris.exe 2012-09-20 00:18 3,100,160 qemu-system-i386.exe 2012-09-20 00:19 1,628,160 qemu-system-lm32.exe 2012-09-20 00:19 2,105,344 qemu-system-m68k.exe 2012-09-20 00:19 1,631,744 qemu-system-microblaze.exe 2012-09-20 00:19 1,631,232 qemu-system-microblazeel.exe 2012-09-20 00:19 3,080,192 qemu-system-mips.exe 2012-09-20 00:19 3,257,344 qemu-system-mips64.exe 2012-09-20 00:19 3,269,120 qemu-system-mips64el.exe 2012-09-20 00:19 3,078,656 qemu-system-mipsel.exe 2012-09-20 00:19 1,601,536 qemu-system-or32.exe 2012-09-20 00:19 3,416,576 qemu-system-ppc.exe 2012-09-20 00:19 3,948,032 qemu-system-ppc64.exe 2012-09-20 00:19 3,411,456 qemu-system-ppcemb.exe 2012-09-20 00:19 1,839,104 qemu-system-s390x.exe 2012-09-20 00:19 2,116,608 qemu-system-sh4.exe 2012-09-20 00:19 2,118,144 qemu-system-sh4eb.exe 2012-09-20 00:19 1,843,712 qemu-system-sparc.exe 2012-09-20 00:19 2,611,200 qemu-system-sparc64.exe 2012-09-20 00:19 1,591,296 qemu-system-unicore32.exe 2012-09-20 00:18 3,273,728 qemu-system-x86_64.exe 2012-09-20 00:19 1,644,544 qemu-system-xtensa.exe 2012-09-20 00:19 1,637,376 qemu-system-xtensaeb.exe 2012-09-20 00:18 28,474 qemu-tech.html 2012-09-20 00:18 49,841 qmp-commands.txt 2012-09-20 00:18 3,304 s390-zipl.rom 2012-09-20 00:21 303,616 SDL.dll 2012-09-20 00:18 4,096 sgabios.bin 2012-09-20 00:18 878,640 slof.bin 2012-09-20 00:18 20 spapr-rtas.bin 2012-09-20 00:18 0 target-x86_64.conf 2012-09-20 00:18 35,840 vgabios-cirrus.bin 2012-09-20 00:18 40,448 vgabios-qxl.bin 2012-09-20 00:18 40,448 vgabios-stdvga.bin 2012-09-20 00:18 40,448 vgabios-vmware.bin 2012-09-20 00:18 40,448 vgabios.bin
<think>好的,我需要帮助用户了解如何正确使用qemu-aarch64命令。用户之前已经询问过关于qemu-arm的使用,现在转向qemu-aarch64,可能是在尝试运行64位ARM系统。首先,我需要区分qemu-system-aarch64和qemu-aarch64的不同。 根据用户提供的引用[1],用户可能看到了在Windows上创建aarch64虚拟机的示例,但用户现在可能更关注的是在Linux环境下使用qemu-aarch64运行用户模式程序或全系统模拟。需要明确qemu-aarch64通常指的是用户模式模拟,而qemu-system-aarch64是系统模式模拟,两者的用途不同。 用户之前的问题中,我详细讲解了qemu-arm的使用,包括运行静态和动态程序、调试等。现在需要将类似的内容迁移到aarch64架构,同时考虑64位特有的参数和配置。比如,动态链接库路径可能不同,CPU型号也需要对应,如cortex-a72、cortex-a53等。 需要检查用户是否可能混淆了用户模式和系统模式。在回答中应该明确区分这两种模式的使用场景。用户提供的引用中提到的命令是系统模式,但用户的问题可能更倾向于用户模式,所以需要确认用户的实际需求。 接下来,我需要构建一个结构清晰的指南,包括核心命令结构、安装验证、典型场景示例、常见问题等。同时,要确保使用正确的参数,比如-L路径在aarch64下可能不同,例如/usr/aarch64-linux-gnu。还需要提供编译示例,使用aarch64-linux-gnu-gcc编译器。 另外,用户可能遇到动态链接库的问题,需要指导如何正确设置库路径或安装对应的交叉编译库。在调试部分,可能需要使用gdb-multiarch连接到qemu的调试端口,这与之前qemu-arm的步骤类似,但需确认端口和架构是否正确。 在系统模式部分,用户引用中的参数可以作为示例,但需要解释每个参数的作用,如-M指定机器类型,-bios指定固件,-device添加外设等。同时,要提醒用户需要准备合适的EFI固件和镜像文件,比如UEFI.fd和安装ISO。 还要考虑用户的环境,是否已经安装了必要的包,比如qemu-system-arm、交叉编译工具链等。对于不同发行版,安装命令可能不同,需要给出示例,如Ubuntu下的安装步骤。 最后,生成相关问题,帮助用户进一步探索,比如如何配置网络、性能优化、与用户模式的区别等。确保引用正确,比如用户提供的引用[1]是关于系统模式的,可能在相关问题中提及。 需要检查所有命令的正确性,避免拼写错误,并确保参数适用于aarch64架构。同时,保持回答结构清晰,步骤详细,便于用户逐步操作验证。</think>### QEMU-aarch64 使用详解(用户模式 + 系统模式) --- #### 一、核心模式区分 1. **用户模式**:`qemu-aarch64`(直接运行ARM64程序) ```bash # 运行ARM64程序(类似qemu-arm的64位版本) qemu-aarch64 -L /usr/aarch64-linux-gnu ./hello_aarch64 ``` 2. **全系统模式**:`qemu-system-aarch64`(完整虚拟机) ```bash # 启动ARM64虚拟机(需搭配UEFI固件) qemu-system-aarch64 -M virt -cpu cortex-a72 -m 4G -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -hda ubuntu-arm64.img ``` --- #### 二、用户模式实战(运行单程序) **步骤1:环境准备** ```bash # Ubuntu/Debian安装依赖 sudo apt install qemu-user-static gcc-aarch64-linux-gnu # 验证工具链 aarch64-linux-gnu-gcc --version # 应显示aarch64编译器信息[^2] ``` **步骤2:编译与运行** ```c // hello.c #include <stdio.h> int main() { printf("ARM64程序运行成功\n"); return 0; } ``` ```bash # 编译ARM64程序 aarch64-linux-gnu-gcc -static hello.c -o hello_static aarch64-linux-gnu-gcc hello.c -o hello_dynamic # 运行动态链接程序(需指定库路径) qemu-aarch64 -L /usr/aarch64-linux-gnu/ ./hello_dynamic # 输出"ARM64程序运行成功"即验证通过[^3] ``` **调试技巧**: ```bash # 启动GDB调试 qemu-aarch64 -g 1234 ./hello_dynamic & gdb-multiarch ./hello_dynamic (gdb) target remote :1234 (gdb) b main ``` --- #### 三、全系统模式配置(完整虚拟机) **核心参数说明**: ```bash qemu-system-aarch64 \ -M virt \ # 使用QEMU虚拟化平台 -cpu cortex-a72 \ # 指定CPU型号 -smp 4 \ # 4个CPU核心 -m 8G \ # 内存大小 -bios QEMU_EFI.fd \ # UEFI固件(需提前准备) -drive file=ubuntu-arm64.img,format=raw \ # 系统磁盘 -device virtio-gpu-pci \ # GPU加速 -netdev user,id=net0 -device virtio-net-pci,netdev=net0 # 网络配置 ``` **典型启动流程**: 1. 下载UEFI固件: ```bash wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd ``` 2. 创建虚拟磁盘: ```bash qemu-img create -f qcow2 ubuntu-arm64.img 20G ``` 3. 启动安装镜像: ```bash qemu-system-aarch64 -M virt -cpu cortex-a72 -m 4G \ -bios QEMU_EFI.fd -cdrom ubuntu-22.04-live-server-arm64.iso \ -drive file=ubuntu-arm64.img,format=qcow2 \ -device virtio-net-device,netdev=net0 -netdev user,id=net0 ``` --- #### 四、常见问题解决 | 问题场景 | 解决方案 | |---------|----------| | **UEFI固件缺失** | 安装`qemu-efi-aarch64`包或手动下载`QEMU_EFI.fd` | | **启动卡在UEFI Shell** | 在Shell中执行`FS0:\EFI\BOOT\BOOTAA64.EFI`[^1] | | **动态链接库错误** | 使用`-L`指定路径或安装`libc6-arm64-cross` | | **网络不可用** | 添加`-nic user,model=virtio-net-pci`参数 | | **图形界面黑屏** | 改用`-nographic`或添加`-device virtio-gpu-pci` | --- #### 五、性能优化建议 1. **启用KVM加速**(需宿主CPU支持): ```bash qemu-system-aarch64 -enable-kvm -machine virt,gic-version=3 ... ``` 2. **使用virtio设备**: ```bash -drive file=disk.img,if=virtio -netdev user,id=net0,model=virtio ``` 3. **分配大页内存**: ```bash -mem-prealloc -mem-path /dev/hugepages ``` --- ### 验证成功标志 1. 用户模式程序正确输出预期结果 2. 全系统模式下完成操作系统安装 3. 虚拟机内执行`uname -m`显示`aarch64` 4. GDB可正常调试ARM64汇编指令 --- ### 高级应用示例 **运行Android ARM64镜像**: ```bash qemu-system-aarch64 -M virt -cpu cortex-a72 -m 6G \ -bios QEMU_EFI.fd -device virtio-gpu-pci \ -drive file=android-arm64.img,format=raw \ -nic user,hostfwd=tcp::5555-:5555 # 启用ADB端口转发 ``` **交叉编译内核测试**: ```bash # 编译ARM64内核 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 # 使用QEMU启动测试 qemu-system-aarch64 -M virt -cpu cortex-a72 -m 2G \ -kernel arch/arm64/boot/Image -append "root=/dev/vda console=ttyAMA0" ``` --- ### 相关问题 1. 如何通过QEMU实现ARM64与x86主机之间的文件共享? 2. 用户模式与系统模式在资源占用上有何本质区别? 3. 如何配置TPM安全芯片支持运行Windows ARM64? 4. QEMU中如何调试ARM64内核的启动过程? : UEFI固件路径可能因发行版不同而变化 [^2]: 交叉编译工具链需与目标系统glibc版本匹配 [^3]: `qemu-aarch64-static`更适合容器环境嵌入使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值