电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 589 人浏览分享

qemu虚拟化调试arm linux kernel启动流程

[复制链接]
589 0
前言

近日想研究一下arm架构下的linux kernel。文章记录了一下qemu虚拟化启动linux kernel与
linux kernel的交叉编译与动态调试。

0x1 qemu手动编译安装

安装ninja

apt install re2c
git clone https://github.com/ninja-build/ninja.git && cd ninja
./configure.py --bootstrap
sudo cp ninja /usr/bin/

依赖解决
sudo apt-get install libglib2.0-dev
sudo apt-get install libpixman-1-dev

编译安装qemu
wget https://download.qemu.org/qemu-7.1.0-rc2.tar.xz
tar -xf qemu-7.1.0-rc2.tar.xz
cd qemu-7.1.0-rc2
./configure
make -j8
编译后的产物在build文件夹

之后将build目录添加进 PATH

QQ截图20221014144218.png

手动编译的qemu相较于通过apt安装的qemu支持更多的虚拟化机器类型。Apt安装的qemu的版本相对较低很多。

0x2 linux Kernel编译

安装依赖

sudo apt install libncurses-dev
sudo apt install bison flex

linux kernel获取与编译

git clone https://github.com/torvalds/linux

切换指定分支后通过qemu配置生成 .config

make ARCH=arm vexpress_defconfig

编译内核

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all

QQ截图20221014144543.png

0x3 busybox文件系统制作

69999.png

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

设置生成静态可执行文件

Setting->Build Options->

69998.png

#busybox编译与安装
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install

rootfs镜像制作

#进入busybox编译目录的上级目录 建立目录结构
cd ../
mkdir rootfs
mkdir rootfs/proc rootfs/sys rootfs/dev rootfs/etc rootfs/tmp
cp -a ../busybox-1.35.0/examples/bootfloppy/etc/* rootfs/etc
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir -p tmpfs
sudo mount -o loop rootfs.ext3 tmpfs
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs

0x4 qemu-system-arm 启动Kernel

启动时需要添加一下 dtb

qemu-system-arm -M vexpress-a9 -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel arch/ar
m/boot/zImage -nographic -sd rootfs.ext3 -append "root=/dev/mmcblk0 console=ttyAMA0"

69996.png

0x5 qemu-system-arm 调试Kernel

qemu-system-arm -M vexpress-a9 -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel arch/arm
/boot/zImage -nographic -sd rootfs.ext3 -append "root=/dev/mmcblk0 console=ttyAMA0" -s -S
-gdb tcp::1234

由于是arm架构使用了gdb插件 gef

gef➤  set architecture arm
gef➤  file vmlinux
gef➤  target remote localhost:1234

由于qemu启动未挂载rootfs,故而gdb会停在mount过程

直接一个continue 一跑到底,看到了kernel启动过程的函数调用栈

19998.png

0x6 arm 架构的Kernel启动流程

依据gdb中的trace对每个函数进行定位。当前使用的是kernel源码中的arch/arm 架构

ret_from_fork

arch\arm\kernel\entry-common.S

19996.png

Gdb看到编译产物的汇编代码和源码中略有区别,直接向pc赋值跳转到Kernel_init

19993.png

Kernel_init

首先下个断点,然后重新开始qemu联调
gef➤ b kernel_init
gef➤ c

629.png

函数位置 init\main.c

628.png

直接进入kernel_init_freeable执行

Kernel_init_freeable

函数位置init\main.c

通过TRACE确认 之后要执行prepare_namespace

626.png

prepare_namespace

函数位置 init\do_mounts.c

依据逻辑校验判定,开始执行mount挂载目录

625.png

initrd_load

622.png

mount_root

Linux中的源码

619.png

挂载ext3 文件体统后,进入 ksys_chroot

618.png

616.png

之后跳转 load_default_elevator_module

校验 /dev/console

612.png

校验 ramdisk_execute_command 成功后 进行prepare_namespace
Ksys的挂载与chroot

611.png

测试初始化

610.png

终端的命令执行

最后定位到了 do_idle函数循环执行初始化任务,开启/bin/sh 并且执行linux命令

609.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.