转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/
【背景】
手上有一个嵌入式Linux的项目。
已经用交叉编译器arm-xscale-linux-gnueabi去编译了Uboot和kernel:
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译uboot
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译linux-2.6.19.1内核
且已经有了对应的rootfs了,所以算是基本齐全了。
后来得知有个QEMU,和SkyEye类似,可以模拟arm开发板。
所以,尝试去试试,能否在Ubuntu下,用QEMU去模拟加载并运行Uboot,kernel,rootfs。
【折腾过程】
1.再去看看关于QEMU的介绍资料:
2.其下载页面:
下载QEMU:
http://wiki.qemu-project.org/download/qemu-1.6.0-rc3.tar.bz2
解压得到源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
crifan@ubuntu:qemu-1.6.0-rc3$ tar xvfj qemu-1.6.0-rc3. tar .bz2
crifan@ubuntu:qemu-1.6.0-rc3$ ls
aio-posix.c cputlb.c linux-headers qdict- test -data.txt qmp-commands.hx target-sparc
aio-win32.c default-configs linux-user qemu-bridge-helper.c qobject target-unicore32 arch_init.c device-hotplug.c main-loop.c qemu-char.c qom target-xtensa async.c device_tree.c MAINTAINERS qemu-coroutine.c qtest.c tcg audio disas Makefile qemu-coroutine-io.c readline.c tcg-runtime.c backends disas.c Makefile.objs qemu-coroutine-lock.c README tci.c balloon.c dma-helpers.c Makefile.target qemu-coroutine- sleep .c roms tests
block docs memory.c qemu-doc.texi rules.mak thread-pool.c block.c dtc memory_mapping.c qemu-img.c savevm.c thunk.c blockdev.c dump.c migration.c qemu-img-cmds.hx scripts tpm.c blockdev-nbd.c exec .c migration- exec .c qemu-img.texi slirp trace
blockjob.c fpu migration-fd.c qemu-io.c spice-qemu-char.c trace-events block-migration.c fsdev migration-rdma.c qemu-io-cmds.c stubs translate-all.c bsd-user gdbstub.c migration-tcp.c qemu-log.c sysconfigs translate-all.h bt-host.c gdb-xml migration-unix.c qemu-nbd.c target-alpha ui bt-vhci.c HACKING monitor.c qemu-nbd.texi target-arm user- exec .c
Changelog hmp.c nbd.c qemu.nsi target-cris util CODING_STYLE hmp-commands.hx net qemu-options.h target-i386 VERSION configure hmp.h os-posix.c qemu-options.hx target-lm32 version.rc COPYING hw os-win32.c qemu-options-wrapper.h target-m68k vl.c COPYING.LIB include page_cache.c qemu.sasl target-microblaze xbzrle.c coroutine-gthread.c iohandler.c pc-bios qemu-seccomp.c target-mips xen-all.c coroutine-sigaltstack.c ioport.c pixman qemu-tech.texi target-moxie xen-mapcache.c coroutine-ucontext.c kvm-all.c po qemu-timer.c target-openrisc xen-stub.c coroutine-win32.c kvm-stub.c qapi qga target-ppc cpu- exec .c libcacard qapi-schema.json QMP target-s390x
cpus.c LICENSE qdev-monitor.c qmp.c target-sh4 crifan@ubuntu:qemu-1.6.0-rc3$ pwd
/home/crifan/develop/embedded/qemu/qemu-1 .6.0-rc3
|
3.参考官网的文档:
中的:
Debian on an emulated ARM machine
QEMU Emulator User Documentation
去折腾。
4.先去在Ubuntu的Host上为arm平台安装QEMU:
【记录】在Ubuntu 13.04上为arm平台安装QEMU
5.然后再去下载测试软件:
http://wiki.qemu.org/download/arm-test-0.2.tar.gz
然后解压:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
crifan@ubuntu:qemu-1.6.0-rc3$ pwd
/home/crifan/develop/embedded/qemu/qemu-1 .6.0-rc3
crifan@ubuntu:qemu-1.6.0-rc3$ cd ..
crifan@ubuntu:qemu$ ls
qemu-1.6.0-rc3 qemu-1.6.0-rc3. tar .bz2
crifan@ubuntu:qemu$ mkdir test
crifan@ubuntu:qemu$ cd test
crifan@ubuntu: test $ mkdir arm
crifan@ubuntu: test $ cd arm
crifan@ubuntu:arm$ wget http: //wiki .qemu.org /download/arm-test-0 .2. tar .gz
--2013-08-15 03:02:29-- http: //wiki .qemu.org /download/arm-test-0 .2. tar .gz
Resolving wiki.qemu.org (wiki.qemu.org)... 140.211.15.109 Connecting to wiki.qemu.org (wiki.qemu.org)|140.211.15.109|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 3310162 (3.2M) [application /x-gzip ]
Saving to: ‘arm- test -0.2. tar .gz’
100%[=======================================================================================================>] 3,310,162 978KB /s in 3.4s
2013-08-15 03:02:35 (938 KB /s ) - ‘arm- test -0.2. tar .gz’ saved [3310162 /3310162 ]
crifan@ubuntu:arm$ ls
arm- test -0.2. tar .gz
crifan@ubuntu:arm$ tar xf arm- test -0.2. tar .gz
crifan@ubuntu:arm$ ls
arm- test arm- test -0.2. tar .gz
crifan@ubuntu:arm$ cd arm- test /
crifan@ubuntu:arm- test $ ls
arm_root.img README zImage.integrator crifan@ubuntu:arm- test $ pwd
/home/crifan/develop/embedded/qemu/test/arm/arm-test crifan@ubuntu:arm- test $
|
6.再去测试,结果只输出一行VNC:
【已解决】QUEMU安装完毕后测试arm出错:只有一行VNC server running on `127.0.0.1:5900′没其他输出
解决后,可以看到QEMU的arm的linux界面了:
7.再去测试测试arm的hello world是否可用。
先写个hello_qemu.c:
1
2
3
4
5
6
7
|
#include <stdio.h> int main( void )
{ printf ( "Hello QEMU for ARM !\n" );
return 0;
} |
再去用自己的交叉编译器arm-xscale-linux-gnueabi去编译:
1
2
3
4
|
crifan@ubuntu:helloworld$ arm-xscale-linux-gnueabi-gcc -o hello_qemu hello_qemu.c crifan@ubuntu:helloworld$ file hello_qemu
hello_qemu: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU /Linux 2.6.19, not stripped
crifan@ubuntu:helloworld$ |
然后去运行试试:
先去找到sysroot的路径,是参考之前的折腾:
【已解决】Eclipse通过Makefile调用交叉编译器交叉编译C项目出错:Type ‘FILE’ could not be resolved
的路径:
/opt/crosscompile/xscale/gcc-4.6.0-glibc-2.9/arm-xscale-linux-gnueabi/sysroot/usr/include
所以sysroot,应该是:
/opt/crosscompile/xscale/gcc-4.6.0-glibc-2.9/arm-xscale-linux-gnueabi/sysroot
所以去试试:
1
2
3
|
crifan@ubuntu:helloworld$ qemu-arm -L /opt/crosscompile/xscale/gcc-4 .6.0-glibc-2.9 /arm-xscale-linux-gnueabi/sysroot hello_qemu
Hello QEMU for ARM !
crifan@ubuntu:helloworld$ |
说明交叉工具链是正常的。
8.再去折腾uboot:
9.然后再去下载编译kernel:
【记录】Ubuntu下测试QEMU中加载和测试Linux内核
10.然后再去弄Open TFTP Server:
【记录】Ubuntu下为QEMU安装Open TFTP Server
11.然后再去折腾qemu-ifup & qemu-ifdown:
【记录】Ubuntu下为QEMU准备qemu-ifup和qemu-ifdown
12.都准备好了,就可以去启动内核了:
13.折腾完毕内核,就可以去弄rootfs了:
【记录】Ubuntu下为QEMU建立一个arm平台的可用的根文件系统rootfs
【总结】
此处,已经可以正常运行,一个基于busybox的,从ram启动的rootfs了。
至此,算是基本可用了。
有空再折腾,如何从uboot启动内核,从nfs加载rootfs等等内容。