36 - Linux 内核基础与模块

Linux 内核是整个操作系统的核心引擎。从进程调度到内存分配,从文件系统到网络协议栈,内核决定了系统的性能、稳定性和能力边界。本章从架构原理到实战操作,系统讲解内核版本管理、模块机制、参数调优、编译定制的完整知识体系。


36.1 内核架构概览

Linux 内核采用单体式架构,但通过模块机制实现了灵活的功能扩展。所有核心组件运行在内核空间,共享同一地址空间,确保了极高的运行效率。

graph TB
 subgraph "用户空间"
 APP[应用程序]
 LIBC[GNU C 库 glibc]
 end

 subgraph "内核空间"
 SYSCALL[系统调用接口]
 PROC[进程调度器]
 MM[内存管理器]
 VFS[虚拟文件系统]
 NET[网络协议栈]
 IPC[进程间通信]
 DRIVERS[设备驱动]
 end

 HARDWARE[硬件层 CPU/内存/磁盘/网卡]

 APP --> LIBC
 LIBC --> SYSCALL
 SYSCALL --> PROC
 SYSCALL --> MM
 SYSCALL --> VFS
 SYSCALL --> NET
 PROC --> HARDWARE
 MM --> HARDWARE
 VFS --> DRIVERS
 VFS --> HARDWARE
 NET --> DRIVERS
 NET --> HARDWARE
 DRIVERS --> HARDWARE

五大核心子系统

子系统职责关键概念
进程调度器CPU 时间分配、进程优先级、多核调度CFS、EEVDF、抢占模式
内存管理器虚拟内存、物理页分配、内存回收伙伴系统、slab、页缓存、swap
虚拟文件系统(VFS)统一文件操作接口、文件抽象inode、dentry、superblock
网络协议栈TCP/IP 协议族、socket 接口、数据包处理netfilter、流量控制、BPF
设备驱动硬件抽象、设备管理、中断处理字符/块/网络设备、设备树

内核空间与用户空间

# 查看内存划分
cat /proc/meminfo | grep -E "^MemTotal|^MemFree|^KernelStack|^PageTables"
 
# 查看系统调用次数(大致了解用户态/内核态切换频率)
vmstat 1 5

内核运行在最高特权级(Ring 0),可以直接访问所有硬件和内存;用户程序运行在受限环境(Ring 3),必须通过系统调用请求内核服务。这种设计确保了系统的安全性与稳定性。


36.2 内核版本体系

版本号含义

Linux 内核版本号格式:主版本.次版本.修订号

例如:6.9.3
 │ │ └── 修订号(patch):bug 修复和安全更新
 │ └──── 次版本(minor):新功能和改进
 └────── 主版本(major):重大里程碑

版本分支

分支类型说明示例
mainlineLinus Torvalds 维护的主线,最新功能6.10-rc1
stable最新稳定版本,每个 mainline 发布后进入6.9.3
longterm(LTS)长期支持版本,维护 2-6 年6.6.x, 6.1.x, 5.15.x
linux-next汇集各子系统开发分支,用于集成测试linux-next-20240701
distribution各发行版基于上游内核添加的补丁版本如 Ubuntu 的 linux-image

内核发布周期

开发周期(约 9-10 周):

合并窗口(2 周)→ rc1 → rc2 → ... → rc7/rc8 → 正式发布
 │ │
 │ └── 只接受 bug 修复
 └── 接受新功能合并

当前 LTS 版本维护情况:

LTS 版本发布时间维护截止(预计)
6.62023.102026.12
6.12022.122026.12
5.152021.102026.10
5.102020.122026.12
# 查看当前运行内核版本
uname -r
 
# 查看完整内核信息
uname -a
 
# 查看已安装的内核包(Debian/Ubuntu)
dpkg -l | grep linux-image
 
# 查看已安装的内核包(RHEL/Fedora)
rpm -q kernel
 
# 查看已安装的内核包(Arch)
pacman -Q linux linux-lts linux-zen 2>/dev/null
 
# 获取源码版本信息
cat /proc/version

发行版内核策略对比

发行版内核策略更新方式
Arch Linux紧跟主线稳定版滚动更新,约 1-2 周更新一次
Debian Stable一个发布周期固定一个版本安全修复回移植
Ubuntu LTS使用对应的上游 LTS 或 HWEHWE 可切换到较新内核
Fedora紧跟主线每个版本生命周期内多次升级
RHEL/Alma/Rocky基于特定版本长期维护大量回移植补丁
openSUSE Tumbleweed滚动更新,紧跟主线频繁更新

