Linux内核分析之基础知识

韩乔落

环境搭建

交叉编译工具链下载 toolchains-bootlin musl-cc 裸机编译工具链可以自行寻找。

大家可以使用ubuntu 24.04或者windows+wsl2Mac的配置和Linux大同小异。qemuwindwos的安装包,也可以使用windowsqemu,即WSL2+WINDOWS。这一部分内容可以参考我之前写的Pwn_kernel的内核模块开发部分。需要注意的是WindwosqemuLinuxqemu在启动命令上是有些不同的,linux的一些指令和功能特性是Windows不支持的。也可以选择在wsl2中编译qemu。建议使用Linuxqemu,功能更为完善强大。

1
2
3
sudo apt update
sudo apt install build-essential -y
sudo apt install gdb gdb-multiarch -y

zsh-omz 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt-get install zsh -y
chsh -s $(which zsh)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
# zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

vim ~/.zshrc

plugins=(git z zsh-syntax-highlighting zsh-autosuggestions)

source ~/.zshrc

Linux内核编译所需的库

1
2
3
4
5
6
7
8
9
10
11
# 核心编译工具
sudo apt install gcc make bc bison flex libssl-dev libelf-dev

# 内核配置工具
sudo apt install libncurses5-dev libncursesw5-dev

# 压缩相关库
sudo apt install zlib1g-dev liblz4-dev liblzma-dev libzstd-dev

# 其他常用库
sudo apt install dwarves rsync kmod cpio initramfs-tools-core

Busybox编译所需的库

1
2
3
4
5
# 基本C库开发包
sudo apt install libc6-dev

# 静态库支持(如果需要静态编译)
sudo apt install libc6-dev-i386 lib32gcc-s1 lib32stdc++6

Qemu编译所需的库

QEMU编译核心依赖

1
2
3
4
5
6
7
8
# 核心编译工具
sudo apt install gcc make cmake ninja-build pkg-config

# Python相关(QEMU构建系统需要)
sudo apt install python3 python3-pip python3-dev python3-venv

# 基础库
sudo apt install zlib1g-dev libglib2.0-dev libpixman-1-dev libslirp-dev

图形和显示支持

1
2
3
4
5
6
7
8
9
10
11
# SDL支持(图形界面)
sudo apt install libsdl2-dev libsdl2-image-dev

# GTK支持
sudo apt install libgtk-3-dev

# VNC支持
sudo apt install libvncserver-dev

# Spice支持(高级图形)
sudo apt install libspice-server-dev libspice-protocol-dev

网络和存储支持

1
2
3
4
5
6
7
8
9
10
11
# 网络库
sudo apt install libcap-ng-dev libattr1-dev

# 存储格式支持
sudo apt install libaio-dev libcap-dev libiscsi-dev

# 压缩库
sudo apt install liblzo2-dev libsnappy-dev libbz2-dev liblzma-dev libzstd-dev

# 加密库
sudo apt install libgcrypt20-dev libgnutls28-dev

音频支持

1
sudo apt install libasound2-dev libpulse-dev

虚拟化和硬件加速

1
2
3
4
5
6
7
8
# KVM支持
sudo apt install libvirt-dev

# USB支持
sudo apt install libusb-1.0-0-dev libusbredirparser-dev

# 智能卡支持
sudo apt install libcacard-dev

可选高级功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 调试工具
sudo apt install valgrind

# 文档生成
sudo apt install texinfo

# 额外协议支持
sudo apt install libcurl4-gnutls-dev libssh-dev

# RDMA支持
sudo apt install librdmacm-dev libibverbs-dev

# 安全启动支持
sudo apt install libseccomp-dev

Buildroot编译需要的库

1
2
3
sudo apt install -y git make gcc g++ unzip patch bc libncurses5-dev \
libssl-dev libelf-dev bison flex rsync cpio python3 python3-pip \
file wget

交叉编译工具链安装

ARM EABI 交叉编译工具链

ARM EABI(Embedded Application Binary Interface)主要用于较老的ARM处理器:

1
2
3
4
# ARM EABI 工具链
sudo apt update
sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
sudo apt install libc6-dev-armel-cross

ARM EABIHF 交叉编译工具链

ARM EABIHF(Hard Float)支持硬件浮点运算,适用于ARMv7架构:

