Qemu模拟ARM开发板 仿真Linux

环境: ubuntu16.04
目标: 在ubuntu 上编译linux内核 并在qemu模拟的ARM开发板上运行

背景知识:
1.什么是ARM
ARM是一款微处理器的简称,从早期的ARM1系列发展到ARM11,ARM11以后的产品用Coretex命名。

2.宿主机(Host)与目标机(Target)
开发板由于硬件所限不能直接在本地建立起开发环境,需要在配置高的PC上开发完软件后再移植到开发板上运行。在这里,个人电脑就是Host,开发板就是Target.

3.交叉编译
交叉编译就是在一个平台上生成另一个平台的可执行代码。由于宿主机和目标机的平台不一样(平台包括体系结构,最直观的就是CPU不一样,一个是X86,一个是ARM,使用的汇编语言都不一样),不能使用宿主机的编译工具,而需要在宿主机安装目标机的编译工具链,来编译得到能够在目标机运行的可执行代码。
不同的CPU开发板、不同的Linux内核版本所使用的交叉编译工具都不一样。

4.文件系统
即文件的组织方式,不同的操作系统有不同的文件系统,linux的文件组织为一颗目录树,根为/

5.挂载文件系统
将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点

步骤:
1.下载Linux4.4.1内核代码,并解压
https://mirror.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.4.1.tar.xz

2.安装交叉编译工具
sudo apt-get install gcc-arm-linux-gnueabi

3.编译Linux内核
进入解压后的文件夹,执行以下指令进行编译
#在shell执行可执行文件时,export用于新增、删除、修改环境变量,供后续程序使用,export仅在该次登录操作有效
#ARCH 和 CROSS_COMPILE是makefile文件中预留的参数 需要给出
# CROSS_COMPILE指定了所使用的交叉编译工具 ARCH指定了目标处理器的架构 这里使用arm处理器
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi- 
#添加完环境变量后开始编译(源码中已经写好了makefile文件)make后面的参数是目标名 从而不会执行整个配置文件 而是指定部分
make vexpress_defconfig  
make zImage -j8  
make modules -j8  
make dtbs 

编译完成 将生成的zImagle(内核镜像)和dtbs文件复制一份到一个单独的文件夹中
mkdir extra_folder  
cp arch/arm/boot/zImage extra_folder/  
cp arch/arm/boot/dts/*ca9.dtb extra_folder/  
cp .config  extra_folder/

4.安装qemu模拟器
sudo apt-get install qemu

5.制作根文件系统
根文件系统由基本的运行命令、库和字符设备构成。
基本的运行命令需要使用Busybox,这个库也需要进行交叉编译,因此可以运行下面的指令进行源代码下载。
wget  http://www.busybox.net/downloads/busybox-1.25.1.tar.bz2

解压源码 在源码目录下编译源码
make defconfig  
make CROSS_COMPILE=arm-linux-gnueabi-  
make install CROSS_COMPILE=arm-linux-gnueabi-  

编译完成后,在该目录下生成的_install文件夹便是基本的运行命令

创建根目录 rootfs 以及基本目录结构 -p表示当父目录不存在时,创建父目录
sudo mkdir rootfs
sudo mkdir rootfs/lib/
sudo mkdir -p rootfs/proc/sudo mkdir -p rootfs/sys/sudo mkdir -p rootfs/tmp/sudo mkdir -p rootfs/root/sudo mkdir -p rootfs/var/sudo mkdir -p rootfs/mnt/
sudo mkdir -p rootfs/dev/

#etc为启动时的配置文件
#下载方式1: http://files.cnblogs.com/files/pengdonglin137/etc.tar.gz
#下载方式2: https://github.com/mahadevvinay/Embedded_Linux_Fil
sudo cp etc rootfs/ -arf

#从交叉编译工具中拷贝运行库到
sudo cp -arf /usr/arm-linux-gnueabi/lib/* rootfs/lib/
sudo rm rootfs/lib/*.a
sudo arm-linux-gnueabi-strip rootfs/lib/*
#创建tty终端设备
sudo mknod rootfs/dev/tty1 c 4 1sudo mknod rootfs/dev/tty2 c 4 2sudo mknod rootfs/dev/tty3 c 4 3sudo mknod rootfs/dev/tty4 c 4 4sudo mknod rootfs/dev/console c 5 1sudo mknod rootfs/dev/null c 1 3

生成镜像
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
格式化生成ext3文件系统mkfs.ext3 a9rootfs.ext3

将文件拷贝到镜像
sudo mkdir tmpfs  
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop  
sudo cp -r rootfs/*  tmpfs/  
sudo umount tmpfs  

6.启动qemu模拟器(图形化界面)
qemu-system-arm \ -M vexpress-a9 \ -serial stdio \ -m 512M \
-dtb linux-4.4.1/extra_folder/vexpress-v2p-ca9.dtb \ -kernel linux-4.4.1/extra_folder/zImage \ -append "root=/dev/mmcblk0 console=ttyAMA0 console=tty0" \ -sd a9rootfs.ext3

参数说明:
qemu-system-arm : ARM结构仿真
-M vexpress-a9 :模拟vexpress-a9开发板
-m 512M : 单板运行物理内存为512M
-dtb : Use file as a device tree binary (dtb) image and pass it to the kernel on  boot
-kernel 告诉qemu单板运行时内核镜像的位置
-append "console=ttyAMA0" 内核启动参数,这里告诉内核vexpress单板运行,串口设备是那个tty

你可能感兴趣的:(Linux)