编译和安装Linux内核模块

0x01--获取当前linux内核源代码

直接apt-get install linux-source(这样做会下载到/lib/modules/$(shell uname -r)

或者下载当前内核版本的源码(网上乱找)

获取内核版本 uname -auname -r

0x02--编写驱动程序的Makefile

把这个makefile和你的module放在同一个目录.

ifneq ($(KERNELRELEASE),)
# complie <your module's name>.c
# obj-m := <your module's name>.o
obj-m := hello.o
else
# KERNELDIR := <your path to kernel>/build
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
    make −C $(KERNELDIR) M=$(PWD) modules
clean:
    make -C $(KERNELDIR) M=$(PWD) clean
# 缩进是必要的
endif

执行该Makefile文件时将跑到 KERNELDIR下调用make.

PWD指定要编译的驱动程序源文件所在的目录,$(shell pwd) 表示当前目录.

0x03--编写内核模块

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>

static int __init hello_init(void)
{
        printk("Hello world");
        return 0;
}
static void __exit hello_exit(void)
{
        printk("Goodbye world");
}

module_init(hello_init);// 指定模块初始化函数
module_exit(hello_exit);// 指定模块卸载(退出)函数

MODULE_LICENSE("GPL");

保存为<module name>.c就可以啦.

(我这里是hello.c)

0x04--编译,安装,卸载,查看

编译:make

安装:insmod <module name>modprobe <module>(详细用法请参阅命令帮助和相关文档)

卸载:rmmod <module name>modprobe -r <module name>

查看:lsmod | grep <module name>modinfo <module name>.ko

(可以dmesg查看printk打印的消息)