1
2
3
# ARM EABIHF 工具链
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
sudo apt install libc6-dev-armhf-cross

AArch64 交叉编译工具链

AArch64是ARM的64位架构:

1
2
3
# AArch64 工具链
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt install libc6-dev-arm64-cross

RISC-V 交叉编译工具链

ubuntu缺乏riscv-32位相关的包,我们需要从官网进行下载编译。

1
2
3
# RISC-V 64位工具链
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
sudo apt install libc6-dev-riscv64-cross

其他工具链安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 需要安装这几个库,riscv32库还需手动安装
sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi -y
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -y
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu -y
sudo apt install gcc-x86-64-linux-gnu g++-x86-64-linux-gnu -y
sudo apt install gcc-i686-linux-gnu g++-i686-linux-gnu -y

# 下面的库除了mips和ppc可能会用到,其他架构我们暂且用不到。
sudo apt install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu -y
sudo apt install gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 -y
sudo apt install gcc-mips-linux-gnu g++-mips-linux-gnu -y
sudo apt install gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 -y
sudo apt install gcc-powerpc-linux-gnu g++-powerpc-linux-gnu -y
sudo apt install gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu -y
sudo apt install gcc-alpha-linux-gnu g++-alpha-linux-gnu -y
sudo apt install gcc-s390x-linux-gnu g++-s390x-linux-gnu -y
sudo apt install gcc-sparc64-linux-gnu g++-sparc64-linux-gnu -y
sudo apt install gcc-arc-linux-gnu g++-arc-linux-gnu -y
sudo apt install gcc-m68k-linux-gnu g++-m68k-linux-gnu -y
# ...... 还有很多其他的库可以通过 apt search 查看,这里就不列举了

由于是做相关项目,我们将相关的交叉编译工具链单独放在了项目文件夹里。大家可以通过绝对路径来引用,当然你也可以将其添加到你的环境变量上。我们使用的是glibcelf,也就是使用glibc库和裸机编译。

我们现在暂时用不到裸机编译工具链none, unknow-elf版本,所以可以不下载。

toolchains-bootlin
下面是aarch64工具链的区别对比,其他架构也大同小异。

主要区别对比

特性 aarch64-none-linux-gnu aarch64-none-elf-gnu aarch64-linux-gnu
目标环境 Linux用户空间 裸机/固件 Linux用户空间
系统调用 支持Linux系统调用 无系统调用 支持Linux系统调用
标准库 glibc newlib或无 glibc
内存管理 虚拟内存 物理内存 虚拟内存
启动方式 操作系统加载 直接启动 操作系统加载

我们学习Linux内核用到的架构只有常用的 RISCV-64,ARM64,x86_64三种64位架构。

完整的一键安装命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
sudo apt update && sudo apt install -y \
build-essential \
gcc make bc bison flex \
libssl-dev libelf-dev \
libncurses5-dev libncursesw5-dev \
zlib1g-dev liblz4-dev liblzma-dev libzstd-dev \
dwarves rsync kmod cpio initramfs-tools-core \
libc6-dev
sudo apt update && sudo apt install -y \
build-essential \
gcc make cmake ninja-build pkg-config \
python3 python3-pip python3-dev python3-venv \
zlib1g-dev libglib2.0-dev libpixman-1-dev \
libsdl2-dev libsdl2-image-dev \
libgtk-3-dev libvncserver-dev \
libspice-server-dev libspice-protocol-dev \
libcap-ng-dev libattr1-dev \
libaio-dev libcap-dev libiscsi-dev \
liblzo2-dev libsnappy-dev libbz2-dev liblzma-dev libzstd-dev \
libgcrypt20-dev libgnutls28-dev \
libasound2-dev libpulse-dev \
libvirt-dev \
libusb-1.0-0-dev libusbredirparser-dev \
libcacard-dev \
texinfo \
libcurl4-gnutls-dev libssh-dev \
libseccomp-dev

sudo apt install -y git make gcc g++ clang unzip patch bc libncurses5-dev \
libssl-dev libelf-dev bison flex rsync cpio python3 python3-pip \
file wget bear

# 核心编译工具
sudo apt install gcc make cmake ninja-build pkg-config -y

# Python相关(QEMU构建系统需要)
sudo apt install python3 python3-pip python3-dev python3-venv -y

