精华内容
下载资源
问答
  • Linux 内核模块参数学习module_parammodule_param(参数名,参数类型,参数读写权限) byte short ushort int uint long ulong charp(字符指针) bool invbool(布尔的反) 注意PS:今天在使用charp的时候对此理解有误,...

    Linux 内核模块参数学习module_param


    module_param(参数名,参数类型,参数读写权限)

    • byte
    • short
    • ushort
    • int
    • uint
    • long
    • ulong
    • charp(字符指针)
    • bool
    • invbool(布尔的反)

    注意

    PS:今天在使用charp的时候对此理解有误,使用了如下定义方式:

    char buff[1024] = "Hello World\n This is a Test!\n";
    module_param(buff,charp,0644);

    加载的时候是木有问题的,但是我到/sys/module/xxx/parameter/下面看buff这个文件的时候,系统立马崩掉!
    所以这样的用法是严重不对的,正确的用法是:

    char *str = "Hello World!"
    module_param(str,charp,0666);

    可是我们需要修改显示内容怎么办??这里的Hello World!为常量,是只读的,不能被修改的!怎么办?还好str是可以修改的,我们重新把buff用起来,对代码修改下:

    char *str = "Hello World!"
    module_param(str,charp,0666);
    char buff[1024] = "Hello World\n This is a Test!\n";
    
    void TestFunction()
    {
        str = buff;
    }
    

    按照上面的方法,再到/sys/module/xxx/parameter/下看变量的时候,就不会崩掉了!

    崩掉的主要原因是:charp为字符串指针,而不为数组指针!!!

    展开全文
  • linux驱动开发--内核模块参数

    千次阅读 2013-12-26 08:55:55
    内核模块参数,验证小例子: /** *Copyright (c) 2013.TianYuan *All rights reserved. * *文件名称: Modparma.c *文件标识: 模块参数的验证 * *当前版本:1.0 *作者:wuyq * *取代版本:xxx *原作者:xxx *完成...

    内核模块参数,验证小例子:

    /**
    *Copyright (c) 2013.TianYuan
    *All rights reserved.
    *
    *文件名称: Modparma.c
    *文件标识: 模块参数的验证
    *
    *当前版本:1.0
    *作者:wuyq 
    *
    *取代版本:xxx
    *原作者:xxx
    *完成日期:2013-11-18
    */
    #include <linux/init.h>
    #include <linux/module.h>
    
    /*内核提供的机制:在用户空间修改内核模块中全局变量的值*/
    /*安装模块的时候,可以指定参数的值:\
    如insmod modparam.ko mpshort=100 mpint=200 mpstring="nihao" mparray=300,400*/
    /*ls /sys/module/modparam/parameters*/
    /*cat mparray; 有权限的能够写echo 55 > mpshort;cat mpshort*/
    MODULE_LICENSE("GPL");
    
    /* 定义全局变量*/
    static short mpshort = 1;
    static int mpint = 10;
    static char *mpstring = "hello";
    static int mparray[2] = {100, 200};
    /*模块参数的声明*/
    module_param(mpshort ,short, S_IRWXU);
    module_param(mpint, int , S_IRUSR);
    module_param(mpstring, charp, 00400);/*char* */
    module_param_array(mparray, int, NULL, 00400); 
    
    static int __init modparam_init(void)
    {
    	printk("mpshort = %d\n", mpshort);
    	printk("mpint = %d\n", mpint);
    	printk("mpstring = %s\n", mpstring);
    	printk("mparray = %d, %d\n", mparray[0], mparray[1]);
    	return 0;
    }
    
    static void __exit modparam_exit(void)
    {
    	printk("mpshort = %d\n", mpshort);
    	printk("mpint = %d\n", mpint);
    	printk("mpstring = %s\n", mpstring);
    	printk("mparray = %d, %d\n", mparray[0], mparray[1]);
    }
    
    module_init(modparam_init);
    module_exit(modparam_exit);
    


    展开全文
  • Linux2.6允许用户insmod的时候往内核模块里面传递参数,它主要使用module_param宏定义来实现这一功能。module_param的定义可以在include/linux/moduleparam.h文件里面查看到,它的原型为:module_param(name, type, ...

    Linux2.6允许用户insmod的时候往内核模块里面传递参数,它主要使用module_param宏定义来实现这一功能。

    module_param的定义可以在include/linux/moduleparam.h文件里面查看到,它的原型为:

    module_param(name, type, perm);

    module_param_array(name, type, nump, perm);

    其中module_param是用来传递变量参数的,module_param_array是用来传递数组参数的。

    name是在模块中定义的变量名称,type是变量的类型,perm是权限掩码,用来做一个辅助的sysfs入口。

    nump是传入数组的数目,是一个int指针。

     

    module_param支持传递的参数类型有:

    bool:布尔型
    invbool:一个布尔型( true 或者 false)值(相关的变量应当是 int 类型). invbool 类型颠倒了值, 所以真值变成 false, 反之亦然.
    charp :一个字符指针值. 内存为用户提供的字串分配, 指针因此设置.
    int:整形
    long:长整形
    short:短整形
    uint:无符号整形
    ulong:无符号长整形
    ushort:无符号短整形
    基本的变长整型值. 以 u 开头的是无符号值. 

     

    perm 字段是一个权限值,表示此参数在sysfs文件系统中所对应的文件节点的属性。你应当使用 <linux/stat.h> 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.当perm为0时,表示此参数不存在 sysfs文件系统下对应的文件节点。 否则, 模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录, 带有给定的权限.。

    权限在include/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
    使用 S_IRUGO 参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.

     

     

     

    下面看一下实验的例子:

     

    Makefile文件:

     

    运行命令:

     

    sudo insmod hello.ko msg_buf=veryCD

    然后使用dmesg可以查看到printk的输出:
    [35983.685059] veryCD
    [35983.685067] n_arr[0]=1
    [35983.685072] n_arr[1]=2
    [35983.685075] n_arr[2]=3
    [35983.685079] n_arr[3]=4
    [35983.685083] n_arr[4]=5
    [35983.685087] n_arr[5]=7
    [35983.685091] n_arr[6]=1
    可以看出,实现n_arr的长度应该为5,而n为7,驱动里面并没有检测出,n_arr[5],n_arr[6]已经越界了,,,
    但是insmod的时候却是会检测n_arr的长度的,,
    输入命令:
    sudo insmod hello.ko msg_buf=veryCD n_arr=1,2,3,4,5,6
    但是提示出错了,:
    insmod: error inserting 'hello.ko': -1 Invalid parameters
    因为n_arr的数组长度为5,当输入的数组长度小于等于5的时候,insmod可以加载模块成功,
    sudo insmod hello.ko msg_buf=veryCD n_arr=1,2,3
    [36315.732903] veryCD
    [36315.732908] n_arr[0]=1
    [36315.732909] n_arr[1]=2
    [36315.732911] n_arr[2]=3
    可以看出,module_param_array中的nump的值为实际的输入数组参数长度。
    然后当使用insmod加载内核模块,并传递数据参数的时候,系统会自动检测数组的长度,当输入的数组长度小于模块的数组长度是,insmod才会成功。

     

     

    展开全文
  • linux内核模块参数传递

    千次阅读 2019-06-26 22:33:02
    参数模块安装后会生成目录: /sys/module/模块名/parameters/ 示例:如果安装 了名字为 hello_model_param 的模块,则会生成 /sys/module/hello_model_param/parameters/ 这个文件夹下会生成...

    模块安装时候可以给模块中的变量传递数值,安装后,模块中变量的值就是安装时所传入的值 ,没有传递的变量,则使用代码中默认值。

    带参数的模块安装后会生成目录:
    /sys/module/模块名/parameters/
    示例:如果安装 了名字为  hello_model_param 的模块,则会生成
    /sys/module/hello_model_param/parameters/

    这个文件夹下会生成以参数为名字文件,其内容就是参数的值。可以使用cat 或echo操作这个文件,修改变量的值,但是一般情况下都不建议修改,所以这个权限的值一般设置只读的。

    模块中如果变量要通过安装时传参数覆盖默认值,则需要使用以下宏修饰:
    module_param,module_param_array

    说明:
    对于非数组类型变量使用module_param,语法:
    module_param(变量名,变量类型,变量的访问权限)  //变量的访问权限:变量会文件系统以一个文件形式呈现,这个文件权限属性就是“变量的访问权限”
    变量传递参数:insmod xx.ko 变量名=值

    对于数组类型变量使用 module_param_array , 语法:
    module_param_array(数组名,数组元素类型,&num,变量的访问权限) //num 是一个 char ,int,long 或uchar,uint,ulong类型的变量,用于保存传递给数组的元素个数。

    数组传递参数: insmod xx.ko 数组名=元素0,元素1,元素2,  ……


    基本类型有:
    bool   :布尔类型
    invbool:颠倒了值的bool类型;
    charp  :字符指针类型,内存为用户提供的字符串分配;(char *)
    int    :整型
    long   :长整型
    short  :短整型
    uint   :无符号整型(unsigned int)
    ulong  :无符号长整型(unsigned long)
    ushort :无符号短整型(unsigned short)

    指针类只能char*,对应名字 charp .

    访问权限:
    modlue_param 和 module_param_array 中的 perm 用于设定该参数的访问权限;
    perm 表示该参数在 sysfs 文件系统中所对应的文件节点的属性;你用该使用<linux/stat.h>中定义的权限值;这
    个值控制谁可以存取这些模块参数在 sysfs 文件系统中的表示;当 perm 为 0 时,表示此参数不存在 sysfs 文件
    系统下对应的文件节点;否则,模块被加载后,会出现 /sys/module/模块名/parameters/参数名 这类文件 ,带
    有给定的权限;
    比如:
    #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
    注意:如果一个参数被 sysfs 修改了,那么你的模块看到的参数值也被修改了,但是你的模块不会收到任何通知;
    你应当不要使模块参数可写,除非你准备好检测这个改变并因而作出反应;
     

    展开全文
  • 一、内核模块的单独编译 1、在需要单独编译为模块的目录里执行如下命令:进入当前要编译的文件夹内 make CONFIG_XENO_DRIVERS_NET_DRV_IGB=m -C /usr/src/linux-4.9.90 M=`pwd` modules make -C $(KDIR) M= $(PWD...
  • Linux动态修改内核参数命令——sysctl

    千次阅读 2018-03-05 15:11:33
    sysctl可以动态修改内核参数。可以修改的参数可以在/proc/sys/目录下查看,包含一些TCP/IP堆栈和虚拟内存系统的高级选项。经验丰富的人员可以通过合理配置这些参数来提高系统的性能。采用sysctl既可以读又可以写...
  • Linux修改内核参数

    千次阅读 2018-09-15 17:41:11
    Linux /proc/sys/kernel 和/proc/sys/vm下的文件控制内核的运行,可以通过修改参数的方式来改变内核功能(立即生效) 修改参数方法: 方法一: echo value &gt; /proc/sys/path [root@lulijuan ~]# ...
  • Linux内核模块管理

    2021-01-20 14:51:10
     修改内核参数  Linux内核采用的是模块化技术,这样的设计使得系统内核可以保持小化,同时确保了内核的可扩展性与可维护性,模块化设计允许我们在需要时才将模块加载至内核,实现动态内核调整。本文重点关注...
  • 很多时候我们内核驱动的模块需要模块参数来运行,这;如下面例子setenvbootargsmem=8;Uboot启动参数中的红色部分表示模块,蓝色部分;我们举例dm365_imp.oper_mode=;驱动文件dm365_ipipe.c被编译到dm3;staticu32...
  • 下面我们通过编写一个简单的内核模块直接获取当前系统时间。 1.1模块源码编写 在Linux内核源码中,定义了一个struct timeval结构体,结构体中有两个成员变量tv_sec,tv_usec,分别保存当前系统时间的秒和毫秒,...
  • centos7修改内核参数

    2017-11-12 03:35:00
    临时修改: a.开启内核路由转发功能:echo "1" >> /proc/sys/net/ipv4/ip_forward b.禁止所有的icmp回包(禁止其它机器ping本机):echo "1" >> /proc/sys/net/ipv4/icmp_echo_ignore_all c.调整所有的...
  • 大纲: 1.交叉编译环境搭建 2.内核模块的编写 3.将开发板连接上PC串口测试,加载模块 4.内核模块参数 5.总结
  • 如果希望给一个内核模块传递参数,则可以通过module_param()。参数用moudle_param宏定义来声明,它定义在moduleparam.h。下面是module_param宏的定义:/* This is the fundamental function for regi
  • Linux内核模块详解

    万次阅读 多人点赞 2019-08-26 09:22:36
    内核模块 实验目的 内核模块是Linux操作系统中一个比较独特的机制。通过这一章学习,希望能够理解Linux提出内核模块这个机制的意义;理解并掌握Linux实现内核模块机制的基本技术路线;运用Linux提供的工具和命令,...
  • 内核模块

    千次阅读 2011-07-20 18:25:37
    内核模块----linux内核的整体结构庞大,其中包含的组件也很多,如何使用需要的组件?1--把所有的组件都编译进内核文件,即zImage,bzImage,但这样会导致两个问题:一是生产的内核文件过大,二是,如果要添加或删除...
  • Linux内核模块编程与内核模块LICENSE——《Linux设备驱动开发详解(第3版)》预读
  • 内核模块的加载

    千次阅读 2015-04-27 17:49:46
    一般linux中有两个程序可以添加内核模块,modprobe和insmod,前者考虑到了各个模块之间可能出现的依赖关系,被依赖的模块会被自动载入,而insmod只是简单的尝试载入当前的模块。二者最终都是通过linux系统调用sys_...
  • 修改内核参数 通过修改 /etc/sysctl.conf 文件,来调整内核参数,下面是几个实例: [root@localhost ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 //开启内核路由转发功能(通过0或者1设置...
  • 本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,并给出具体...
  • Linux内核模块

    千次阅读 2007-11-02 08:56:00
    Linux设备驱动会以内核模块的形式出现,因此,学会编写Linux内核模块编程是学习Linux设备驱动的先决条件。4.1~4.2节讲解了Linux内核模块的概念和结构,4.3~4.8节对Linux内核模块的各个组成部分进行了展现,4.1~4.2...
  • linux内核模块笔记

    千次阅读 2014-12-21 20:58:43
    主题: 1. 嵌入式基础知识 2.... 模块参数 作业: 1.看linux/module.h。以后每天看课程中接触到的头文件 这个文件所在的位置:/home/zshh/work/driver/kernel/linux-3.5/include/linux 重点看
  • 1添加最简单的Linux内核模块

    千次阅读 2020-02-01 13:28:23
    3 理解Linux内核模块代码中的一些常见宏和参数。 4 掌握Linux内核模块程序和应用程序的差异。 二.实验背景 2.1用户态与内核态 图1.1 用户态与内核态关系示意图 2.2Linux内核模块LKM (Linux Ker...
  • Linux内核模块简介

    千次阅读 2016-08-27 10:22:12
    Linux内核模块简介
  • Linux的内核模块

    千次阅读 2018-05-16 14:43:33
    内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大...
  • 内核模块开发基础

    千次阅读 2013-07-18 09:39:06
    一,什么是内核模块 Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用需要的组件呢: 方法一:把所有的组件都编译进内核文件,即:zImage或bzImage,但这样会导致两个问题:一是生成的内核文件过大;二...
  • Linux学习记录--内核|内核模块编译

    千次阅读 2014-04-09 21:14:05
    内核|内核模块编译 (对于内核的知识觉得了解不够,等学习完LFS再来详细整理下这方面的知识)   内核:系统上面的一个文件,这个文件包含了驱动主机各项硬件的检测程序和驱动模块。   计算机真正工作的是硬件,...
  • 内核模块 module_param()传递参数

    千次阅读 2015-07-21 15:17:06
    3内核模块参数数组简介   4问题解答   5测试模块   1   简介 编辑   在用户态下编程可以通过main(intargc, char * argv []) 的参数来传递命令行参数,而编写一个内核模块则...
  • linux内核模块编译

    千次阅读 2014-05-14 09:47:44
    linux内核模块编译引言 为了清晰的编译Linux内核,内核编译系统使用Kbuild规则对编译的过程以及依赖进行规约。在内核模块的编译中,为了保持与内核源码的兼容以及传递编译链接选项给GCC,也使用Kbuild规则。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,038
精华内容 44,015
关键字:

修改内核模块参数