make -C $(KDIR) M=$(PWD) modules 是编译 Linux 内核模块的典型命令,其作用是通过内核构建系统编译当前目录下的模块代码。以下是分步解释:
1. 命令结构解析
make:调用 Make 工具,执行构建任务。-C $(KDIR):切换到KDIR目录(通常是内核源码目录)执行构建。M=$(PWD):指定模块源代码位于当前目录(PWD)。modules:目标参数,表示编译模块。
2. 变量含义
$(KDIR):- 通常指向内核源码目录(如
/lib/modules/$(uname -r)/build)。 - 包含内核头文件、配置和构建规则。
- 通常指向内核源码目录(如
$(PWD):- 当前工作目录(Present Working Directory),即模块源代码所在目录。
3. 执行流程
- 切换到内核目录:
bashcd $(KDIR) # 例如 /lib/modules/5.15.0-78-generic/build - 编译模块:
- 内核的
Makefile会递归调用当前目录(M=$(PWD))的构建规则。 - 编译结果(
.ko文件)生成在PWD目录。
- 内核的
4. 典型使用场景
- 编译内核模块:
bash # 假设模块代码在 /home/user/my_driver/ cd /home/user/my_driver/ make -C /lib/modules/$(uname -r)/build M=$(PWD) modules - 清理编译产物:
bash make -C $(KDIR) M=$(PWD) clean
5. 关键文件说明
Makefile(模块目录下):
makefile obj-m += my_module.o # 指定要编译的模块目标my_module.c:模块源代码文件。- 生成的
.ko文件:编译后的内核模块(如my_module.ko)。
6. 依赖关系
- 内核头文件:需确保
KDIR路径正确,且与当前运行内核版本匹配。 - 构建工具链:需安装
build-essential、linux-headers-$(uname -r)等包。
7. 验证编译结果
- 检查
.ko文件:
bash ls *.ko # 应看到 my_module.ko - 加载模块:
bash sudo insmod my_module.ko dmesg | tail # 查看内核日志
8. 常见问题
KDIR未设置:
bash export KDIR=/lib/modules/$(uname -r)/build- 权限不足:使用
sudo或以 root 用户执行。 - 代码错误:检查内核日志(
dmesg)和编译输出。
总结
该命令通过内核构建系统编译当前目录下的模块代码,利用内核的标准化流程处理依赖和配置,是开发 Linux 内核模块的标准方法。用户只需关注模块自身的逻辑,而无需手动处理复杂的构建细节。
1万+

被折叠的 条评论
为什么被折叠?



