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

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-787150.html

到了这里,关于ARM Linux 调试 -QEMU启动 Uboot/Kernel/Rootfs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VSCode+GDB+Qemu调试ARM64 linux内核

    俗话说,工欲善其事 必先利其器。linux kernel是一个非常复杂的系统,初学者会很难入门。 如果有一个方便的调试环境,学习效率至少能有5-10倍的提升。 为了学习linux内核,通常有这两个需要 可以摆脱硬件,方便的编译和运行linux 可以使用图形化的工具来调试linux 笔者使用

    2024年02月08日
    浏览(43)
  • 使用QEMU模拟启动uboot

    uboot的相关知识,可以参考:uboot基本概念。 WSL: ubutu20.04 模拟开发板:vexpress-a9 uboot版本:u-boot-2023.10 2.1、安装 2.2、查看支持哪些开发板 结果如下: 注:此步非必须,也可自己从Arm GNU Toolchain下载,解压后添加到环境变量即可。 4.1、解压 4.2、编译 4.3、生成的u-boot.bin文件

    2024年02月06日
    浏览(42)
  • ubuntu22上使用qemu-system-arm调试linux

    qemu是用软件模拟硬件解析指令运行的软件,可以模拟arm、arm64、x86等,对于调试linux 内核机制很方便,不用额外购买开发板。由于linux上有对qemu的加速引擎,支持程度更高,且网络上教程居多,所以这里使用virtualbox+ubuntu22虚拟机,在ubuntu上运行qemu进行模拟。 virtualbox安装:

    2024年01月25日
    浏览(46)
  • qemu-基础篇——arm 裸机调试环境搭建

    裸机篇系列文章主要用于熟悉 arm 汇编及处理器结构 本系列使用 mcimx6ul-evk mcimx6ul-evk 0x80000000-0xFFFFFFFF 2048MB 空间为 DDR 地址,所以将程序链接到 0x80000000 。 通过-Ttext 选项,可以指定链接地址 -s :监听在 gdb 1234 端口 -S :表示启动后就挂起,等待 gdb 连接 -kernel 指定启用的内核

    2024年01月21日
    浏览(39)
  • 使用QEMU(x86)模拟运行ARM64架构并进行内核调试

    在 x86 上使用 QEMU 虚拟机模拟并调试 ARM64。 参考:ubuntu虚拟机中使用QEMU搭建ARM64环境 主机 ubuntu 20.04, Linux 5.16.0 QEMU emulator version 7.2.92 (v8.0.0-rc2-23-gefcd0ec14b) :qemu-7.2.29 合适的ARM64内核源码:linux-4.14.221.tar.gz 安装交叉编译工具: sudo apt-get install gcc-aarch64-linux-gnu 命令安装以及源码

    2024年02月09日
    浏览(56)
  • Linux内核移植:内核的启动过程分析、启动配置与rootfs必要文件

     内核启动通常包括4个阶段: iROM代码启动(BIOS启动)。开发板上电后,先执行内部iROM中的固化代码,类似于BIOS,执行通电自检和初始化过程,包括初始化CPU、存储器、时钟、总线等一些必要的硬件资源。 启动引导加载程序BootLoader。根据启动引脚的电平,读取相应的存储

    2024年02月13日
    浏览(145)
  • uboot启动Linux内核卡住

    uboot启动Linux内核uImage卡在Starting kernel ...这一步 由于出现这种情况的原因有很多,暂时列举几种 查看uImage的信息 可以看见加载地址与入口地址为0xc2000040。由于uImage在头部添加了64个字节的识别信息,那么 加载地址是uboot在加载内核时的存放地址,入口地址是内核代码的开始

    2024年02月13日
    浏览(46)
  • Linux 之搭建 arm 的 qemu 模拟器

    2024年02月03日
    浏览(42)
  • Linux Kernel入门到精通系列讲解(QEMU-虚拟化篇) 2.2 新增加CPU外设之UART、中断控制器和pFLASH

    上一章节我们将 CPU 和部分 memory 已经初始化完成了,具体实现可以查看代码仓库,本章节我们将在上一章节的基础之上去增加 pFlash 设备(作为初始化完 ROM 后的第一个代码存储区)、中断控制器和 UART 设备。

    2024年04月25日
    浏览(38)
  • Linux Kernel入门到精通系列讲解(QEMU-虚拟化篇) 2.1 新增加一个RISC-V CPU(NARUTO-PI)

    上一章节我们讲解了开源的 QEMU 开发板怎么启动,从这章节开始,我们将会亲手去从无到有开发一个 CPU ,它包括 CPU Core , Memory Device , Communication Controller 和 Device 等等。 注意,本章节中调用的很多自定义宏都在 include/hw/riscv/naruto.h 文件,这里我就不展开说了,大家下载我

    2024年04月25日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包