quem+gdb+rootfs+arm64_kernel

本文详细介绍了如何在x86系统上搭建aarch64的QEMU模拟环境,包括安装编译工具链,编译BusyBox文件系统,下载并配置Linux内核,创建根文件系统,以及使用GDB进行内核调试。此外,还提到了使用debootstrap创建基于Debian的arm64根文件系统的方法。
摘要由CSDN通过智能技术生成

quem+gdb+rootfs+arm64_kernel

安装编译环境

sudo apt install qemu libncurses5-dev gcc-aarch64-linux-gnu build-essential bison flex libssl-dev qemu-system-arm

aarch64-linux-gnu-gcc -v

查看gcc版本

Using built-in specs.

COLLECT_GCC=aarch64-linux-gnu-gcc

COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/11/lto-wrapper

Target: aarch64-linux-gnu

Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.3.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --without-target-system-zlib --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include --with-build-config=bootstrap-lto-lean --enable-link-serialization=2

Thread model: posix

Supported LTO compression algorithms: zlib zstd

gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)

qemu-system-arm --version

查看qemu版本

QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.6)

Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

busybox

https://busybox.net/downloads/
wget  https://busybox.net/downloads/busybox-1.33.1.tar.bz2
tar -xvf  busybox-1.33.1.tar.bz2

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-       
make menuconfig

Settings --->

 [*] Build static binary (no shared libs)  

make
make install

编译完成,在busybox目录下生成_install目录

定制文件系统

根目录添加etc、dev和lib目录

/home/test/busybox/busybox-1.33.1/_install

mkdir etc dev lib

ls

bin dev etc lib linuxrc sbin usr

etc目录
cd etc

/home/test/busybox/busybox-1.33.1/_install/etc

cat fstab

#device mount-point type options dump fsck order

proc /proc proc defaults 0 0

tmpfs /tmp tmpfs defaults 0 0

sysfs /sys sysfs defaults 0 0

tmpfs /dev tmpfs defaults 0 0

debugfs /sys/kernel/debug debugfs defaults 0 0

kmod_mount /mnt 9p trans=virtio 0 0

cat inittab

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

cat init.d/rcS

kdir -p /sys

mkdir -p /tmp

mkdir -p /proc

mkdir -p /mnt

/bin/mount -a

mkdir -p /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

ls -lh init.d/rcS

在这里插入图片描述

dev目录

/home/test/busybox/busybox-1.33.1/_install/dev

sudo mknod console c 5 1

sudo mknod null c 1 3

lib目录:拷贝lib库,支持动态编译的应用程序运行

cp -r /usr/aarch64-linux-gnu/lib/.so ./

/home/test/linux-5.10.9/linux-5.10.9/_install/lib

ld-linux-aarch64.so.1 libBrokenLocale.so.1 libgomp.so.1.0.0 libm.so libnss_hesiod.so.2 libthread_db.so

libanl.so libc_malloc_debug.so libhwasan.so.0 libm.so.6 libpcprofile.so libthread_db.so.1

libanl.so.1 libc_malloc_debug.so.0 libhwasan.so.0.0.0 libnsl.so.1 libpthread.so.0 libtsan.so.0

libasan.so.6 libc.so libitm.so.1 libnss_compat.so libresolv.so libtsan.so.0.0.0

libasan.so.6.0.0 libc.so.6 libitm.so.1.0.0 libnss_compat.so.2 libresolv.so.2 libubsan.so.1

libatomic.so.1 libdl.so.2 liblsan.so.0 libnss_dns.so.2 librt.so.1 libubsan.so.1.0.0

libatomic.so.1.2.0 libgcc_s.so.1 liblsan.so.0.0.0 libnss_files.so.2 libstdc++.so.6 libutil.so.1

libBrokenLocale.so libgomp.so.1 libmemusage.so libnss_hesiod.so libstdc++.so.6.0.30

下载内核

官网下载

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/

git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git

国内源

http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/

sudo cp -r …/…/busybox/busybox-1.33.1/_install/ ./

cp arch/arm/configs/vexpress_defconfig .config

make menuconfig

CONFIG_INITRAMFS_SOURCE=_install
CONFIG_DEBUG_FS=y

make -j8 Image

linux kernel build error

https://blog.csdn.net/RJ436/article/details/126645641

在内核根目录下添加共享目录

mkdir kmodules

启动

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -m 1024 -smp 4 -kernel arch/arm64/boot/Image --append “rdinit=/linuxrc root=/dev/vda rw console=ttyAMA0 loglevel=8” -nographic --fsdev local,id=kmod_dev,path=$PWD/kmodules,security_model=none -device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount

-cpu指定模拟的cpu为 cortex-a57,

-m 1024 指定内存大小为1G,

-smp4指定模拟的系统为4核处理器 ,

-kernel指定启动的内核镜像,

–append指定传递的命令行参数,

