返回

在指定目录中构建 Linux 内核模块:Make 和 Kbuild 指南

Linux

在特定目录中使用 Make 和 Kbuild 构建文件

简介

掌握 Make 文件的编写对于 Linux 内核模块开发至关重要。本文将指导你如何在特定目录中生成文件,帮助你轻松编译并放置内核模块的生成文件。

准备工作

  1. 设置内核开发环境,安装必要的工具(如 Rust 编译器和 Linux 内核头文件)。
  2. 创建项目目录结构:
my-mod-folder/
    src/
        main.rs
    build/

Kbuild 文件

Kbuild 文件指导内核构建系统如何编译你的模块:

# SPDX-License-Identifier: GPL-2.0

obj-m := rustmod.o
rustmod-objs := main.o

KBUILD_OUTPUT_DIR := ../build
  • obj-m:要编译的模块名称。
  • rustmod-objs:模块中要编译的源文件。
  • KBUILD_OUTPUT_DIR:生成文件的目标目录。

Makefile 文件

Makefile 文件定义构建规则:

# SPDX-License-Identifier: GPL-2.0

KDIR ?= /lib/modules/`uname -r`/build

default:
    $(MAKE) -C $(KDIR) M=$PWD

modules_install: default
    $(MAKE) -C $(KDIR) M=$PWD modules_install
  • KDIR:内核构建目录路径。
  • default:编译模块的目标。
  • modules_install:将模块安装到内核的目标。

放置 Kbuild 和 Makefile

可将 KbuildMakefile 放在项目根目录或 src 目录中:

项目根目录:

my-mod-folder/
    src/
        main.rs
    build/
    Kbuild
    Makefile

src 目录:

my-mod-folder/
    src/
        Kbuild
        Makefile
        main.rs
    build/

编译和安装

运行以下命令:

make
make modules_install

注意

  • 设置正确的 obj-mrustmod-objsKDIR 值。
  • 若出现问题,检查是否有语法错误或缺少文件。

常见问题解答

  1. 为什么我的模块编译不成功?
    确保 KbuildMakefile 中的值正确,并且你具有编译内核模块所需的权限。

  2. 如何调试编译错误?
    使用 make V=1 查看详细的编译输出。

  3. 如何安装模块到不同的内核版本?
    KDIR 变量中指定目标内核版本的路径。

  4. 如何卸载模块?
    使用 sudo rmmod rustmod 命令。

  5. 如何查看模块的当前状态?
    使用 lsmod | grep rustmod 命令。

结论

掌握 MakeKbuild 文件的编写可以让你轻松地在特定目录中生成内核模块文件。通过遵循本文中的步骤,你可以自信地编译和安装模块,为你的 Linux 系统添加新功能。