36.3 /proc 与 /sys 接口

/proc 文件系统

/proc 是一个虚拟文件系统,提供了内核与进程的运行时信息,不占用磁盘空间。

# CPU 信息
cat /proc/cpuinfo
cat /proc/stat # CPU 使用统计
 
# 内存信息
cat /proc/meminfo
cat /proc/vmstat
 
# 磁盘信息
cat /proc/diskstats # 磁盘 I/O 统计
cat /proc/partitions # 分区信息
 
# 内核信息
cat /proc/version # 内核版本
cat /proc/cmdline # 引导参数
cat /proc/uptime # 运行时间和空闲时间
cat /proc/loadavg # 系统负载
 
# 进程信息(PID 号为例)
ls /proc/1/ # PID 1(systemd/init)的信息
cat /proc/1/status # 进程状态
cat /proc/1/limits # 资源限制
cat /proc/1/maps # 内存映射
ls -l /proc/1/fd/ # 打开的文件描述符
 
# 文件系统信息
cat /proc/filesystems # 内核支持的文件系统
cat /proc/mounts # 当前挂载点(比 /etc/mtab 更权威)
 
# 网络信息
cat /proc/net/tcp # TCP 连接原始数据
cat /proc/net/dev # 网络设备统计
 
# 内核参数(可读写)
cat /proc/sys/kernel/hostname
ls /proc/sys/ # 可调参数入口

/sys 文件系统

/sys(sysfs)导出了内核设备模型,以层次结构展示设备、驱动、总线关系。

# 设备层次结构
ls /sys/devices/
ls /sys/class/ # 按设备类型分类(net, block, tty, drm...)
ls /sys/bus/ # 按总线类型分类(pci, usb, i2c, platform...)
 
# 块设备信息
cat /sys/block/sda/size # 磁盘扇区数
cat /sys/block/sda/queue/scheduler # I/O 调度器
cat /sys/block/nvme0n1/queue/rotational # 0=SSD, 1=HDD
 
# 网络设备信息
cat /sys/class/net/eth0/speed # 网卡速率
cat /sys/class/net/eth0/address # MAC 地址
 
# 电源管理
ls /sys/power/
cat /sys/power/state # 支持的休眠状态
 
# 内核模块参数
cat /sys/module/i915/parameters/enable_guc
ls /sys/module/nvidia/parameters/
 
# 内核追踪(debugfs 与 tracefs)
ls /sys/kernel/debug/ # 调试接口
ls /sys/kernel/tracing/ # ftrace 接口

/proc/sys 的核心区别:

特性/proc/sys
设计目的进程信息和内核状态设备模型和驱动配置
数据结构自由文本格式结构化层次模型
可写入性部分文件可写(/proc/sys/)大量属性文件可读写
典型用途系统监控、进程信息设备配置、电源管理

36.4 内核模块管理

内核模块(.ko 文件)是可以在运行时动态加载和卸载的内核功能扩展。模块化设计使内核本身保持精简,需要时才加载对应功能。

模块管理工具链

# --- lsmod:列出已加载模块 ---
lsmod
lsmod | sort -k 3 -rn | head -20 # 按使用计数排序
 
# 输出格式:Module | Size | Used by
# nvidia 62512128 1322 nvidia_modeset
# 表示 nvidia 模块占用约 60MB 内存,被 1322 个地方引用
 
# --- modinfo:查看模块信息 ---
modinfo i915
modinfo -p i915 # 仅显示可用参数
modinfo -n i915 # 显示模块文件路径
modinfo -d nvidia # 显示模块描述
 
# --- modprobe:智能加载/卸载(自动处理依赖)---
sudo modprobe i915 # 加载模块
sudo modprobe -r i915 # 卸载模块(含未被使用的依赖)
modprobe --show-depends nvidia # 展示依赖关系(不实际加载)
sudo modprobe i915 enable_guc=2 # 带参数加载
 
# --- insmod/rmmod:底层加载/卸载(不处理依赖)---
sudo insmod /path/to/module.ko # 直接加载指定文件
sudo rmmod module_name # 直接卸载
 
# --- depmod:生成模块依赖数据库 ---
sudo depmod -a # 扫描所有模块并生成依赖索引

模块配置持久化

加载选项配置/etc/modprobe.d/):

