[国嵌攻略][104][Linux内核模块设计]

内核模块示例

复制代码
#inlcude <linux/init.h>
#inlcude <linux/module.h>

static int hello_init(){
    printk(KERN_WARNING”hello_init\n”);
    return 0;
}

static void hello_exit(){
    printk(KERN_INFO”hello_exit\n”);
}

module_init(hello_init);
module_exit(hello_exit);
复制代码

特点:

内核模块代码没有main函数,内核模块的入口由module_init()指明。当使用insmod命令加载内核模块时,宏module_init()所指明的函数hello_init会得到调用。当使用rmmod命令卸载内核模块时,宏module_exit()所指明的函数hello_exit会被调用。内核模块包含<linux/init.h>和<linux/module.h>两个头文件。

 

编译内核模块

obj-m := hello.o

hello-objs = file1.o file2.o file3.o

 

KDIR := .../linux_kernel

 

all:

    make –C (KDIR)M=(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

 

clean:

    rm –f *.o *.ko *.order *.symvers

说明:

1.目标文件

obj-m表示要生成的模块名,如果有多个文件生成一个模块,需要加上xxx-objs来指明依赖的文件。

2.内核路径

KDIR用来指明生成生成的内核模块依赖的内核代码。

3.编译规则

–C (KDIR)M=(PWD)表示要编译的内核模块,modules ARCH=arm CROSS_COMPILE=arm-linux-表要编译的内核模块使用的处理器架构和交叉工具链。

 

hello.c

复制代码
#include <linux/init.h>
#include <linux/module.h>

//加载函数
static int hello_init(){
    printk(KERN_WARNING"hello_init\n");
    
    return 0;
}

//卸载函数
static void hello_exit(){
    printk(KERN_WARNING"hello_exit\n");
}

module_init(hello_init);
module_exit(hello_exit);
复制代码

 

Makefile

复制代码
obj-m := hello.o

KDIR := /space/work/guoqian/liunxkernel/000/kernel/linux-mini2440

all :
    make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
    
clean :
    @rm -f *.o *.ko *.mod.* *.order *.symvers
复制代码

 

posted @   盛夏夜  阅读(261)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示