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