VSCode+Qemu搭建Linux内核调试环境

查看当前内核源码
uname -r
查看源内内核源码
 apt-cache search linux-source
下载内核源码
sudo apt install  linux-source-xxx

或者
https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.15.tar.gz

源码会被下载到/usr/src/ 目录下

安装依赖
sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev

进入源码目录,配置编译选项:

 cd linux-source-5.15.0/
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig #生成.config
 make menuconfig
 #buildroot中配置:
#make menuconfig KCONFIG_CONFIG=arch/arm64/configs/defconfig ARCH=arm64 CROSS_COMPILE=/home/buildroot-2023.11/output/ccwm/host/bin/aarch64-none-linux-gnu-

注意:如果你想用这个内核替换掉自己系统上的内核,要用 /boot/config- ( u n a m e − r ) 作为基础配置文件。可以使用 c p / b o o t / c o n f i g − (uname -r) 作为基础配置文件。可以使用 cp /boot/config- (unamer)作为基础配置文件。可以使用cp/boot/config(uname -r) .config
将已有的配置文件拷贝到编译目录中,然后再运行 make menuconfig

开启
Kernel hacking
—> [] Kernel debugging Compile-time checks and compiler options
—> [
] Compile the kernel with debug info
[*] Provide GDB scripts for kernel debugging

关闭

Kernel Features  ---> 
	   [ ] Randomize the address of the kernel image  //取消内核内存地址随机化,不同内核通过搜索RANDOMIZE_BASE查找	      

VSCode+Qemu搭建Linux内核调试环境_第1张图片

编译内核

make ARCH=arm64 Image -j8  CROSS_COMPILE=aarch64-linux-gnu-
#如果是在buildroot中编译:
#make KCONFIG_CONFIG=arch/arm64/configs/defconfig ARCH=arm64 CROSS_COMPILE=/home/buildroot-2023.11/output/ccwm/host/bin/aarch64-none-linux-gnu- -j

编译驱动 ko (这里其实不需要,调试的话还是把驱动编译到内核中,不用单独加载符号)

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

make M=DIR modules #DIR 是驱动源码的地址

安装qemu

https://download.qemu.org/qemu-6.2.0.tar.xz
https://download.qemu.org/qemu-7.2.8.tar.xz
https://download.qemu.org/qemu-9.0.2.tar.xz

#编译依赖

sudo apt-get install libcap-ng-dev libattr1-dev 
sudo apt-get install -y ninja-build libpixman-1-dev libglib2.0-bin libglib2.0-dev 
sudo apt-get install libsdl2-dev

编译

mkdir build
cd build
../configure --enable-virtfs
make -j
sudo make install

如果是qemu支持mesa :
依赖

sudo apt-update
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
sudo apt-get install libepoxy-dev

编译支持mesa的qemu

mkdir ~/myqemu && cd ~/myqemu
git clone https://github.com/kjliew/qemu-3dfx.git
cd qemu-3dfx
wget https://download.qemu.org/qemu-7.2.8.tar.xz
tar xf qemu-7.2.8.tar.xz
cd qemu-7.2.8
rsync -r ../qemu-0/hw/3dfx ../qemu-1/hw/mesa ./hw/
patch -p0 -i ../01-qemu72x-mesa-glide.patch
bash ../scripts/sign_commit
mkdir ../build && cd ../build
#../qemu-7.2.8/configure --enable-virtfs 
#../qemu-7.2.8/configure --enable-virtfs --enable-kvm --enable-debug --enable-gtk --target-list=aarch64-softmmu --enable-virglrenderer --enable-opengl 
../qemu-7.2.8/configure --enable-virtfs --enable-kvm --target-list=aarch64-softmmu --enable-opengl --enable-sdl

make -j
#安装 系统目录
make install
安装home目录
make DESTDIR=~/local install

https://blog.csdn.net/stray2b/article/details/123487106

安装交叉编译器
sudo apt install gcc-aarch64-linux-gnu
aarch64-linux-gnu-gcc  -v
制作 initramfs 在虚拟机中启动基本系统
busybox

https://busybox.net/downloads/busybox-1.36.0.tar.bz2

gdb
sudo apt install gdb-multiarch
需要的文件

make qemu
cd qemu
mkdir drivers
cp …/buildroot-2024.05.1/output/images/rootfs.ext2 ./
cp …/buildroot-2024.05.1/output/images/Image ./
cp …/buildroot-2024.05.1/output/build/linux-custom/vmlinux ./

/kernel-5.15/vmlinux
buildroot/output/rootfs/rootfs.ext2 #下面有rootfs.img的话直接复制rootfs.img
/kernel-5.15/arch/arm64/boot/Image

rootfs.ext2转为rootfs.img

要将一个ext2文件系统的镜像(rootfs.ext2)转换为一个可被QEMU等虚拟化平台识别的RAW镜像(rootfs.img),你可以使用qemu-img工具。以下是转换的命令:

qemu-img convert -f ext2 rootfs.ext2 -O raw rootfs.img

ext2不支持:

