写点什么

qemu 搭建 arm64 linux kernel 调试环境

作者:无人知晓
  • 2023-12-09
    广东
  • 本文字数:1493 字

    阅读完需:约 5 分钟

一、环境准备

ubuntu 22.04

内核源码:linux-6.6.1 (直接上最新版) 下载链接:The Linux Kernel Archives

交叉编译工具链

sudo apt-get install gcc-12-aarch64-linux-gnu

具体能用的版本 gcc-XX-arch64-linux-gnu 可以按对应的 ubuntu 发行版本查找,当前 22.04 能用的最新版本是 gcc-12;

或者可以到 arm 开发工具链上下载(自己下载的记得 PATH 变量中加一下路径)

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

比如我现在用的 gcc-13(不同的 gcc 版本支持的特性有差异,对编译结果优化也有差异):

qemu 版本安装

sudo apt-get install qemu-system-arm

还比较新

二、编译内核

解压 linux 内核后,先设置 config 文件:

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

CROSS_COMPILE 这里要注意一点,和交叉编译工具链名字有关,看一下你自己的 arm64 gcc 的前缀(如果是 apt install gcc-12-aarch64-linux-gnu 安装的,前缀可能是 aarch64-linux-gnu- )

上面使用的 defconfig 文件在目录 arch/arm64/configs/defconfig, 如果需要增减 kernel CONFIG 直接修改这个文件即可。

编译内核

make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- Image -j8

这里的生成物 Image 就是我们的 kernel image, vmlinux 是后面 gdb 调试使用的

编译 module(ko): //这里并不必要,后续增加 ko 时使用

make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules -j8

或者简洁点,导一个环境变量

export ARCH=arm64export CROSS_COMPILE=aarch64-none-linux-gnu-make defconfigmake all -j8

三、根文件系统制作

busybox 配置编译

选择 busybox, 比较便捷,下载链接:Index of /downloads

使用当前最新版本:busybox-1.36.1.tar.bz2

老套路:

export ARCH=arm64export CROSS_COMPILE=aarch64-none-linux-gnu-
复制代码

make menuconfig

Settings  ---> [*] Build static binary (no shared libs)    //静态编译[*] Build with debug information       //可选,带调试信息,方便后续调试
复制代码

make; make install

busybox 根目录下_install/ 就是根文件系统了

rootfs image 制作

构建 ext4 image

qemu-img create rootfs.img 512mmkfs.ext4 rootfs.img
复制代码

合并 busybox 到 img 中

挂载rootfs.img到rootfs目录mkdir rootfssudo mount rootfs.img rootfs
拷贝busybox的编译结果_install,同时创建关键目录(挂载虚拟文件系统需要)sudo cp -rf _install/* rootfssudo mkdir proc sys dev etc etc/init.dsudo vim etc/init.d/rcS
rcS中的内容,主要是挂载常使用的虚拟文件系统#!/bin/shmount -t proc none /procmount -t sysfs none /sysmount -t debugfs none /sys/kernel/debug
然后给rcS增加执行权限sudo chmod +x etc/init.d/rcS
最后umount rootfssudo umount rootfs


复制代码

四、qemu 启动 kernel

qemu 启动时也需要配置一个启动脚本加载 kernel 和 rootfs,前面使用的是 ext4 img 是为了后续做一些实验,保存结果,以及调试 ext4 时都可以使用,简单 mount img 然后往里面拷贝测试程序也比较方便

将前面编译生成的 Image (arch/arm64/boot/Image ; rootfs.img 拷贝到一个目录,创建一个 shell 脚本,记得增加可执行权限), 脚本内容如下

qemu-system-aarch64 \    -machine virt,virtualization=true,gic-version=3 \    -nographic \    -m size=1024M \    -cpu cortex-a72 \    -smp 2 \     -kernel Image \    -drive format=raw,file=rootfs.img \    -append "root=/dev/vda rw"
gic使用的是v3, 用的是arm64 A72 core (这里可以按自己需要去调整)
最后成功执行
复制代码


记录一下,虽然在不同的 pc 上搭建了很多次,有时也会犯重复错误

发布于: 21 分钟前阅读数: 7
用户头像

无人知晓

关注

记录我的linux学习和总结 2023-07-31 加入

知乎帐号《无人知晓》同步更新:

评论

发布
暂无评论
qemu搭建arm64 linux kernel调试环境_无人知晓_InfoQ写作社区