后面的选项指定共享目录已经使用的9P协议。

使用虚拟磁盘

dd if=/dev/zero of=rootfs_ext4.img bs=1M count=1024

mkfs.ext4 rootfs_ext4.img

mkdir -p tmpfs

sudo mount -t ext4 rootfs_ext4.img tmpfs/ -o loop

sudo cp -af _install_arm64/* tmpfs/

sudo umount tmpfs

chmod 777 rootfs_ext4.img

rootfs_ext4.img就是即将用来挂载的磁盘;

再次启动内核:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -m 1024 -smp 4 -kernel arch/arm64/boot/Image --append “noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8” -nographic -drive if=none,file=rootfs_ext4.img,id=hd0 -device virtio-blk-device,drive=hd0 --fsdev local,id=kmod_dev,path=$PWD/kmodules,security_model=none -device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount

使用debian_defconfig

共享文件

前面已经支持了主机和qemu上的系统共享目录,这个目录就是kmodules目录:

通过mount可以查看被挂载到了qemu上的系统的/mnt目录下

[root@myQEMU mnt]# mount

/dev/root on / type ext4 (rw,relatime)

proc on /proc type proc (rw,relatime)

tmpfs on /tmp type tmpfs (rw,relatime)

sysfs on /sys type sysfs (rw,relatime)

tmpfs on /dev type tmpfs (rw,relatime)

kmod_mount on /mnt type 9p (rw,sync,dirsync,relatime,access=client,trans=virtio)

devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)

Makefile

KERNELDIR := /home/test/linux-5.10.9/linux-5.10.9

CURRENT_PATH := $(shell pwd)

obj-m := module_test.o

build: kernel_modules

kernel_modules:

$(MAKE) -C ( K E R N E L D I R ) M = (KERNELDIR) M= (KERNELDIR)M=(CURRENT_PATH) modules

clean:

$(MAKE) -C ( K E R N E L D I R ) M = (KERNELDIR) M= (KERNELDIR)M=(CURRENT_PATH) clean

gdb调试

qemu模拟端启动内核:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -m 1024 -smp 4 -kernel arch/arm64/boot/Image --append “rdinit=/linuxrc root=/dev/vda rw console=ttyAMA0 loglevel=8” -nographic --fsdev local,id=kmod_dev,path=$PWD/k_shared,security_model=none -device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount -S -s

gdb-multiarch vmlinux

(gdb)target remote localhost:1234 //通过1234端口远程连接到qemu端

(gdb)b start_kernel //在内核的start_kernel设置断点

(gdb)c

使用debootstrap

安装 debootstrap 工具

sudo apt-get install binfmt-support qemu qemu-user-static debootstrap

使用 debootstrap 制作根文件系统

mkdir -p myrootfs_arm64

sudo debootstrap --arch=arm64 --foreign buster myrootfs_arm64/

http://mirrors.ustc.edu.cn/debian/

–arch:指定要制作文件系统的处理器体系结构,比如 arm64

buster:指定 Debian 的版本。buster 是 Debian 10 系统。

myrootfs_arm64:本地目录,最后制作好的文件系统会在此目录

–foreign: 只执行引导的初始解包阶段,仅仅下载和解压。

http://mirrors.ustc.edu.cn/debian/: 国内 debian 镜像源地址

因为主机跑在 x86 架构上,而我们要制作的文件系统是跑在 ARM64 上,因此可

以使用 qemu-aarch64-static 来模拟成 arm64 环境的执行环境。

cp /usr/bin/qemu-aarch64-static myrootfs_arm64/usr/bin/

下面使用 debootstrap 命令进行软件包的安装和配置。

chroot myrootfs_arm64/ debootstrap/debootstrap --second-stage

使用 chroot 命令切换到刚才制作的根文件系统。

chroot myrootfs_arm64

设置密码,登陆后

安装 net-tools 工具

apt update

apt install net-tools

配置网卡支持 DHCP 协议。修改/etc/network/interfaces 文件,增加如下内容

auto lo

iface lo inet loopback

allow-hotplug enp0s1

iface enp0s1 inet dhcp

dd if=/dev/zero of=myrootfs_arm64.ext4 bs=1M count=2048

mkfs.ext4 myrootfs_arm64.ext4

mount -t ext4 myrootfs_arm64.ext4 tmpfs/ -o loop

cp -af myrootfs_arm64/* tmpfs/

umount tmpfs

chmod 777 myrootfs_arm64.ext4

qemu-system-aarch64 -m 1024 -cpu cortex-a57 -M virt -nographic -smp 4 -kernel arch/arm64/boot/Image -append “noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8” -drive if=none,file=myrootfs_arm64.ext4,id=hd0 -device virtio-blk-device,drive=hd0 -fsdev local,id=kmod_dev,path=./kmodules,security_model=none -device virtio-9p-pci,fsdev=kmod_dev,mount_tag=kmod_mount

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值