我一直在尝试在QEMU上构建和运行Android JellyBean
我有一个为我的目标机器类型构建的内核(ARM Versatile Express-Cortex A15)
我一直试图用我的Android构建的输出构建一个QEMU映像,但我总是会出现错误,比如qemu-system-arm -serial stdio -M vexpress-a15 -m 128m -kernel zImage -append "root=/dev/sda1 earlyprintk" android_jb.img
<3>VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "/" or unknown-block(2,0)
Please append a correct "root=" boot option; here are the available partitions:
<0>Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
如果我没有为qemu指定-initrd
选项,就会发生这种情况。
当我指定initrd选项时qemu-system-arm -serial stdio -M vexpress-a15 -m 128m -kernel zImage -append "root=/dev/sda1 earlyprintk" -initrd ramdisk.img android_jb.img
(由Android构建过程生成),我得到以下错误
<3>init: cannot find '/system/bin/servicemanager', disabling 'servicemanager'
<3>init: cannot find '/system/bin/vold', disabling 'vold'
<3>init: cannot find '/system/bin/sh', disabling 'setconsole'
<3>init: cannot find '/system/bin/netd', disabling 'netd'
<3>init: cannot find '/system/bin/debuggerd', disabling 'debuggerd'
<3>init: cannot find '/system/bin/rild', disabling 'ril-daemon'
<3>init: cannot find '/system/bin/surfaceflinger', disabling 'surfaceflinger'
<3>init: cannot find '/system/bin/app_process', disabling 'zygote'
<3>init: cannot find '/system/bin/drmserver', disabling 'drm'
<3>init: cannot find '/system/bin/mediaserver', disabling 'media'
<3>init: cannot find '/system/bin/installd', disabling 'installd'
<3>init: cannot find '/system/bin/keystore', disabling 'keystore'
<3>init: cannot find '/system/bin/sh', disabling 'console'
我的android_jb.img
包含android_out/root/*
和android_out/system
的内容其中android_out
是我的Android版本的输出
(android_out=out/platform/target/project/armboard_v7a)
如果您使用的是-initrd
,那么它只加载只包含少数二进制文件的ramdisk。系统和其他分区安装在init.rc中,并且在日志中似乎没有发生安装。
几周前我就想好了如何做到这一点。
Android
为VExpress构建Android有点复杂。值得庆幸的是,这些步骤在这里描述得很清楚。
按照这些指令,一旦make PRODUCT-armboard_v7a-eng
完成,就转到输出目录。
我们现在需要创建一个映像,将其作为SD卡安装在VExpress板上。
例如,我将创建一个包含android的2GB SD图像dd if=/dev/zero of=android.img bs=512 count=$((2 * 1024 * 1024 * 1024 / 512))
我们现在需要在此映像上创建一个文件系统和分区表。
sudo /sbin/losetup /dev/loop0 android.img
# cylinders = size / (16 * 63 * 512)
sudo /sbin/sfdisk --no-reread -D -C 4161 -H 16 -S 63 /dev/loop0 << EOF
0,
;
EOF
sudo /sbin/losetup -d /dev/loop0
# Create the partition
sudo /sbin/losetup -o $((63*512)) /dev/loop0 android.img
sudo /sbin/mkfs.ext2 /dev/loop0
sudo /sbin/losetup -d /dev/loop0
现在我们已经准备好了图像,我们将android文件复制到它上。
sudo mount -o loop,offset=$((63*512)) android.img /mnt
sudo cp -R <android_out>/target/product/armboard_v7a/root/* /mnt/
sudo cp -R <android_out>/target/product/armboard_v7a/system/* /mnt/system
sudo umount /mnt
内核
这里没什么特别的。使用vexpress_defconfig
QEMU
现在,我们可以使用所有部件运行qemu
。
qemu-system-arm -kernel zImage -machine vexpress-a9 -cpu cortex-a9 -serial stdio -m 1024 -append 'noinitrd root=/dev/mmcblk0p1 rw mem=1024M console=ttyAMA0,38400n8 rootwait earlyprintk loglevel=8 init=/init' -sd android.img
参考文献:
https://wiki.linaro.org/PeterMaydell/QemuVersatileExpress
http://linux-arm.org/LinuxKernel/LinuxAndroidPlatform
http://www.m5sim.org/BBench-gem5