1.在BusyBox增加交叉编译运行环境
之前的章节我们已经完成了从内核启动ramdisk,然后ramdisk挂载一个外部存储,并跳转到外部存储上的文件系统的过程.但是我们还没有在这个模拟系统中运行我们自己写的程序.
在自己写程序之前我们必须建立交叉编译环境,在HOST端,这个交叉编译环境已经建好了(请参见 用QEMU搭建arm开发环境之二:QEMU启动内核这一章的内容).但是在qemu里面还需要加入对应的运行环境.这个运行系统所需的文件在我们解压arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2这个文件后的opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot下.目录下的文件大约是这样的:
etc lib lib32 lib64 sbin usr var
我们需要重新挂载刚才做好的busybox的文件系统,然后把上面的文件复制进去:
cp rootfs.ext3 rootfsbak.ext3
sudo mount rootfs.ext3 mnt
cd mnt
sudo cp -rf ~/qemuwork/tmp/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot/* .
cd ..
sudo umount mnt
修改成功后,我们再次启动看看是否能够正常启动
qemu-system-arm -M vexpress-a9 -m 512M -kernel zImage -dtb vexpress-v2p-ca9.dtb -initrd ramdisk.gz -append "root=/dev/ram0 clocksource=pit rw console=tty0 rdinit=/init" -sd rootfs.ext3
2.编写第一个程序HelloQEMU
上面我们修改文件系统后,并没有检查是否能够正常运行我们写的程序,所以我们这里要写一个程序来试一下.
cd ~/src
vi test.c
上面我们建立一个test.c文件,然后输入如下内容:
#include<stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
保存后,使用如下命令编译:
arm-none-linux-gnueabi-gcc test.c -o test
3.下载并运行HelloQEMU
编译成功后的test文件我们需要放入到rootfs中.
sudo mount rootfs.ext3 mnt
cd mnt
sudo mkdir root
sudo cp ~/src/test root/
cd ..
sudo umount mnt
然后我们再次启动qemu,执行如下命令:
qemu-system-arm -M vexpress-a9 -m 512M -kernel zImage -dtb vexpress-v2p-ca9.dtb -initrd ramdisk.gz -append "root=/dev/ram0 clocksource=pit rw console=ttyAMA0 rdinit=/init" -sd rootfs.ext3 -serial stdio -smp 4
启动成功后,测试一下:
/ # ls
bin etc lib32 linuxrc root sys var
dev lib lib64 proc sbin usr
/ # cd root
/root # ls
test
/root # ./test
hello world!
/root #
至此交叉编译后的运行环境搭建成功.
鸣谢:本文部分内容来自下面的链接,感谢相关作者的贡献.如侵权或需要删除请联系我.
https://www.cnblogs.com/tansuoxinweilai/p/11602830.html