hello.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("GPL"); // 开源协议
MODULE_AUTHOR("WangYihang <wangyihanger@gmail.com>"); // 作者
MODULE_DESCRIPTION("Hello world of linux kernel learning."); // 描述
static int __init hello_init(void){
printk("Hello kernel!\n");
return 0;
}
static void __exit hello_cleanup(void){
printk("Goodbye kernel!\n");
}
/* 据说是宏声明 , 暂时还不太理解 */
module_init(hello_init); // 加载内核的时候调用的函数
module_exit(hello_cleanup); // 卸载内核的时候调用的函数
Makefile
obj-m += hello.o
CURRENT_PATH := $(shell pwd) # 获取当前工作目录路径
LINUX_KERNEL := $(shell uname -r) # 获取内核头信息
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
流程 :
1. make # 编译
2. insmod ./hello.ko # 将模块加载入内核
3. rmmod hello.ko # 卸载模块 (或 rmmod hello)
4. dmesg | tail # 查看内核模块的日志 , 输出内核日志的后十行