qemu-img convert rootfs.ext2 -O raw rootfs.img
qemu 启动内核、文件系统
#! /bin/sh
qemu-system-aarch64  -machine  virt,virtualization=true,gic-version=3   -nographic   -m size=2048M   -cpu cortex-a72  -smp 2   -kernel Image  -drive format=raw,file=rootfs.img  -append "root=/dev/vda rw" --fsdev local,id=kmod_d,path=$PWD/drivers,security_model=none  -device virtio-9p-device,fsdev=kmod_d,mount_tag=kmount -s -S

参数:

# nokaslr 是关闭随机地址,gdb调试随机地址导致无法正常调试
# -s 是-gdb tcp::1234 的简写,如果需要换端口可以用-gdb tcp::1234替换-s参数
# -S 是freeze cpu at startup的指令,也就是kernel 启动时就挂起,等待调试连接,如果不需要调试内核启动,这个参数也可以去掉
--fsdev local,id=kmod_d,path=$PWD/drivers,security_model=none  -device virtio-9p-device,fsdev=kmod_d,mount_tag=kmount

这段是qemu通过virtio-9p在host和guest之间共享文件,进入客户机后通过一下挂载以共享主机$PWD/drivers目录

mount -t 9p -o trans=virtio kmount /mnt

cpio

```bash
qemu-system-aarch64  -machine  virt,virtualization=true,gic-version=3  -nographic  -m size=2048M   -cpu cortex-a72  -smp 2   -kernel Image  -initrd rootfs123.cpio  -append "root=/dev/vda rw " --fsdev local,id=kmod_d,path=$PWD/drivers,security_model=none  -device virtio-9p-device,fsdev=kmod_d,mount_tag=kmount  
qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt =m 2048M
-smp 4 -kerne
Image --append "rdinit=/linuxrc root=/dev/vda rw console=ttyAMA0 loglevel=8"
-nographic
--fsdev local,id=kmod dev,path=$PWD/drivers
security model=none
-device virtio-9p-device,fsdev=kmod dev,mount tag=kmod mount -gdb top:1580
-5

-s gdb端口1234
-gdb top:1580 自定义

qemu相关命令
qemu-img info image.img	#查看镜像格式
qemu-system-aarch64 -machine help #查看支持的设备
VMware Ubuntu下启动qemu图形界面命令(自用):
qemu-system-aarch64  -machine  virt,virtualization=true,gic-version=3   -m size=2048M   -cpu cortex-a72  -smp 2   -kernel Image  -drive format=raw,file=rootfs.img  -append "root=/dev/vda rw nokaslr console=ttyAMA0" --fsdev local,id=kmod_d,path=$PWD/drivers,security_model=none  -device virtio-9p-device,fsdev=kmod_d,mount_tag=kmount  -monitor  stdio
关闭qemu
#!/bin/bash
ps -A | grep qemu-system- | awk '{print $1}' | xargs sudo kill -9
VSCode调试
        {
            "name": "kernel debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/vmlinux",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234",
            "sourceFileMap": {
                "${workspaceFolder}/linux-source-5.15.0":"${workspaceFolder}/linux-source-5.15.0"
            },
        }
树莓派的镜像启动
#!/bin/sh
qemu-system-aarch64 -M raspi3b -m 1G -nographic -drive format=raw,file=sdcard.img

qemu-system-aarch64  -M raspi3b  -m 512M  -kernel Image   -dtb bcm2837-rpi-3-b.dtb   -nographic   -append "console=ttyAMA0"  -sd rootfs.ext2

记录下vscode解决 windows换行crlf与lf冲突

https://blog.csdn.net/glorydx/article/details/110958739

vscode 点击文件 --》首选项 --》 设置 --》 搜索 eol,改变eol为\n(指lf)或者改为(\r\n),有一个统一的标准就好了。

git在维护版本库的时候统一使用的是LF,这样就可以保证文件跨平台的时候保持一致。

在Linux下默认的换行符也是LF,那也就不存在什么问题。

在Windows下默认的换行符是CRLF,那么我们需要保证在文件提交到版本库的时候文件的换行符是LF,通常来说就是上面的两种方法。

如果你同事中有使用其它系统开发的

你需要先执行上面的操作,再行 以下代码才能解决

 git config --global core.autocrlf false

VSCode+Qemu搭建Linux内核调试环境_第2张图片

交叉编译器

https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz?rev=22c39fc25e5541818967b4ff5a09ef3e&hash=B9FEDC2947EB21151985C2DC534ECCEC

https://baijiahao.baidu.com/s?id=1790838461666993024&wfr=spider&for=pc
https://zhuanlan.zhihu.com/p/445453676
https://blog.csdn.net/charlie114514191/article/details/139800851
https://blog.csdn.net/liutit/article/details/140348601
https://blog.csdn.net/yanghao23/article/details/135892347
https://zhuanlan.zhihu.com/p/667525514

传输文件
https://blog.csdn.net/qq_44600038/article/details/130984640

内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试

你可能感兴趣的:(Linux,vscode,linux,ide)