Linux 驱动开发-内核模块设计笔记 0

内核模块设计

1.模块化编程原因:Linux 内核庞大,需要大量组件,一起集成会导致镜像文件过大

内核模块操作命令:

加载:

insmod xxx.ko

卸载:

rmmod xxx.ko

查看:

lsmod | grep xxx.ko

内核模块编程头文件必备

 #include<linux/init.h>
 #include<linux/modules.h>

内核模块函数出入口

 module_init(function_name)
 module_exit(function_name)

解释:

 i. 当终端调用insmod 命令时,module_init(function_name)函数将被内核调用

 ii. rmmod 命令调用 module_exit(function_name)

编程模型:

#include<linux/init.h>
#include<linux/modules.h>
/*
内核传参:
     name:变量名
     type:类型:bool;int;charp(字符串)
     perm:访问权限: S_IRUGO:读权限 S_IWUSR:写权限

*/
moduel_param(name,type,perm)


static int hell_init(void)
{
    printk(KERNEL_WARNING,”HELLO WORLD!\N”);
    .....;
    return 0;
}

static void hell_exit(void)
{
    ....;
}
/*模块附加信息申明*/
MODULE_LICENSE(“GPL等”);
MODULE_AUTHOR(“作者”);
MODULE_DESCRIPTION(“模块信息描述”);
MODULE_VERSION(“版本申明”);

module_init(hell_init);
module_exit(hell_exit);

模块参数传递:

int a=1;
char* sr;
moduel_param(a,int ,S_IRUGO);
moduel_param(sr,charp,S_IWUSR);

加载时传递参数可用:

insmod xxx.ko a=3

内核符号及导出:

a) 如果模块需要将定义的函数交给其他外部模块使用,则必须使用模块符号导出宏

b) 模块导出,例如在模块中添加下面的宏

EXPORT_SYMBOL(符号名); //只能用于包含GPL许可证

Makefile 编写格式说明:

 /*obj-m指定编译成模块文件,xxx.o为目标文件*/
 obj-m := xxx.o

 /*针对多文件内核模块*/
 xxx-objs := file1.o file2.o 

 /*定义保存内核源码的路径*/
 KERNELPATH:= /......

/*
all:目标
-C: 指定源码依赖所在路径
M: 指定模块文件所在路径
*/
all:
    make -C $(KERNELPATH)  M=$(PWD) modules CROSS_COMPILE=arm-llinux- ARCH=arm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值