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的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习笔记之内核启动流程与模块机制

Linux 系统启动流程

Linux驱动linux内核模块简介

《Linux内核设计与实现》读书笔记- 中断处理转

linux驱动开发-模块驱动

linux驱动静态加载模块和动态加载模块的入口函数分别是啥?