Qemu仿真开发板

发布时间 2023-03-25 16:47:36作者: this毛豆

使用Qemu仿真开发板,挂在网络内核和根文件系统。
平台:ubuntu 16.04
对象:Qemu仿真ARM32.
文件:linux-4.4.300.tar.xz、busybox-1.27.1.tar.bz2、u-boot-2017.05.tar.bz2

1.安装依赖

$ sudo apt install libc6-dev bison flex bc gawk texinfo git unzip build-essential vim tree curl wget ssh libncurses5-dev diffutils
$ sudo apt install u-boot-tools
$ sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
$ sudo apt install qemu-system-arm

我们查看qemu支持的开发板

$ ./qemu-system-arm -M help

2.下载资源

2.1 kernel
[https://kernel.org/]

[http://mirrors.ustc.edu.cn/kernel.org/linux/kernel/]

2.2 busybox
[https://busybox.net/downloads/]

2.3 u-boot
[https://ftp.denx.de/pub/u-boot/]

3.编译内核

3.1 解压文件

$ tar -xvf linux-4.4.300.tar.xz
$ cd linux-4.4.300

3.2 修改Makefile

@@ -254,8 +254,10 @@ SUBARCH := $(shell uname -m | sed -e s/i
 # "make" in the configured kernel build directory always uses that.
 # Default value for CROSS_COMPILE is not to prefix executables
 # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
-ARCH           ?= $(SUBARCH)
-CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+# ARCH         ?= $(SUBARCH)
+# CROSS_COMPILE        ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+ARCH           ?= arm
+CROSS_COMPILE  ?= arm-linux-gnueabi-

 # Architecture as present in compile.h
 UTS_MACHINE    := $(ARCH)

3.3 编译

$ make vexpress_defconfig
$ make -j4
$ make LOADADDR=0x60003000 uImage

4.制作根文件系统

4.1 创建rootfs文件夹

$ mkdir rootfs

4.2 解压busybox

$ tar -xvf busybox-1.27.1.tar.bz2
$ cd busybox-1.27.1

4.3 修改Makefile

@@ -161,7 +161,8 @@ export srctree objtree VPATH TOPDIR
 # Default value for CROSS_COMPILE is not to prefix executables
 # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile

-CROSS_COMPILE ?=
+# CROSS_COMPILE ?=
+CROSS_COMPILE ?= arm-linux-gnueabi-
 # bbox: we may have CONFIG_CROSS_COMPILER_PREFIX in .config,
 # and it has not been included yet... thus using an awkward syntax.
 ifeq ($(CROSS_COMPILE),)
@@ -187,7 +188,8 @@ SUBARCH := $(shell echo $(SUBARCH) | sed
                                         -e s/s390x/s390/ -e s/parisc64/parisc/ \
                                         -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )

-ARCH ?= $(SUBARCH)
+# ARCH ?= $(SUBARCH)
+ARCH ?= arm

 # Architecture as present in compile.h
 UTS_MACHINE := $(ARCH)

4.4 编译busybox

$ make defconfig 
$ make menuconfig

做如下修改:

// 勾选编译静态库
Busybox Settings  --->
    [*] Build static binary (no shared libs)

编译

$ make -j4
$ make install

4.5 创建根文件系统

$ cp -rf busybox-1.27.1/_install/* ./rootfs
$ cd ./rootfs/
$ mkdir lib proc tmp dev home etc sys opt
$ mkdir -p etc/init.d

4.6 安装modules

$ cd linux-4.4.300
$ make modules_install INSTALL_MOD_PATH=../rootfs

4.7 添加rcS

$ cd rootfs/etc/init.d
$ touch rcS
$ sudo chmod a+x rcS
$ vim rcS

添加如下内容:

 1 #!/bin/sh
 2 
 3 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 4 runlevel=S
 5 prevlevel=N
 6 umask 022
 7 export PATH runlevel prevlevel
 8 # 挂载fstab文件中所有指定的文件系统
 9 /bin/mount -a
10 echo /sbin/mdev>/proc/sys/kernel/hotplug
11 # 在/dev目录下建立必须的设备节点
12 mdev -s
13 # 设置主机的名字
14 /bin/hostname -F /etc/sysconfig/HOSTNAME

4.8 添加inittab

rootfs/etc/inittab

添加如下内容:

1 # 设置内核的热插拔,有mdev接收来自内核的消息并做出响应
2 ::sysinit:/etc/init.d/rcS
3 # 在串口启动一个登录会话
4 ::askfirst:-/bin/sh
5 # 作为init重启执行程序
6 ::ctrlaltdel:/sbin/reboot
7 ::restart:/sbin/init
8 # 告诉init在关机时运行umount命令卸载所有文件系统,如果卸载失败,以只读方式重新挂载
9 ::showdown:/bin/mount

4.9 添加fstab

rootfs/etc/fstab

添加如下内容(注意间隔符为Tab):

1 proc    /proc    proc    defaults    0    0
2 sysfs    /sys    sysfs    defaults    0    0
3 tmpfs    /tmp    tmpfs    defaults    0    0

4.10 添加profile

rootfs/etc/profile

添加如下内容:

1 #!/bin/sh
2 
3 USER="id -un"
4 LOGNAME=$USER
5 PS1='[root@linux]#'
6 PATH=$PATH
7 HOSTNAME='/bin/hostname'
8 export USER LOGNAME PS1 PATH

4.11 复制动态库

之前有安装gcc-arm-linux-gnueabi,我们把它的库复制到根文件系统。

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

4.12 创建设备节点

$ cd rootfs/dev/
$ sudo mknod -m 664 tty1 c 4 1
$ sudo mknod -m 664 tty2 c 4 2
$ sudo mknod -m 664 tty3 c 4 3
$ sudo mknod -m 664 tty4 c 4 4
$ sudo mknod -m 664 console c 5 1
$ sudo mknod -m 664 null c 1 3

4.13 打包文件系统

$ dd if=/dev/zero of=rootfs.ext4 bs=1M count=32
$ mkfs.ext4 rootfs.ext4
$ sudo mount rootfs.ext4 /mnt/ -o loop
$ sudo cp -rf rootfs/* /mnt/
$ sudo umount /mnt/

5. 测试系统

编写启动脚本:

$ touch boot.sh
$ chmod a+x boot.sh

添加如下内容:

 1 #!/bin/sh
 2 
 3 qemu-system-arm \
 4         -M vexpress-a9 \
 5         -m 512M \
 6         -kernel linux-4.4.300/arch/arm/boot/zImage \
 7         -dtb linux-4.4.300/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
 8         -nographic \
 9         -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
10         -sd rootfs.ext4

执行,如果上面步骤顺利,执行此脚本就可以正常进入系统了。

6.编译bootloader

$ tar -xvf u-boot-2017.05.tar.bz2

6.1 修改Makefile

@@ -246,6 +246,8 @@ ifeq ($(HOSTARCH),$(ARCH))
 CROSS_COMPILE ?=
 endif

+CROSS_COMPILE ?= arm-linux-gnueabi-
+
 KCONFIG_CONFIG ?= .config
 export KCONFIG_CONFIG

6.2 修改config.mk

@@ -22,7 +22,8 @@ OBJCOPYFLAGS :=
 VENDOR :=
 #########################################################################

-ARCH := $(CONFIG_SYS_ARCH:"%"=%)
+# ARCH := $(CONFIG_SYS_ARCH:"%"=%)
+ARCH := arm
 CPU := $(CONFIG_SYS_CPU:"%"=%)
 ifdef CONFIG_SPL_BUILD
 ifdef CONFIG_TEGRA

6.3 修改vexpress_common.h

u-boot-2017.05/include/configs/vexpress_common.h

做如下修改(注意IP要改为实际值):

@@ -183,9 +183,21 @@
 #include <config_distro_defaults.h>

 /* Basic environment settings */
+/*
 #define CONFIG_BOOTCOMMAND \
        "run distro_bootcmd; " \
        "run bootflash; "
+*/
+
+#define CONFIG_BOOTCOMMAND \
+       "tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
+       setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0';\
+       bootm 0x60003000 - 0x60500000; "
+
+#define CONFIG_IPADDR 192.168.103.99
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_SERVERIP 192.168.103.78
+

 #define BOOT_TARGET_DEVICES(func) \
         func(MMC, mmc, 1) \

6.4 配置defconfig

$ make vexpress_ca9x4_defconfig

6.5 编译

$ make -j4

7. 网络配置

7.1 配置tftp

1).安装工具

$ sudo apt install tftp-hpa tftpd-hpa xinetd

2).修改配置文件(Host)

/etc/default/tftpd-hpa

添加如下内容(注意第二行路径改为实际值):

1 TFTP_USERNAME="tftp"
2 TFTP_DIRECTORY="/home/qemulinux/tftpboot"
3 TFTP_ADDRESS="0.0.0.0:69"
4 TFTP_OPTIONS="-l -c -s"

3).创建tftp目录

[待补充]