主页
文章
分类
系列
标签
简历
【Linux Kernel】Linux debug 环境搭建:qemu+vscode内核源码调试配置教程
发布于: 2023-2-1   更新于: 2023-2-1   收录于: Linux Kernel
文章字数: 700   阅读时间: 4 分钟   阅读量:

基础环境

虚拟机环境

  • VMware® Workstation 16 Pro 16.2.4 build-20089737
  • Ubuntu14.04 amd64

真机环境

  • Intel(R) Core(TM) i7-7700HQ CPU (AMD64)
  • Windows 10 专业版 22H2
  • Visual Studio 1.79.2
  • Visual Studio 插件配置
    • C/C++ v.1.15.4
    • C/C++ Extension Pack v1.3.0
    • Remote SSH v0.102.0
    • Remote SSH: Editing Configuration v0.86.0
    • Remote Explorer: v.0.4.0

Ubuntu14.04 设置

  1. root 设置
1
2
//设置root密码
sudo passwd
  1. 软件更新
1
2
 sudo apt-get update 
 sudo apt-get upgrade
  1. 开机root 登录
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 修改50-ubuntu.conf
gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
# 修改内容
[SeatDefaults]  
user-session=ubuntu  
autologin-user=root  
greeter-session=unity-greete  
greeter-show-manual-login=true  
allow-guest=false

# 修改.profile
gedit /root/.profile
# 修改内容
# mesg n
tty -s && mesg n
  1. 禁止提示ubuntu更新 参考配置方案[3]

相关软件安装

ssh安装与vscode远程连接设置

  1. 安装ssh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1. 安装
sudo apt-get  install openssh-server -y
# 2. 修改配置文件
sudo gedit /etc/ssh/sshd_config
# 3. 修改选项
# Authentication:
LoginGraceTime 120
#PermitRootLogin prohibit-password
PermitRootLogin yes
StrictModes yes
  1. Vscode 远程连接 参考配置方法[2]

Linux Source Code

下载地址:

Index of /pub/linux/kernel/

1
2
# 解压
tar -zxvf linux-2.6.32.20.tar.gz 

qemu

1
2
3
4
5
# 安装
apt-get install qemu -y
# 检测安装结果
qemu-i386 -version
# qemu-i386 version 2.0.0 (Debian 2.0.0+dfsg-2ubuntu1.46), Copyright (c) 2003-2008 Fabrice Bellard

gcc

要求安装gcc 4.4

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 安装
apt-get install gcc-4.4
ls /usr/bin -l | grep gcc #可以看到gcc是一个链接文件,连接到gcc-4.8版本;可以把本链接删除,重新链接gcc到gcc-4.4版本;

# 删除4.8版本的gcc软连接
sudo rm -rf /usr/bin/gcc
sudo ln /usr/bin/gcc-4.4 /usr/bin/gcc

# 检查安装结果
sudo gcc -v # 查看最终链接好的版本。

安装必要的编译环境

1
2
3
apt-get install aptitude -y
aptitude install libncurses5-dev -y
apt-get install libssl-dev -y

gdb

  1. 卸载原有gdb,并下载gdb源码
1
2
sudo apt-get autoremove gdb
wget http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz
  1. 修改源码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
vim gdb-7.9/gdb/remote.c
# 修改内容
if (buf_len > 2 * rsa->sizeof_g_packet) 
	error (_("Remote 'g' packet reply is too long: %s"), rs->buf);
# 改为
if (buf_len > 2 * rsa->sizeof_g_packet) {
    rsa->sizeof_g_packet = buf_len;
    for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
    {
        if (rsa->regs[i].pnum == -1)
            continue;
        if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
            rsa->regs[i].in_g_packet = 0;
        else
            rsa->regs[i].in_g_packet = 1;
    }
}
  1. 编译安装
1
2
3
4
cd gdb-7.9
sudo ./configure 
sudo make 
sudo make install
  1. 检查安装结果
1
gdb -v