# 基础库
sudo apt install zlib1g-dev libglib2.0-dev libpixman-1-dev libslirp-dev -y

# SDL支持(图形界面)
sudo apt install libsdl2-dev libsdl2-image-dev -y

# GTK支持
sudo apt install libgtk-3-dev -y

# VNC支持
sudo apt install libvncserver-dev -y

# Spice支持(高级图形)
sudo apt install libspice-server-dev libspice-protocol-dev -y

# 网络库
sudo apt install libcap-ng-dev libattr1-dev -y

# 存储格式支持
sudo apt install libaio-dev libcap-dev libiscsi-dev -y

# 压缩库
sudo apt install liblzo2-dev libsnappy-dev libbz2-dev liblzma-dev libzstd-dev -y

# 加密库
sudo apt install libgcrypt20-dev libgnutls28-dev -y

sudo apt install libasound2-dev libpulse-dev -y

# KVM支持
sudo apt install libvirt-dev -y

# USB支持
sudo apt install libusb-1.0-0-dev libusbredirparser-dev -y

# 智能卡支持
sudo apt install libcacard-dev -y

# 调试工具
sudo apt install valgrind -y

# 文档生成
sudo apt install texinfo -y

# 额外协议支持
sudo apt install libcurl4-gnutls-dev libssh-dev -y

# RDMA支持
sudo apt install librdmacm-dev libibverbs-dev -y

# 安全启动支持
sudo apt install libseccomp-dev -y

sudo apt update && sudo apt install -y linux-headers-generic linux-libc-dev
# virt-make-fs 工具(可选)
sudo apt install libguestfs-tools
# 下面工具根据需求自行选择安装,建议去官网安装。
sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi -y
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -y
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu -y
sudo apt install gcc-x86-64-linux-gnu g++-x86-64-linux-gnu -y
sudo apt install gcc-i686-linux-gnu g++-i686-linux-gnu -y
sudo apt install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu -y
sudo apt install gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 -y
sudo apt install gcc-mips-linux-gnu g++-mips-linux-gnu -y
sudo apt install gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 -y
sudo apt install gcc-powerpc-linux-gnu g++-powerpc-linux-gnu -y
sudo apt install gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu -y
sudo apt install gcc-alpha-linux-gnu g++-alpha-linux-gnu -y
sudo apt install gcc-s390x-linux-gnu g++-s390x-linux-gnu -y
sudo apt install gcc-sparc64-linux-gnu g++-sparc64-linux-gnu -y
sudo apt install gcc-arc-linux-gnu g++-arc-linux-gnu -y
sudo apt install gcc-m68k-linux-gnu g++-m68k-linux-gnu -y
# ......还有很多其他的库可以通过 apt search 查看,这里就不列举了

sudo apt update && sudo apt autoremove && sudo apt full-upgrade -y

编译步骤提示

Linux内核编译:

Linux内核下载:

1
2
3
4
wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.15.188.tar.gz
tar -xvf linux-5.15.188.tar.gz
wget https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.12.38.tar.gz
tar -xvf linux-5.15.188.tar.gz
1
2
3
4
5
6
7
8
9
10
11
# 配置内核
make menuconfig # 或 make defconfig

# 编译
make bzImage -j$(nproc)

# 安装模块 (可选)
sudo make modules_install

# 安装内核 (可选)
sudo make install

清华源

  1. make menuconfig

这里我们主要关注调试方面的选项,依次进入到 Kernel hacking -> Compile-time checks and compiler options,然后勾选如下选项Compile the kernel with debug info,以便于调试。不过似乎现在是默认开启的。如果要使用 kgdb 调试内核,则需要选中 KGDB: kernel debugger,并选中 KGDB 下的所有选项。

报错处理:

【1】

问题概述:

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.

解决方法:

编辑 .config 文件,搜索debian/canonical-certs.pem并把这个字符串删掉。

删除前:

  • CONFIG_SYSTEM_TRUSTED_KEYS=”debian/canonical-certs.pem”

删除后

  • CONFIG_SYSTEM_TRUSTED_KEYS=””

【2】

问题概述:

make[2]: *** No rule to make target 'net/netfilter/xt_TCPMSS.o', needed by 'net/netfilter/built-in.a'. Stop.

解决方法:

Makefile 中的 xt_TCPMSS.c 是大写的,而源文件名 (xt_tcpmss.c) 是小写的。这是一个大小写不匹配的问题。

验证源文件名

你可以先检查一下实际的源文件名:

1
ls net/netfilter/xt_*tcpmss*

这应该会显示实际的文件名是 xt_tcpmss.c(小写)。

1. 找到并编辑 Makefile

1
vim net/netfilter/Makefile

2. 找到第157行左右的内容

寻找类似这样的行:

1
obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_TCPMSS.o

3. 将大写的 TCPMSS 改为小写的 tcpmss

修改为:

1
obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_tcpmss.o

4. 保存并重新编译

1
make bzImage -j$(nproc)
  1. make bzImage -j4

注意事项:

注意 gcc 版本问题,4.*一般用 gcc-55.*一般用 gcc-7

gcc多版本共存请参考这里

  1. 编译成功后

我们一般主要关注于如下的文件

RISC-V64

  • 镜像名: Image
  • 路径: arch/riscv/boot/Image
  • 说明: 与ARM64一样,RISC-V也使用未压缩的Image格式

x86_64

  • 镜像名: bzImage
  • 路径: arch/x86/boot/bzImage
  • 说明: “big zImage”的缩写,实际上是压缩的内核镜像

ARM64

  • 镜像名: Image
  • 路径: arch/arm64/boot/Image
  • 说明: 未压缩的内核镜像

MIPS

  • 镜像名: vmlinux.binvmlinux
  • 路径: arch/mips/boot/vmlinux.bin
  • 说明: MIPS架构通常使用vmlinux.bin,某些情况下也会有压缩版本

PowerPC

  • 镜像名: zImageuImage
  • 路径: arch/powerpc/boot/zImage
  • 说明: PowerPC使用zImage(压缩镜像)或uImage(U-Boot格式)

ARM32

  • 镜像名: zImageuImage
  • 路径: arch/arm/boot/zImage
  • 说明: 32位ARM使用压缩的zImage格式

SPARC

  • 镜像名: zImagevmlinux
  • 路径: arch/sparc/boot/zImage

Alpha

  • 镜像名: vmlinux
  • 路径: vmlinux

查看所有可用的镜像目标

你可以通过以下命令查看特定架构支持的所有镜像格式:

1
2
3
4
5
# 查看当前架构支持的镜像目标
make help | grep -A 10 "Architecture specific targets"

# 或者查看make的所有目标
make help

镜像格式说明

  • Image: 未压缩的内核镜像,主要用于ARM64和RISC-V
  • zImage: 压缩的内核镜像,自解压,常用于ARM32、PowerPC等
  • bzImage: “big zImage”,x86架构的压缩内核镜像
  • uImage: U-Boot格式的内核镜像,包含加载地址等信息
  • vmlinux: 未压缩的ELF格式内核镜像,主要用于调试

实际编译示例

对于不同架构,你可以明确指定要编译的镜像类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# RISC-V
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- menuconfig
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- Image

# x86_64
make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- menuconfig
make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- bzImage

# ARM64
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image

# MIPS
make ARCH=mips CROSS_COMPILE=mips-linux-gnu- menuconfig
make ARCH=mips CROSS_COMPILE=mips-linux-gnu- vmlinux.bin

Busybox编译:

Busybox下载:

1
2
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -jxvf busybox-1.36.1.tar.bz2
1
2
3
4
5
6
7
8
9
10
11
12
# 配置busybox 
➜ busybox-1.36.1 mkdir -p ./build/x86_64

# 选择 Settings -> Build Options -> Build static binary
# 然后配置安装目录
➜ busybox-1.36.1 make menuconfig

# 编译
➜ busybox-1.36.1 make -j$(nproc)

# 安装
➜ busybox-1.36.1 make install

image-20250716170229338

如果你的内核版本大于6.8.0编译可能会报错:https://lists.busybox.net/pipermail/busybox-cvs/2024-January/041752.html

只需要把tc.c移除或者禁用即可。

1
2
3
make menuconfig
# 然后在菜单中:
# Networking Utilities -> tc (traffic control utility) [取消选择]

交叉编译只需要修改Cross complier prefix的值即可,比如aarch64-linux-gnu-

Qemu 编译:

