从 main函数说起

我们在用户太写程序时都喜欢用main函数的如果参数来向程序内传递数据

#include <stlib.h>
#include <stdio.h>
int main(int argc,char **argv)
{exit(0);
}

其中argc为传入程序内参数的个数,argv为传入的参数 ,其中的第一个参数argv[0]为当前文件的含路径的名字,所以实际传入程序内的参数个数为argc-1个。

内核模块传入参数

内核模块中没有main函数,所以向模块内部传入参数可以通过module_param这个宏定义来实现:

// 原型
#define module_param(name, type, perm)     \module_param_named(name, name, type, perm)

name:传入参数名称
type:传入参数类型,有byte, short, ushort, int, uint, long, ulong, charp, bool,invbool这几种类型
perm:这个为sysfs中资源的访问权限,下面再细说,主要有以下权限类型在uapi/linux/stat.h中定义

#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    // 其他人可执行权限

模块 代码编写:

#include <linux/module.h>int num = 100;
module_param(num,int,S_IRUSR);static int __init param_init(void)
{printk("[%s] num = %d\r\n",__FUNCTION__,num);return 0;
}static void __exit param_exit(void)
{printk("[%s]  num = %d\r\n",__FUNCTION__,num)
}module_init(param_init);
module_exit(param_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Chen");

Makefile文件:

ifneq ($(KERNELRELEASE),)obj-m:=param.o
elseKERNEL_DIR:=/lib/modules/$(shell uname -r)/buildCURRENT_DIR:=$(shell pwd)ccflags-y:=-std=gnu99 -Wno-declaration-after-statement
all:$(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) modules
clean:$(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) clean
endif

编译 程序,安装模块,然后dmesg

模块安装后在/sys/module文件夹下会生成 对应模块名字的文件夹,进入文件夹内

进入文件夹,文件夹内parameters文件夹内会会有之前程序中的num

从图片中可以看出内核在文件系统中会生成对应的文件让用户访问,并且模块中module_param宏定义中的perm设置了用户只读权限,所以num文件权限与其对应。
当然你也可以设置可写权限来改变输入参数 的值,改变后内核模块中的 该 参数会改变但是不会有任何信息提示。

学习笔记四 :linux驱动之module_param的用法相关推荐

  1. 【嵌入式Linux学习笔记】Linux驱动开发

    Linux系统构建完成后,就可以基于该环境方便地进行开发了,相关的开发流程与MCU类似,但是引入了设备树的概念,编写应用代码要相对复杂一点.但是省去了很多配置工作. 学习视频地址:[正点原子]STM3 ...

  2. MAX6675ISA学习笔记-基于linux驱动

    目录 1.MAX6675简介 2.基本参数 3.引脚配置 4.参考电路 5.引脚功能描述 6.转换公式 7.读写的格式 8.时序 9.输出的数据内容​ 10.模拟程序书写 10.1.引脚配置 10.2 ...

  3. Linux学习笔记(四)-Linux常用命令

    常用命令格式 #command(指令) [-options] parameter1(参数1) parameter2(参数2)... 大小写区分,tab自动补全 Shell特殊字符 通配符 管道Pipe ...

  4. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机

    arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...

  5. linux系统管理学习笔记之八---linux文件与目录的管理及权限

    linux系统管理学习笔记之八---linux文件与目录的管理及权限 2010-01-05 09:00:49 标签:权限 管理 文件目录 linx [推送到技术圈] 版权声明:原创作品,允许转载,转载 ...

  6. ROS学习笔记四:理解ROS节点

    ROS学习笔记四:理解ROS节点 本节主要介绍ROS图形概念,讨论ROS命令行工具roscore.rosnode和rosrun. 要求 要求已经在Linux系统中安装一个学习用的ros软件包例子: s ...

  7. Linux学习笔记之——Linux系统内部相关介绍

    Linux学习笔记之--Linux系统内部相关介绍 摘要:主要记录一些比较有用的能够帮助理解和使用Linux的知识.比如一些相关概念.没兴趣的看看就好.知道有这么个东西.注意事项.和一些常用目录的作用 ...

  8. STM32F103学习笔记四 时钟系统

    STM32F103学习笔记四 时钟系统 本文简述了自己学习时钟系统的一些框架,参照风水月 1. 单片机中时钟系统的理解 1.1 概述 时钟是单片机的脉搏,是单片机的驱动源 用任何一个外设都必须打开相应 ...

  9. MySQL高级学习笔记(四)

    文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...

最新文章

  1. [书目20130216]深入浅出WPF
  2. grep查找时,去掉grep本身那一条
  3. 如何在NEO共识节点间分配任务
  4. matlab 状态估计,基于_当前_统计模型的目标状态估计MATLAB 实现
  5. 判断文件是否改变php,PHP判断文件是否被修改实例
  6. 华为商城抢购工具_华为套路太多,MATE40RS开启摇号模式,抽中资格仍需抢购
  7. 上周热点回顾(11.27-12.3)
  8. 学习参考《高性能MySQL(第3版)》中文PDF+英文PDF
  9. 算法解析——矩阵快速幂
  10. cmd命令:批量创建文件夹
  11. cubieboard服务器系统,CubieBoard_搭建自己的系统.pdf
  12. 蓝桥杯算法竞赛系列第五章——拔高篇之深度优先搜索(DFS)
  13. mybatis批量删除 java_Mybatis批量删除数据操作方法
  14. Boost(一)——Boost简介
  15. 回顾总结-----第九届中国云计算大会,量子计算机为最大亮点
  16. JavaScript点击button更改内容,清空页面
  17. GAZEBO 中 sdf文件详解
  18. pythonhiq | 计算LiH分子的哈密顿量(ongoing)
  19. Linux iftop 安装与参数详解 【转】
  20. SQL查询成绩表中的每科第三名

热门文章

  1. 学习外挂编写开发所必备技术
  2. 笔记本配置VM虚拟机没有摄像头情况解决
  3. 美国NeoCon展会观后体会,海沃氏Haworth时尚休闲风是否真的受追捧?
  4. javac和java_javac和java命令的详解
  5. POI移动sheet页顺序
  6. EFCore-6 反向工程
  7. Python消息库——kombu的简单使用
  8. 排队论和随机过程(性能优化CPU、服务器调度,软硬件开发者都需要知道的理论)
  9. php假期培训机构,西安PHP暑假技术学习
  10. [原创] 《老人与海》之我见