• 2、模块传参和依赖


    一、模块传参

    使用函数 module_param(name,type,perm);

    • 将指定的全局变量设置成模块参数
    /*
    name:全局变量名
    type:
        使用符号      实际类型                传参方式
    	bool	     bool           insmod xxx.ko  变量名=0 或 1
    	invbool      bool           insmod xxx.ko  变量名=0 或 1
    	charp        char *         insmod xxx.ko  变量名="字符串内容"
    	short        short          insmod xxx.ko  变量名=数值
    	int          int            insmod xxx.ko  变量名=数值
    	long         long           insmod xxx.ko  变量名=数值
    	ushort       unsigned short insmod xxx.ko  变量名=数值
    	uint         unsigned int   insmod xxx.ko  变量名=数值
    	ulong        unsigned long  insmod xxx.ko  变量名=数值
    perm:给对应文件 /sys/module/name/parameters/变量名 指定操作权限(一般为0664)
    	#define S_IRWXU 00700
    	#define S_IRUSR 00400
    	#define S_IWUSR 00200
    	#define S_IXUSR 00100
    	#define S_IRWXG 00070
    	#define S_IRGRP 00040
    	#define S_IWGRP 00020
    	#define S_IXGRP 00010
    	#define S_IRWXO 00007
    	#define S_IROTH 00004
    	#define S_IWOTH 00002  //不要用 编译出错
    	#define S_IXOTH 00001
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    示例

    • 1、定义全局变量
    • 在这里插入图片描述
    • 2、使用函数将全局变量设置为模块参数
    • 在这里插入图片描述

    参数为数组 module_param_array(name,type,&num,perm);

    /*
    name、type、perm同module_param,type指数组中元素的类型
    &num:存放数组大小变量的地址,可以填NULL(确保传参个数不越界)
        传参方式 insmod xxx.ko  数组名=元素值0,元素值1,...元素值num-1  
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例

    查看结果

    • 1、编译之后安装模块
      在这里插入图片描述
    • 2、在Ubuntu日志中查看打印信息 dmesg
      在这里插入图片描述
    • 3、安装模块时传参
      在这里插入图片描述

    对参数进行描述

    MODULE_PARM_DESC(变量名,字符串常量);
    字符串常量的内容用来描述对应参数的作用

    modinfo可查看这些参数的描述信息

    二、模块之间的依赖

    模块的代码与其他内核代码公用统一的运行环境,也就是模块是在存在形式上独立,运行上其实和其他内核模块是一个整体,属于同一个程序。因此一个模块或者内核其他部分源码可以使用另一个模块的全局特性。

    一个模块中可以被其他地方使用的名称被称为导出符号,所有的导出符号被填在同一个表中,这个表被称为符号表

    最常用的可导出全局特性为全局变量和函数

    查看符号表的命令:nm

    • nm查看elf格式的可执行文件或目标文件包含的符号表,用法:nm 文件名

    两个用于导出模块中符号名称的宏:

    • EXPORT_SYMBOL(函数名或全局变量名)
    • EXPORT_SYMBOL_GPL(函数名或全局变量名)需要GPL许可证协议验证

    使用导出符号的地方,需要对这些符号进行extern声明后才能使用这些符号

    B模块使用了A模块导出的符号,此时称B模块依赖于A模块,则:

    • 1、编译次序:先编译A模块,在编译B模块。
      • 当两个模块处于不同的目录时:
        • ①、先编译导出符号的A模块
        • ②、拷贝A模块目录中的Modules.symvers到B模块目录中
        • ③、编译使用符号的B模块
        • 否则编译B模块时会有未定义错误
    • 2、加载次序:先插入A模块,再插入B模块,否则插入失败
    • 3、卸载持续:先写在B模块,在写在A模块,否则卸载失败

    三、内核空间和用户空间

    为了彻底解决一个应用程序出错不影响系统和其他app运行,操作系统给每个app分配了一个独立的假象地址空间,这个假象的空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中的一部分。32为Linux的虚拟地址空间大小为4G,并将其划分为两部分:

    • 1、0 - 3G用户空间:每个应用程序只能使用自己的虚拟地址空间
    • 2、3 - 4G内核空间:内核使用的虚拟地址空间,应用程序不能直接使用这份地址空间,但可以通过一些系统调用函数与其中某些空间进行数据通信。

    实际内存操作时,需要将虚拟地址映射到实际内存的物理地址,然后才能进行实际的内存读写

    四、执行流

    执行流:有开始有结束总体顺序执行的一段独立代码,又被称为代码上下文
    执行流分类:

    • 1、任务流–任务上下文(都参与CPU时间片轮询,都有任务五状态:就绪态、运行态、僵尸态、暂停态、睡眠态)
      • 1)、进程
      • 2)、线程
        • ①、内核线程:内核创建的线程
        • ②、应用线程:应用进程创建的线程
    • 2、异常流–异常上下文:
      • 1)、中断
      • 2)其他异常

    应用编程可能涉及到的执行流:

    • 1、进程
    • 2、线程

    内核编程可能涉及到的执行流:

    • 1、应用程序自身代码运行在用户空间,处于用户态-------------用户态app
    • 2、应用程序正在调用系统调用函数,运行在内核空间,处于内核态。即代码是内核代码但处于应用执行流(属于一个应用的线程或进程)-------------内核app
    • 3、一直运行于内核空间,处于内核态,属于内核任务的上下文-------------内核线程
    • 4、一直运行于内核空间,处于内核态,专门用来处理各种异常-------------异常上下文

    模块编程与应用编程的比较

    不同点内核模块应用程序
    API来源不能使用任何库函数各种库函数均可以使用
    运行空间内核空间用户空间
    运行权限特权模式运行非特权模式运行
    编译方式静态编译进内核镜像或编译特殊的ko文件elf格式的应用程序可执行文件
    运行方式模块中的函数在需要时被动调用从main开始顺序执行
    入口函数init_modulemain
    退出方式cleanup_modulemain函数返回或调用exit
    浮点支持一般不涉及浮点运算,因此printk不支持浮点数据支持浮点运算,printf可以打印浮点数据
    并发考虑需要考虑多种执行流并发的竞态情况只需考虑多任务并行的竞态
    程序出错可能会导致整个系统崩溃只会让自己崩溃
  • 相关阅读:
    为什么别人的网页有登录拦截而你没有,这就教你学会它
    缓存 (模拟两种:数据库提供数据到缓存、外界提供数据到缓存)
    从 0 到 1 打造企业数字化运营闭环
    人员定位系统如何实现危化企业安全生产?
    Docker安装Elasticsearch并启动密码xpack功能
    机器学习实战-系列教程8:SVM分类实战3非线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读
    Android 修复在 Settings 首页,按键盘方向键逐个单选
    【路径规划-TSP问题】基于粒子群结合蚁群算法求解旅行商问题附matlab代码
    第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第十节 Python——查找字符串中所有重复的字符)
    2022年最新最详细在IDEA中配置Tomcat(含有详细图解过程)、建立使用IEDA建立一个Web项目的案例
  • 原文地址:https://blog.csdn.net/qq_53402930/article/details/133651746