Linux 驱动开发-内核模块设计笔记 0
Posted hntea-hong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Linux 驱动开发-内核模块设计笔记 0的主要内容,如果未能解决你的问题,请参考以下文章