前言
内核ko文件的框架及Makefile
一、内核代码
通过输出hello world例子进行讲解:
#include <linux/init.h> // 包含了模块初始化和清理函数的宏定义
#include <linux/module.h> // 包含了需要的所有模块相关的定义
MODULE_LICENSE("GPL"); // 模块的许可证信息
MODULE_AUTHOR("Your Name"); // 模块的作者
MODULE_DESCRIPTION("A simple example Linux kernel module"); // 模块的描述信息
static int hello_init(void) { // 模块加载时执行的函数
printk(KERN_INFO "Hello, world!\n"); // 将 "Hello, world!" 字符串记录到内核日志中
return 0; // 返回0表示模块加载成功
}
static void hello_exit(void) { // 模块卸载时执行的函数
printk(KERN_INFO "Goodbye, world!\n"); // 将 "Goodbye, world!" 字符串记录到内核日志中
}
module_init(hello_init); // 定义模块加载时要执行的函数
module_exit(hello_exit); // 定义模块卸载时要执行的函数
二、Makefile
ifneq ($(KERNELRELEASE),)
mymodule-objs := hello_world.o
obj-m := hello_world.o
else
PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
三、执行结果
执行make后编译出hello_world.ko文件,执行insmod hello_world.ko,rmmod hello_world.ko,在/var/log/kern.log文件中会看到加载和卸载内核时的打印信息。