# /etc/modprobe.d/i915.conf
options i915 enable_guc=3 enable_fbc=1
 
# /etc/modprobe.d/nvidia.conf
options nvidia_drm modeset=1 fbdev=1
 
# /etc/modprobe.d/blacklist.conf
blacklist nouveau
blacklist pcspkr
install nouveau /bin/false # 彻底阻止加载

开机自动加载/etc/modules-load.d/):

# 系统启动时自动加载 vfio-pci 模块
echo "vfio-pci" | sudo tee /etc/modules-load.d/vfio-pci.conf

查看模块参数运行时值

cat /sys/module/i915/parameters/enable_guc
ls /sys/module/i915/parameters/

DKMS 机制

DKMS(Dynamic Kernel Module Support)让外部模块在内核升级时自动重新编译:

传统方式:内核升级 → 第三方模块失效 → 手动重新编译
DKMS 方式:内核升级 → DKMS 自动重新编译模块 → 模块继续工作
# 安装 DKMS
sudo apt install dkms # Debian/Ubuntu
sudo dnf install dkms # Fedora/RHEL
sudo pacman -S dkms # Arch
 
# 查看 DKMS 模块状态
dkms status
 
# 输出示例:
# nvidia/550.78, 6.9.3-generic, x86_64: installed

常见使用 DKMS 的场景包括:NVIDIA 显卡驱动、VirtualBox 内核模块、ZFS 模块、v4l2loopback 虚拟摄像头等。


36.5 内核参数调优(sysctl)

内核运行时参数位于 /proc/sys/ 下,可通过 sysctl 命令或直接读写文件进行临时修改,通过配置文件进行永久修改。

sysctl 基本操作

# 查看所有参数
sysctl -a
 
# 查看特定类别参数
sysctl vm
sysctl net.ipv4
sysctl kernel
 
# 查看单个参数
sysctl vm.swappiness
cat /proc/sys/vm/swappiness
 
# 临时修改(重启后失效)
sudo sysctl -w vm.swappiness=10
echo 10 | sudo tee /proc/sys/vm/swappiness
 
# 应用配置文件(立即生效)
sudo sysctl -p /etc/sysctl.d/99-custom.conf
sudo sysctl --system # 加载所有配置文件

配置文件体系

