ARM Linux 调试 -QEMU启动 Uboot/Kernel/Rootfs

懒人方式:

直接去方锐/qemu克隆项目,执行script目录的脚本即可

1. build_env.sh安装环境

2. build_rootfs.sh 生成rootfs

./build_rootfs.sh -b 先编译
./build_rootfs.sh -m 制作生成rootfs.ext3 和rootfs.img

3. build_kernel.sh编译kernel

./build_kernel.sh -m // make menuconfig 修改一下配置
./build_kernel.sh -d // 编译dts
./build_kernel.sh -k // 编译kernel

4. qemu_run.sh开始调试

./qemu_run.sh -r // 运行raw格式的rootfs
or 
./qemu_run.sh -f // 运行带文件系统的rootfs

1. 安装工具和依赖

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 make
sudo apt-get install gcc
sudo apt-get install flex
sudo apt-get install bison

sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11

#交叉编译链 安装
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

sudo apt-get install gcc-10-aarch64-linux-gnu
# 为方便使用可以软连接或者重命名aarch64-linux-gnu-gcc-10
mv /usr/bin/aarch64-linux-gnu-gcc-10 /usr/bin/aarch64-linux-gnu-gcc
sudo apt-get install gcc-arm-linux-gnueabi

2.rootfs的构建

2.1busybox代码的下载编译

Busybox下载地址:https://busybox.net/downloads/

Download 1.36.0

cd busybox
#arm-linux-gnueabi- 是arm32的交叉编译工具链
make menuconfig CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
或
export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-
export CROSS_COMPILE=aarch64-linux-gnu-
make menuconfig #设置Busybox Busybox Settings ---> Build Options ---> [ *]Build BusyBox as a static binary (no shared libs) make -j16 make install

Busybox 默认会安装到 ./_install 目录下

制作rootfs之前,确认下busybox的架构是不是arm架构,否则运行时会报错

$file busybox busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, stripped

2.2. rootfs的制作

拷贝生成的_install文件到rootfs下

cd busybox-1_36_0

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

echo "tmpfs: " $tmpfs
# 如果存在删除
sudo rm -rf rootfs
sudo rm -rf ${tmpfs}
sudo rm -f rootfs.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
sudo ln -s bin/busybox init
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 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/ttyAMA0 c 204 64
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo chmod 666 rootfs/dev/ttyAMA0
sudo chmod 666 rootfs/dev/console

#制作ext3格式的根文件系统,生成rootfs.ext3
sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=128
# 如果提示 "No space left on device" 证明 dd 命令中 count 的大小不够,可以先进行瘦身

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

#制作raw格式的最小根文件系统镜像,生成rootfs.img
cd rootfs
find . | cpio -o -H newc | gzip > ../rootfs.img
cd ${base}

3.uboot下载编译和QEMU启动

Uboot官方下载 :https://ftp.denx.de/pub/u-boot/ 或者用下面命令克隆uboot代码

git clone https://source.denx.de/u-boot/u-boot.git uboot代码的编译

3.1 QEMU ARM32 uboot

以Arm32 vexpress machine为例

cd uboot arm-linux-gnueabi- 是arm32的交叉编译工具链

make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make -j64 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
#u-boot QEMU启动
qemu-system-arm \
-M vexpress-a9 \
-cpu cortex-a9 \
-smp 1 \
-m 1G \
-kernel u-boot \
-nographic
3.2 QEMU ARM64 Uboot

以virt machine 为例,

export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu- 
make qemu_arm64_defconfig
make -j16 

QEMU启动

qemu-system-aarch64 \
-M virt \
-cpu cortex-a72 \
-smp 2 \
-m 2048M \
-kernel u-boot \
-nographic

直接加载uboot到内存启动,通过uboot命令加载kernel(命令行中将kernel img 带入)

-drive if=pflash,format=raw,index=1,file=flash.img

指向kernel img ,需转换boot认识的image

