【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】

2019-07-12 20:28发布

转自: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的介绍资料: QEMU (简体中文) QEMU Main Page 2.其下载页面: http://wiki.qemu.org/Download 下载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.参考官网的文档: http://wiki.qemu.org/Manual 中的: Virtual Development Board 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   int main(void) {     printf("Hello QEMU for ARM ! ");     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: 【记录】Ubuntu下测试QEMU中加载和测试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.都准备好了,就可以去启动内核了: 【记录】Ubuntu下使用QEMU启动Linux内核 13.折腾完毕内核,就可以去弄rootfs了: 【记录】Ubuntu下为QEMU建立一个arm平台的可用的根文件系统rootfs   【总结】 此处,已经可以正常运行,一个基于busybox的,从ram启动的rootfs了。 至此,算是基本可用了。 有空再折腾,如何从uboot启动内核,从nfs加载rootfs等等内容。 转载请注明:在路上 » 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs