使用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目录
[待补充]