QEMU编译步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
wget https://download.qemu.org/qemu-10.0.2.tar.xz
tar -xvf qemu-10.0.2.tar.xz
# 下载QEMU源码后
cd qemu-10.0.2

# 配置编译选项
./configure --enable-kvm --enable-gtk --enable-spice --enable-usb-redir --enable-slirp

# 编译(使用多核心加速)
make -j$(nproc)

# 安装
sudo make install

注意事项

  • 不同版本的QEMU可能对依赖库的要求略有不同
  • 可以通过 ./configure --help 查看具体的编译选项
  • 如果只需要特定架构支持,可以使用 --target-list 参数减少编译时间
  • 某些功能需要相应的内核模块支持(如KVM需要加载kvm模块)

这些库足以支持QEMU的完整功能编译,包括各种虚拟化特性、图形界面、网络和存储支持等。

Buildroot 编译:

1
2
wget https://buildroot.org/downloads/buildroot-2025.02.4.tar.gz
tar -xvf buildroot-2025.02.4.tar.gz

ARM64 Linux编译

  1. 查看可用的ARM64相关配置
1
2
3
4
5
6
7
➜  buildroot-2025.02.4 make list-defconfigs | grep aarch64
make: Warning: File '/mnt/d/DM/linux_kernel_research/buildroot-2025.02.4/output/.br2-external.mk' has modification time 0.47 s in the future
aarch64_efi_defconfig - Build for aarch64_efi
qemu_aarch64_ebbr_defconfig - Build for qemu_aarch64_ebbr
qemu_aarch64_sbsa_defconfig - Build for qemu_aarch64_sbsa
qemu_aarch64_virt_defconfig - Build for qemu_aarch64_virt
make: warning: Clock skew detected. Your build may be incomplete.
  1. 使用QEMU ARM64配置作为基础
1
➜  buildroot-2025.02.4 make qemu_aarch64_virt_defconfig
  1. 运行配置界面进行定制
1
2
3
4
5
6
➜  buildroot-2025.02.4 make menuconfig
# 根据需要定制即可
kernel->
# 编译Linux kernel 5.15.185 6.12.33 两个版本。
filesystem->
# 打开cpio支持
  1. make 即可,输出目录在output/images/

错误处理:

【1】

报错:

➜ buildroot-2025.02.4 make -j$(nproc)
ERROR: No hash found for linux-5.15.18.tar.xz
make: *** [package/pkg-generic.mk:179: /mnt/d/DM/linux_kernel_research/buildroot-2025.02.4/output/build/linux-headers-5.15.18/.stamp_downloaded] Error 1

成因:

没有对应sha256值用来校验。

解决方案:

第一种方法:添加对应值上去。

第二种方法:使用官方有的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  buildroot-2025.02.4 cat ./linux/linux.hash
# From https://www.kernel.org/pub/linux/kernel/v6.x/sha256sums.asc
sha256 c0a575630f2603a20bb0641f8df8f955e46c9d7ac1fae8b54b21316e6b52a254 linux-6.12.33.tar.xz
sha256 0d79ff359635e9f009f1e330deed5f3aefd8c452b80660bffdc504b877797719 linux-6.6.93.tar.xz
sha256 bc3c45faf6f5f0450666c75fa9dad9bc7c0cf7c7cba0dbd94e5cfdc58229c116 linux-6.1.141.tar.xz
# From https://www.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc
sha256 3d03eb798910f32929f7fda5a56e4bb1a121f10bde320d6f3063639c009313dc linux-5.15.185.tar.xz
sha256 07c852940dc2dc03fe84f7fcf697648d7cba11c62d20504380492ba07aa46bb6 linux-5.10.238.tar.xz
sha256 c879d0ba817aaa0fde318d58d7e1f141d9c29bd8569a96b73159ebc448077b99 linux-5.4.294.tar.xz
# Locally computed
sha256 fb0edc3c18e47d2b6974cb0880a0afb5c3fa08f50ee87dfdf24349405ea5f8ae linux-cip-5.10.162-cip24.tar.gz
sha256 b5539243f187e3d478d76d44ae13aab83952c94b885ad889df6fa9997e16a441 linux-cip-5.10.162-cip24-rt10.tar.gz

