构建和运行模块

为了编译驱动程序,必须有 Linux 内核源代码树。

假设源位于/lib/modules/<kernel-version>,以下 Makefile 会将文件 driver.c 编译成 driver.ko 内核对象

obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)

all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

注意这个 Makefile 如何在内核的 build 目录中调用 make

编译步骤成功完成后,驱动程序的 src 目录看起来会像这样:

driver.c  driver.ko  driver.mod.c  driver.mod.o  driver.o  Makefile  modules.order  Module.symvers

为了运行模块,有必要插入到运行的内核中:

$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!

$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...