4. Linux Kernel代码下载和QEMU启动

Linux内核官网下载:https://mirrors.edge.kernel.org/pub/linux/kernel/

kerrnel版本5.14-rc5

4.1 ARM32的qemu kernel

arm-linux-gnueabi- 是arm32的交叉编译工具链

make menuconfig 编译kernel时需要选择rootfs中编译生成的文件路径,不然开机挂载rootfs时会出错 General setup --->

  [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support 
  (../busybox-1.36.1/rootfs) Initramfs source file(s) 
cd linux_kernel
make vexpress_defconfig CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
make bzImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 
make dtbs

qemu启动方式-raw格式

qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel ./zImage \
-dtb ./vexpress-v2p-ca9.dtb \
-append "console=ttyAMA0" \
-initrd rootfs.img \
-nographic

-initrd 后面需要是raw格式的img

qemu启动方式-filesystem方式

sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel ./zImage \
-dtb ./vexpress-v2p-ca9.dtb \
-append "root=/dev/mmcblk0 console=ttyAMA0" \
-sd rootfs.ext3 \
-nographic

-sd 后面的image需要是带文件系统格式的

4.2 ARM64的qemu kernel

cd linux_kernel

make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- Image -j32

qemu启动ARM64 kernel

qemu-system-aarch64 \
-machine virt,virtualization=true,gic-version=3 \
-m size=1024M \
-cpu cortex-a72 \
-smp 4 \
-kernel ./Image \
-initrd rootfs.img \
--append "console=ttyAMA0" \
-nographic

5. 制作QEMU+Uboot+kernel的SD镜像启动

#创建空的SD镜像 dd if=/dev/zero of=boot.disk bs=1M count=1024

#创建GPT分区,一个用来存放kernel和设备树,另一个存放根文件系统 sgdisk -n 0:0:+100M -c 0:kernel boot.disk sgdisk -n 0:0:0 -c 0:rootfs boot.disk

#查看分区 sgdisk -p boot.disk

#寻找一个空闲的loop设备 losetup -f

#将SD卡镜像映射到loop设备上 sudo losetup /dev/loop8 boot.disk sudo partprobe /dev/loop8

#格式化 sudo mkfs.ext4 /dev/loop8p1 sudo mkfs.ext4 /dev/loop8p2

#挂载 mkdir p1 mkdir p2 sudo mount -t ext4 /dev/loop8p1 p1/ sudo mount -t ext4 /dev/loop8p2 p2/

#拷贝文件并制作根文件系统 sudo cp ./zImage p1/ sudo cp ./vexpress-v2*.dtb p1/ sudo cp -raf ./_install/* ./p2

#创建4个tty设备(c代表字符设备,4是主设备号,1~4分别是次设备号) sudo mkdir -p p2/dev sudo mknod p2/dev/tty1 c 4 1 sudo mknod p2/dev/tty2 c 4 2 sudo mknod p2/dev/tty3 c 4 3 sudo mknod p2/dev/tty4 c 4 4

#创建终端和回收站 sudo mknod -m 666 p2/console c 5 1 sudo mknod -m 666 p2/null c 1 3

#卸载 sudo umount p1 p2 sudo losetup -d /dev/loop8

#启动uboot qemu-system-arm -M vexpress-a9 -m 1024M -smp 1 -nographic -kernel u-boot

#进入uboot命令行,切换mmc dev号 mmc dev 0

#从SD分区load zImage和dtb load mmc 0:1 0x60008000 zImage
load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb
或者 ext4load mmc 0:1 0x60008000 zImage ext4load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb

#设置内核启动参数 setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlycon console=tty0 console=ttyAMA0 init=/linuxrc ignore_loglevel' #启动内核 bootz 0x60008000 - 0x61000000

否可以实现一条qemu命令将uboot,kernel,rootfs 启动?

6.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:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。

apt-get install qemu qemu-system qemu-user

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值