# Licenses hashes
sha256 fb5a425bd3b3cd6071a3a9aff9909a859e7c1158d54d32e07658398cd67eb6a0 COPYING
sha256 f6b78c087c3ebdf0f3c13415070dd480a3f35d8fc76f3d02180a407c1c812f79 LICENSES/preferred/GPL-2.0
sha256 8e378ab93586eb55135d3bc119cce787f7324f48394777d00c34fa3d0be3303f LICENSES/exceptions/Linux-syscall-note

RISC-V64 Linux编译

Qemu 调试 Linux Kernel

我们使用 Linux 上的 Qemu。如果你使用 Windwos 的 Qemu 注意修改启动参数。

x86_64

  1. 首先在busybox文件夹创建一些系统文件:
1
mkdir -p lib tmp proc sys dev etc/init.d
  1. (可选)然后编写一个内核模块(感兴趣看内核开发部分,或者可以从Pwn_kernel的内核模块开发部分简单了解),将其放在/lib/目录中。

  2. 编写一个init脚本,放在根目录即可。

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh
echo "INIT SCRIPT"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
insmod /lib/ko_test.ko # 可选
echo -e "Boot took $(cut -d' ' -f1 /proc/uptime) seconds"
setsid /bin/cttyhack setuidgid 0 /bin/sh # 0 代表 root权限, 普权限设置为1000
poweroff -f
  1. 打包文件系统:
1
find . | cpio -o -H newc > ../rootfs.cpio
  1. 将编译好的/kernel/arch/x86/boot/bzImage复制到rootfs.img 同级目录。之后便可以启动Qemu。

Linux启动脚本:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
qemu-system-x86_64 \
-m 64M \
-nographic \
-kernel ./bzImage \
-initrd ./rootfs.cpio \
-append "init=/init root=/dev/ram rw console=ttyS0 oops=panic panic=1 kaslr" \
-smp cores=2,threads=2 \
-cpu kvm64 \
-s # 开启gdb调试,默认1234端口,用于调试内核

windwos pwsh 启动脚本。

1
2
3
4
5
6
7
8
9
qemu-system-x86_64.exe `
-m 64M `
-nographic `
-kernel .\bzImage `
-initrd .\rootfs.cpio `
-append "init=/init root=/dev/ram rw console=ttyS0 oops=panic panic=1 kaslr" `
-smp cores=2,threads=2 `
-cpu kvm64 `
-s # 开启gdb调试,默认1234端口,用于调试内核

可以使用-append "init=/init"参数指定启动脚本,不指定则默认使用根目录下的init。我们这里养成良好习惯显示指定init脚本。

如果要调试用户态程序可以使用qemu的端口转发功能。假如我们在qemu内使用gdbserver监听了1337端口。

1
2
3
qemu-system-x86_64 \
-netdev user,id=net0,hostfwd=tcp::10001-:1337 \
-device virtio-net-pci,netdev=net0

这样我们可以从宿主机10001端口访问qemu内部的1337调试端口。

基本命令格式

1
2
3
qemu-system-x86_64 \
-netdev user,id=<网络标识>,hostfwd=<协议>:<宿主机IP>:<宿主机端口>-<虚拟机IP>:<虚拟机端口> \
-device <网卡驱动>,netdev=<网络标识>

关键参数说明

  1. -netdev user
    启用用户模式网络栈(无需 root 权限),支持端口转发。

  2. id=<网络标识>
    自定义网络设备标识(如 net0),用于关联后续 -device

  3. hostfwd=<规则>

    端口转发规则,格式:

    1
    协议:宿主机IP:宿主机端口-虚拟机IP:虚拟机端口
    • 协议:tcpudp
    • IP 省略时默认绑定 0.0.0.0(any)
  4. -device <网卡驱动>
    指定虚拟网卡类型(如 virtio-net-pci)。

调试工具

multiarch-gdbserver-static:调试内部程序用的静态编译的gdbserver

image-20250717185418550

ARM64

Linux 启动脚本:

Windwos pwsh 启动脚本:

RISC-V64

Linux 启动脚本

Windwos pwsh 启动脚本:

Linux内核基础知识

  • Title: Linux内核分析之基础知识
  • Author: 韩乔落
  • Created at : 2025-07-16 16:19:43
  • Updated at : 2025-07-30 14:16:15
  • Link: https://jelasin.github.io/2025/07/16/Linux内核分析之基础知识/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments