从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真

文章目录

    • 从0开始使用QEMU模拟ARM开发环境系列一览表
    • 开发环境:
      • 文章使用的资源:
      • 可能需要安装的库:
      • 交叉编译链安装:
    • QEMU 安装
    • 编译 Uboot 并仿真
      • 编译uboot
      • 仿真uboot
    • 编译内核并仿真
      • 编译内核
      • 仿真内核
    • 基于 busybox 制作rootfs并仿真
      • 编译以及制作
      • 为交叉编译工具链瘦身
      • 仿真rootfs

从0开始使用QEMU模拟ARM开发环境系列一览表

从0开始使用QEMU模拟ARM开发环境系列一览表

开发环境:

Ubuntu 16.04
qemu 5.0.0
gcc-linaro-6.5.0

文章使用的资源:

包含:
qemu-5.0.0、u-boot 源码、linux-5.4.95内核、gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf交叉编译链、busybox-1.32.1 工具

资源链接 https://download.csdn.net/download/leacock1991/15089504

可能需要安装的库:

如果后续有提示缺少库可根据需要安装

sudo apt-get install build-essential pkg-config zlib1g-dev libglib2.0-0 libglib2.0-dev  libsdl1.2-dev libpixman-1-dev libfdt-dev autoconf automake libtool librbd-dev libaio-dev flex bison -y

交叉编译链安装:

#交叉编译链 安装
sudo apt-get install gcc-arm-linux-gnueabihf
sudo apt-get install g++-arm-linux-gnueabihf
#交叉编译链 卸载
sudo apt-get remove gcc-arm-linux-gnueabihf
sudo apt-get remove g++-arm-linux-gnueabihf

如果后面报GCC版本低了可从下面链接下载

https://releases.linaro.org/components/toolchain/binaries/

拷贝 gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz 到 /opt/下 ,并解压重名为 arm-linux-gcc 主要为了简化路径

sudo tar xvf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz

sudo mv gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf arm-linux-gcc

添加路径到 /etc/profile

sudo gedit /etc/profile

在 profile 最后加入

export PATH=/opt/arm-linux-gcc/bin:$PATH

然后

source /etc/profile

输入 arm- 并 tab 测试是否安装成功

QEMU 安装

链接https://download.qemu.org/ 下载QEMU( 我这边下载的 qemu-5.0.0.tar.xz)

解压并编译安装

tar xf qemu-5.0.0.tar.xz
cd qemu-5.0.0
./configure --prefix=/usr/local/qemu --target-list=arm-softmmu --audio-drv-list=
sudo make && sudo make install
sudo ln -s /usr/local/qemu/bin/* /usr/local/bin/
# --target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。

测试

qemu-img -V

输出:

qemu-img version 5.0.0
Copyright © 2003-2020 Fabrice Bellard and the QEMU Project developers

查看 QEMU 支持的板子

qemu-system-arm -M help

编译 Uboot 并仿真

编译uboot

下载链接 https://gitlab.denx.de/u-boot/u-boot 可以直接下载master分支,解压并进入其根目录编译

sudo make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

CROSS_COMPILE=arm-linux-gnueabihf- : 为使用的交叉编译工具链

vexpress_ca9x4_defconfig:可以 通过 ls ./configs/ 查看

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make clean && make vexpress_ca9x4_defconfig # 不需要改配置
make -j6

仿真uboot

sudo qemu-system-arm -M vexpress-a9 -m 256 -kernel ./u-boot -nographic
# -nographic 不使用图形化界面,仅仅使用串口

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第1张图片

输入ctrl + A 后按 X退出 QEMU

编译内核并仿真

编译内核

下载链接 https://www.kernel.org/ 我这边下载的是 linux-5.4.95, 解压并进入其根目录编译。

/arch/arm/configs 目录里的是各个厂商的内核配置文件

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第2张图片

在 linux-5.4.95 根目录编译 执行

make vexpress_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
# 将内核编译时需要的配置文件写入内核了

注意 vexpress_defconfig 中设置了 CONFIG_CMDLINE="console=ttyAMA0"
从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第3张图片

可以输入 make menuconfig 对进行详细的配置,如有错,一般是缺少lib可根据提示安装

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第4张图片

确保内核支持nfs功能:

File systems – > Network File systems

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第5张图片

在 linux-5.4.95 根目录编译 执行

make -j6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
# 编译内核

仿真内核

sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"
# -dtb  指定设备树,否则会失败
# -append "console=ttyAMA0" 内核启动參数。这里告诉内核vexpress单板执行。串口设备是哪个tty。

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第6张图片

基于 busybox 制作rootfs并仿真

busybox 下载链接 https://busybox.net/ 解压并进入其根目录

编译以及制作

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make defconfig 
make menuconfig
#   勾选  Settings-> [*] Build static binary (no shared libs) 
make -j6
make install

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第7张图片

通过 make install 命令把生成的根文件创建在顶层目录(busybox-1.32.1根目录) _install 下,如果是通过 make defconfig O=…/output 导出配置的,则在相应的output目录下进入 _install 目录

在busybox-1.32.1根目录创建文件 make_rootfs.sh

#    File Name:  make_rootfs.sh
##
#!/bin/sh
base=`pwd`
tmpfs=/_tmpfs

# 如果存在删除
sudo rm -rf rootfs
sudo rm -rf ${tmpfs}
sudo rm -f a9rootfs.ext3

sudo mkdir rootfs
# 拷贝 _install 中文件 到 rootfs
sudo cp _install/*  rootfs/ -raf

#sudo mkdir -p rootfs/{lib,proc,sys,tmp,root,var,mnt}
cd rootfs && sudo mkdir -p lib proc sys tmp root var mnt && cd ${base}

# 根据自己的实际情况, 找到并 拷贝 arm-gcc 中的 libc中的所有.so 库
sudo cp -arf /opt/arm-linux-gcc/arm-linux-gnueabihf/lib/*  rootfs/lib

sudo cp examples/bootfloppy/etc rootfs/ -arf
sudo sed -r  "/askfirst/ s/.*/::respawn:-\/bin\/sh/" rootfs/etc/inittab -i
sudo mkdir -p rootfs/dev/
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2pro
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=100
# 如果提示 "No space left on device" 证明 dd 命令中 count 的大小不够,可以先进行瘦身

sudo mkfs.ext3 a9rootfs.ext3
sudo mkdir -p ${tmpfs}
sudo chmod 777 ${tmpfs}
sudo mount -t ext3 a9rootfs.ext3 ${tmpfs}/ -o loop
sudo cp -r rootfs/*  ${tmpfs}/
sudo umount ${tmpfs}

为交叉编译工具链瘦身

sudo arm-linux-gnueabihf-strip ./*   # 进入 rootfs/lib 中
du -h ./
输出
4.9M	./

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第8张图片

仿真rootfs

拷贝 a9rootfs.ext3 文件 到 之前 内核 linux-5.4.95 根目录中 ,并在 其中打开终端输入下面命令进行仿真

qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd ./a9rootfs.ext3
# 同样地,只要是 仿真kernle 就需要 指定设备树

从0开始使用QEMU模拟ARM开发环境之编译 uboot、Linux 内核和 busybox 制作 rootfs 并仿真_第9张图片

希望我的文章对于大家有帮助,由于个人能力的局限性,文中可能存在一些问题,欢迎指正、补充!

你可能感兴趣的:(Linux相关,u-boot,busybox,qemu,gcc-linaro,arm,linux)