YanZhirun's Blog

使用qemu模拟器搭建arm运行环境

环境

  • Vmware 12.5.1
  • Ubuntu 16.04 64位
  • Linux 3.16.1 (高版本无法启动qemu)
  • Busybox 1.20.2
  • u-boot-2016.09.tar.bz2

参考资料

整体流程说明

  1. 安装交叉编译工具链
  2. 安装qemu模拟器
  3. 编译arm架构u-boot
  4. 用u-boot测试qemu是否正常启动(至此为第一次实验需要完成的内容)
  5. 编译arm架构内核
  6. Qemu运行内核
  7. 制作文件系统
  8. 系统启动运行

注意事项

  • 实验中需要工具,如 git、 vim(系统自带vim是精简版,对键盘识别有问题)等,请自行下载安装、更新
  • 对于实验中遇到的问题请复制相关提示信息,google
  • 注意执行完指令后终端给出的提示,请确认命令是否正确执行。
  • 请使用实验提供的正确版本
  • 确认输入命令是否正确,请使用tab键补全,不要直接复制粘贴
  • 请选择网易源、清华源、阿里源(科大源近期故障)
  • vmware虚拟机安装vmware tool (不要卸载光驱、软驱,屏幕自适应)

一、 安装交叉编译工具链下载必备库

1. 创建工作目录

$ mkdir ~/qemu_linux

$ cd ~/qemu_linux

2. 安装arm交叉编译工具(可以通过crosstool-ng开源软件构建,本方法直接通过apt下载)

$ sudo apt-get install gcc-arm-linux-gnueabi

3. 安装qemu模拟器

  • 下载源码(自行安装配置 _git_

    $ git clone git://git.qemu-project.org/qemu.git

    $ cd qemu

  • 检出分支

    $ git checkout remotes/origin/stable-2.4 -b stable-2.4

  • 换源

    选择 网易、 阿里、 清华、 科大源

    $ sudo apt-get update

  • 编译前安装依赖库

    遇到无法apt安装软件 缺少依赖库,或者循环依赖,先看提示解决方法,或者尝试 $sudo apt-get upgrade

    $ sudo apt-get install build-essential kernel-package libncurses5-dev

    $ sudo apt-get install libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev

    build-essential (基本的编程库(gcc, make等)

    kernel-package (Debian 系统里生成 kernel-image 的一些配置文件和工具)

    libncurses5-dev (meke menuconfig要调用的)

    _(若出错,请尝试分开安装,可先跳过该步骤遇到需要再根据提示安装)_

    其他可能需要的库,参考官网: http://wiki.qemu.org/Hosts/Linux

二、 安装qemu模拟器

1. 编译安装

$ mkdir build (当前路径为 ~/qemu_linux )

$ cd build

2. 将配置生成的中间文件放到build中

$ ../qemu/configure –target-list=arm-softmmu –audio-drv-list=

$ make

$ make install //(该步骤需要根据机器情况安装相应的依赖库)

直接安装也可(简单粗暴)

$ sudo apt-get install qemu

3. 安装完成查看qemu支持哪些板子

$ qemu-system-arm –M ?

三、 编译u-boot

1. 下载u-boot

$ cd ~/qemu_linux
$ wget ftp://ftp.denx.de/pub/u-boot/u-boot-2016.09.tar.bz2

2. 解压

$ tar jxvf u-boot-2016.09.tar.bz2

$ cd u-boot-2016.09

3. 配置、编译

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_ca9x4_defconfig

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

4. qemu中u-boot启动

$ qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 128M

四、 编译arm架构内核

1. 下载内核

$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.1.tar.gz

2. 解压

$ tar zcvf linux-3.16.1.tar.gz

$ cd linux-3.16.1

4. 生成vexpress-a9 的config文件 (建议先执行make clean && make mrproper

$ make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm O=./out_vexpress_3_16 vexpress_defconfig

5. 执行内核配置

$ make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm O=./out_vexpress_3_16 menuconfig

选项位于:
System Type —>[] Enable the L2x0 outer cache controller

[kernel_menuconfig]

取消该项 其他保持默认不变

6. 编译

$ make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm O=./out_vexpress_3_16 zImage -j2

生成的内核镱像位于./out_vexpress_3_16/arch/arm/boot/zImage

7. 测试qemu 能否正常启动

$ cp ./out_vexpress_3_16/arch/arm/boot/zImage ~/qemu_linux

$ cd ~/qemu_linux

$ qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/ivan/kernel_git/linux/arch/arm/boot/zImage -nographic -append “console=ttyAMA0”

[kernel_panic]

出现kernel panic
问题在于需要挂载文件系统

五、 制作文件系统

(一)形成根目录结构

1. 下载busybox

$ wget https://busybox.net/downloads/busybox-1.20.2.tar.bz2

$ make defconfig

$ make CROSS_COMPILE=arm-linux-gnueabi-

$ make install

安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录

2. 创建rootfs目录(根目录),根文件系统内的文件全部放到这里

$ sudo mkdir rootfs

3. 拷贝busybox命令到根目录下

$ sudo cp busybox-1.20.2/_install/* -r rootfs/

4. 从工具链中拷贝运行库到lib目录下

$ sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

5. 创建4个tty端终设备

$ sudo mknod rootfs/dev/tty1 c 4 1

$ sudo mknod rootfs/dev/tty2 c 4 2

$ sudo mknod rootfs/dev/tty3 c 4 3

$ sudo mknod rootfs/dev/tty4 c 4 4

(二)制作根文件系统镜像

1. 生成32M大小的镜像

$ dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

2. 格式化成ext3文件系统

$ mkfs.ext3 a9rootfs.ext3

3. 将文件拷贝到镜像中

$ sudo mkdir tmpfs

$ sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

$ cp rootfs/* tmpfs/ -r

$ sudo umount tmpfs

六、 系统启动运行

完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:

$ qemu-system-arm -M vexpress-a9 -m 512M -kernel /the/path/to/your/kernel/dir/arch/arm/boot/zImage -nographic -append “root=/dev/mmcblk0 console=ttyAMA0” -sd a9rootfs.ext3

[kernel_start]