BusyBox 源码安装编译

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 下载源码
wget --no-check-certification https://busybox.net/downloads/busybox-1.25.0.tar.bz2


# 解压 
tar -xvjf busybox-1.25.0.tar.bz2

# 编译
make defconfig
make menuconfig 
make -j4

make menuconfig 在编译选项中需要手动勾选的项 Pasted image 20230620180255|300

1
2
 # 检查安装结果,与截图中的内容相同则安装成功
 ./busybox ls

Pasted image 20230620180522|800

1
2
# 安装
make install

Linux内核编译

1
2
3
4
5
6
# 下载
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.20.tar.gz

# 编译
make menuconfig
make -j4

Pasted image 20230620182334|1200

检查安装结果 Pasted image 20230620201556|800

根文件系统制作

  1. 将busybox安装后生成的_install文件单独拷贝到一个文件夹
1
2
3
 mkdir ramdisk
 cd ramdisk
 cp -r ../busy-1.25.0/_install/*  .
  1. 设置初始化进程init(建立一个软链接,一定不能直接复制过去)
1
2
cd ramdisk
ln -s bin/busybox init
  1. 设置开机启动程序
  • 首先,我们需要先设定一些程序运行所需要的文件夹
1
2
cd ramdisk
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
  • init程序首先会访问etc/inittab文件,因此,我们需要编写inittab,指定开机需要启动的所有程序
1
2
3
cd ramdisk
cd etc
vim inittab
  • inittab文件添加如下内容
1
2
3
4
5
6
::sysinit:/etc/init.d/rcS   
::askfirst:-/bin/sh    
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
1
chmod +x inittab
  • 编写系统初始化命令 从inittab文件中可以看出,首先执行的是/etc/init.d/rcS脚本,因此,我们生成初始化脚本
1
2
3
4
cd ramdisk
mkdir init.d
cd init.d
vim rcS

rcS文件添加如下内容

1
2
3
4
5
6
7
#!/bin/sh

mount proc
mount -o remount,rw /
mount -a    
clear                               
echo "My Tiny Linux Starting, press enter to active"
1
chmod +x rcS
  • 设置文件系统 在rcS脚本中,mount -a 是自动挂载 /etc/fstab 里面的东西,可以理解为挂在文件系统,因此我们还需要编写 fstab文件来设置我们的文件系统。
1
2
cd ramdisk/etc/
vim fstab
1
2
3
4
#/etc/fstab
proc            /proc        proc    defaults          0       0
sysfs           /sys         sysfs   defaults          0       0
devtmpfs        /dev         devtmpfs  defaults          0       0
  • 压缩生成镜像 至此,我们已经完成了RAM Disk中相关文件的配置,可以压缩生成文件镜像了。
1
2
cd ramdisk
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.img

最后生成的initramfs.img就是我们的根文件系统

qemu+gdb调试linux kernel

直接运行

1
qemu-system-x86_64 -kernel ./linux-2.6.32.20/arch/x86_64/boot/bzImage -initrd ./initramfs.img -append "console=ttyS0" -nographic

调试运行

1
qemu-system-x86_64 -kernel ./linux-2.6.32.20/arch/x86_64/boot/bzImage -initrd ./initramfs.img -append "console=ttyS0" -nographic -S -s
1
2
3
4
gdb vmlinux # vmlinux为内核根目录下的文件

# 进入gdb后
target remote:1234 # qemu默认端口,可以更改

Vscode 远程调试

远程连接后添加配置文件lanuch.json 运行>添加配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "LinuxKernel-Debug",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerServerAddress": "127.0.0.1:1234",
            "program": "${workspaceFolder}/vmlinux",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "logging": {
                "engineLogging": false
            },
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/local/bin/gdb"
        }
    ]
}

正常调试

Pasted image 20230620221034|1500


[1] QEMU+GDB调试Linux内核总结

[2] VSCode使用Remote SSH连接远程服务器

[3] 怎么禁止/开启Ubuntu自动更新升级

[4] 搭建 Linux 内核网络调试环境