路径用途优先级
/etc/sysctl.conf传统主配置文件
/etc/sysctl.d/*.conf模块化配置目录覆盖前者
/usr/lib/sysctl.d/*.conf软件包提供的默认配置最低
/run/sysctl.d/*.conf运行时临时配置最高

典型配置示例(/etc/sysctl.d/99-custom.conf):

# === 内存管理 ===
vm.swappiness=10 # 减少 swap 倾向(默认 60)
vm.vfs_cache_pressure=50 # 保留 inode/dentry 缓存
vm.dirty_ratio=10 # 脏页比例上限
vm.dirty_background_ratio=5 # 后台刷脏页阈值
vm.overcommit_memory=0 # 内存过量分配策略(0=启发式)
 
# === 网络优化 ===
net.core.somaxconn=65535 # 监听队列最大长度
net.core.netdev_max_backlog=65535 # 网卡接收队列长度
net.core.rmem_max=16777216 # 接收缓冲区最大值
net.core.wmem_max=16777216 # 发送缓冲区最大值
net.ipv4.tcp_fastopen=3 # TCP Fast Open
net.ipv4.tcp_tw_reuse=1 # 快速复用 TIME_WAIT 连接
net.ipv4.ip_local_port_range=1024 65535
 
# === 安全加固 ===
net.ipv4.conf.all.rp_filter=1 # 反向路径过滤(防 IP 欺骗)
net.ipv4.conf.default.accept_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
kernel.dmesg_restrict=1 # 限制非特权用户读取 dmesg
kernel.kptr_restrict=2 # 隐藏内核指针(地址)
kernel.yama.ptrace_scope=2 # 限制 ptrace(仅 root 可追踪子进程)
 
# === 文件系统 ===
fs.file-max=2097152 # 系统级最大打开文件数
fs.inotify.max_user_watches=524288 # inotify 监控数上限

36.6 内核编译与定制

编译自己的内核可以裁剪不需要的功能、针对特定 CPU 优化、应用补丁或启用实验性特性。

获取内核源码

# 方法一:从 kernel.org 下载
curl -OL https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.3.tar.xz
tar xf linux-6.9.3.tar.xz
cd linux-6.9.3
 
# 验证签名
unxz linux-6.9.3.tar.xz
gpg --locate-keys torvalds@kernel.org
gpg --verify linux-6.9.3.tar.sign linux-6.9.3.tar
 
# 方法二:从 Git 仓库克隆
git clone --depth 1 --branch v6.9.3 \
 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
 
# Linus Torvalds 的主线仓库:
# https://github.com/torvalds/linux
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
 
# 方法三:使用发行版源码包
# Debian/Ubuntu:
apt source linux
# Fedora/RHEL:
dnf download --source kernel
# Arch:
pkgctl repo clone linux

内核配置

配置保存在 .config 文件中,每个选项有三种状态:y(编译进内核)、m(编译为模块)、n(不编译)。

# 获取初始配置
zcat /proc/config.gz > .config # 基于当前运行内核
cp /boot/config-$(uname -r) .config # Debian/Ubuntu 方式
 
# 更新配置到新内核版本
make oldconfig # 交互式逐个询问新选项
make olddefconfig # 新选项全部使用默认值
 
# 图形化配置界面
make menuconfig # ncurses 界面(最常用)
make nconfig # 增强版 ncurses 界面
make xconfig # Qt 图形界面
make gconfig # GTK 图形界面
 
# 自动化配置策略
make defconfig # 默认配置
make localmodconfig # 仅保留当前已加载模块的配置
make tinyconfig # 最小配置(嵌入式用)
make allnoconfig # 全部不选
make allyesconfig # 全部选为编译进内核

make menuconfig 操作方式:

按键功能
方向键导航菜单
Enter进入子菜单
Y / M / N编译进内核 / 编译为模块 / 不编译
/搜索配置项
?查看选项帮助
Esc Esc返回上级

关键配置区域

General setup --->
 Preemption Model --->
 (X) Voluntary Kernel Preemption # 服务器推荐
 ( ) Preemptible Kernel # 桌面推荐(低延迟)

File systems --->
 <*> Ext4 # 必选
 <*> Btrfs # 根据需要
 <*> XFS # 根据需要
 <*> F2FS # SSD 优化
 DOS/FAT/EXFAT --->
 <*> VFAT # EFI 分区需要
 <*> exFAT # 大容量 U 盘

Device Drivers --->
 NVMe support --->
 <*> NVM Express # NVMe SSD
 USB support --->
 <*> xHCI HCD # USB 3.0
 Graphics support --->
 <M> AMD GPU / Intel Graphics

Security options --->
 [*] AppArmor support # Debian/Ubuntu 默认
 [*] SELinux support # RHEL/Fedora 默认
 [*] Lockdown (Kernel lockdown feature)

编译与安装

# 编译内核(-j 使用所有 CPU 核心)
make -j$(nproc)
 
# 编译内核模块
make modules
 
# 安装模块到 /lib/modules/
sudo make modules_install
 
# 安装内核到 /boot
sudo make install
# 这会复制 bzImage、System.map,并自动更新引导加载器
 
# 手动安装方式(更精细控制)
sudo cp arch/x86/boot/bzImage /boot/vmlinuz-linux-custom
sudo cp System.map /boot/System.map-linux-custom
 
# 生成 initramfs(工具取决于发行版)
# Debian/Ubuntu:
sudo update-initramfs -c -k <内核版>
# Fedora/RHEL/openSUSE:
sudo dracut --kver <内核版> --force
# Arch:
sudo mkinitcpio -k <内核版> -g /boot/initramfs-linux-custom.img
 
# 更新引导配置
# GRUB(通用):
sudo grub-mkconfig -o /boot/grub/grub.cfg
# systemd-boot(UEFI 系统):
sudo bootctl update

发行版特定的内核打包方式

不同发行版有各自的推荐编译方式:

发行版推荐打包方式说明
Debian/Ubuntumake deb-pkg生成 .deb 包,通过 dpkg 管理
Fedora/RHELmake rpm-pkg生成 .rpm 包,通过 rpm/dnf 管理
Arch Linuxmakepkg + PKGBUILD生成 .pkg.tar.zst
openSUSEmake rpm-pkg / OBS或使用开放构建服务
Gentoogenkernel / 手动灵活度最高

使用发行版打包方式的好处是:内核可以通过包管理器正常安装、升级和卸载。

使用 scripts/config 批量修改配置

scripts/config --enable CONFIG_BTRFS_FS
scripts/config --disable CONFIG_BLUETOOTH
scripts/config --module CONFIG_DRM_AMDGPU
scripts/config --set-str CONFIG_LOCALVERSION "-custom"
scripts/config --set-val CONFIG_NR_CPUS 16
scripts/config --undefine CONFIG_OLD_FEATURE_TODO_REMOVE
 
make olddefconfig # 让依赖选项自动调整

编译优化选项

优化技术说明配置项
Clang LTO链接时优化,跨编译单元优化CONFIG_LTO_CLANG_THIN
PGO基于运行时 profile 的优化CONFIG_PGO_CLANG
CPU 微架构针对特定 CPU 系列优化CONFIG_MNATIVE_AMD / CONFIG_MNATIVE_INTEL

36.7 initramfs 工具链对比

initramfs 是在内存中运行的临时根文件系统,负责加载必要驱动后挂载真正的根分区。

工具默认使用的发行版特点
mkinitcpioArch Linux配置基于 HOOKS 管道,镜像精简
initramfs-toolsDebian/Ubuntu基于脚本,兼容性好
dracutFedora/RHEL/openSUSE事件驱动、模块化、通用性强
booster新兴工具速度极快,用 Go 编写

生成 initramfs 的核心逻辑相同:都将内核模块、关键工具、初始化脚本打包成一个 cpio 归档文件,由内核在启动时解压并执行。

详细的 initramfs 配置参考 40-引导流程与GRUB


36.8 内核命令行参数

内核命令行参数在引导时传递给内核,影响系统行为。

# 查看当前启动参数
cat /proc/cmdline
 
# 常用内核参数
# root=UUID=xxxx 指定根分区
# rw / ro 根分区读写/只读挂载
# quiet 减少启动日志输出
# loglevel=3 (0=紧急, 7=调试)
# nomodeset 禁用 KMS(显卡故障时)
# init=/bin/bash 直接进入 shell(绕过 init)
# systemd.unit=rescue.target 救援模式
# systemd.unit=emergency.target 紧急模式
# mitigations=off 禁用 CPU 漏洞缓解(性能优先)
# intel_iommu=on / amd_iommu=on 启用 IOMMU
# nvidia-drm.modeset=1 NVIDIA DRM 模式设置

GRUB 中配置(编辑 /etc/default/grub):

GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=3"
GRUB_CMDLINE_LINUX=""

修改后运行 sudo grub-mkconfig -o /boot/grub/grub.cfg 生效。

systemd-boot 中配置(编辑 /boot/loader/entries/*.conf):

options root=UUID=xxxx rw quiet loglevel=3

不需要重新生成配置,直接编辑即生效。


36.9 内核调试与追踪

dmesg 与内核日志

# 查看内核环形缓冲区
dmesg
dmesg -H # 人类可读格式(时间戳+颜色)
dmesg -T # 显示可读时间戳
dmesg -w # 实时跟踪(类似 tail -f)
dmesg -l err,warn # 按级别过滤(emerg,alert,crit,err,warn,notice,info,debug)
 
# printk 日志级别
# 0 KERN_EMERG 系统不可用
# 1 KERN_ALERT 必须立即处理
# 2 KERN_CRIT 严重错误
# 3 KERN_ERR 错误
# 4 KERN_WARNING 警告
# 5 KERN_NOTICE 一般通知
# 6 KERN_INFO 信息(默认)
# 7 KERN_DEBUG 调试
 
# 控制终端显示的日志级别
cat /proc/sys/kernel/printk # 四个值:console_loglevel, default_level, minimum_console_level, default_console_level
echo "3 4 1 7" | sudo tee /proc/sys/kernel/printk

ftrace 内核函数追踪

# 挂载 tracefs(通常已自动挂载)
mount -t tracefs tracefs /sys/kernel/tracing
 
# 查看可用追踪器
cat /sys/kernel/tracing/available_tracers
 
# 启用 function_graph 追踪器
echo function_graph > /sys/kernel/tracing/current_tracer
echo 1 > /sys/kernel/tracing/tracing_on
 
# 过滤特定函数
echo 'schedule' > /sys/kernel/tracing/set_ftrace_filter
 
# 查看追踪结果
cat /sys/kernel/tracing/trace
 
# 停止追踪
echo 0 > /sys/kernel/tracing/tracing_on
echo nop > /sys/kernel/tracing/current_tracer

使用 trace-cmd 简化操作

# 安装
sudo apt install trace-cmd # Debian/Ubuntu
sudo dnf install trace-cmd # Fedora
sudo pacman -S trace-cmd # Arch
 
# 记录调度器活动
trace-cmd record -p function_graph -g schedule
 
# 查看报告
trace-cmd report

kprobes 动态探针

# 在 do_sys_open 函数入口设置探针
echo 'p:myprobe do_sys_openat2 dfd=%di filename=%si' \
 > /sys/kernel/tracing/kprobe_events
 
# 启用探针
echo 1 > /sys/kernel/tracing/events/kprobes/myprobe/enable
 
# 查看输出
cat /sys/kernel/tracing/trace
 
# 清理
echo 0 > /sys/kernel/tracing/events/kprobes/myprobe/enable
echo '-:myprobe' > /sys/kernel/tracing/kprobe_events

eBPF / bpftrace

# 安装 bpftrace
sudo apt install bpftrace # Debian/Ubuntu
sudo dnf install bpftrace # Fedora
 
# 追踪所有 open 系统调用
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
 
# 统计每个进程的系统调用次数
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
 
# 查看磁盘 I/O 延迟
sudo bpftrace -e 'kprobe:blk_account_io_done { @latency[comm] = hist(nsecs); }'

更多追踪工具参考 50-BPF与系统追踪


36.10 内核安全更新

确保内核安全是系统维护的核心任务之一:

# 检查当前内核中是否有已知 CVE(Debian/Ubuntu)
apt list --upgradable | grep linux-image
 
# 检查内核版本对应的安全公告
# kernel.org 安全公告: https://www.kernel.org/category/security.html
 
# 使用 spectre-meltdown-checker 检查漏洞缓解状态
git clone https://github.com/speed47/spectre-meltdown-checker.git
cd spectre-meltdown-checker
sudo ./spectre-meltdown-checker.sh
 
# 查看当前启用的 CPU 漏洞缓解措施
cat /sys/devices/system/cpu/vulnerabilities/*

内核安全加固选项速查

# 查看内核编译的安全配置
zcat /proc/config.gz | grep -E "_HARDEN|_RANDOM|LOCKDOWN|_STRONG|CFI"

常用的安全内核参数:

mitigations=auto|off CPU 漏洞缓解策略
lockdown=integrity|confidentiality 内核锁定模式
init_on_alloc=1 分配时初始化内存
init_on_free=1 释放时初始化内存
slab_nomerge 禁止 slab 合并
page_alloc.shuffle=1 页面分配随机化
randomize_kstack_offset=on 内核栈偏移随机化

36.11 内核模块编写入门

// hello.c - 最简单的内核模块
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple hello world module");
MODULE_VERSION("1.0");
 
static int __init hello_init(void)
{
 pr_info("Hello, kernel!\n");
 return 0;
}
 
static void __exit hello_exit(void)
{
 pr_info("Goodbye, kernel!\n");
}
 
module_init(hello_init);
module_exit(hello_exit);

Makefile

obj-m += hello.o
KDIR := /lib/modules/$(shell uname -r)/build
 
all:
	make -C $(KDIR) M=$(PWD) modules
 
clean:
	make -C $(KDIR) M=$(PWD) clean
# 确保已安装内核头文件
sudo apt install linux-headers-$(uname -r) # Debian/Ubuntu
sudo dnf install kernel-devel # Fedora/RHEL
 
# 编译
make
 
# 加载
sudo insmod hello.ko
 
# 查看输出
dmesg | tail
 
# 查看已加载模块
lsmod | grep hello
 
# 卸载
sudo rmmod hello

36.12 小结

主题关键要点
内核架构进程调度、内存管理、VFS、网络栈、设备驱动五大子系统
版本管理mainline → stable → LTS 三级体系
信息接口/proc 提供进程和系统状态,/sys 提供设备和驱动配置
模块管理modprobe(智能)、insmod(底层)、DKMS(自动重编译)
参数调优sysctl 运行时调整,配置文件永久生效
编译定制menuconfig 配置 → make 编译 → modules_install + install
跨发行版不同 initramfs 工具但原理一致,推荐使用发行版打包方式
调试dmesg、ftrace、kprobes、eBPF/bpftrace
安全关注 CVE、启用内核锁定、控制 printk 权限

36.13 资源链接


交叉链接:内核是操作系统的基石。理解其架构后,可进一步学习 29-操作系统概述与结构40-引导流程与GRUB39-系统调优与性能分析