Linux模块传参

1、模块传参意义

一个简单的C语言程序,在执行的时候通过命令行输入运行参数传递参数(main函数的参数),而模块化驱动也可以像普通程序一样,在加载时,通过命令行获取参数,只不过方法不一样而已,这个就是模块传递参数的意义。

模块参数存在的意义就是向用户提供一种随时向内核模块传递、修改参数的方法。比如串口驱动的波特率、数据位数、校验位、停止位这些参数,我们可以在驱动中定义相关变量,然后通过模块传参的方法去读写他们。

2、如何传参

在Linux内核中,提供了专门的宏用来在驱动中获取进行模块加载时传输的变量值:module_param和module_param_array、module_param_string,这三个内核宏定义的功能就是从命令行中获取参数。

(1)module_param(name, type, perm)

功能描述:用来从用户层获取参数值 

@name:既表示变量名称(驱动中存放值的变量),又表示参数名称(传参数时指定的参数名称)

@type:传递的参数类型,这里只支持常见的byte(没有char), short, ushort, int, uint, long, ulong,charp(指针)

@perm:参数在sysfs中作为文件的读写权限

这里注意,模块参数加载之后都会在/sys/module/模块名称/下对应一个文件,而perm指的就是我们对这个参数文件的访问权限,例如0644

(2)module_param_array(name, type, nump, perm)

功能描述:从用户层获取数组

@name:既是数组名称,又是变量名称

@type:数组成员类型,和module_param支持的type一致

@perm:权限,和module_param的perm一样

(3)module_param_string(name, string, len, perm)

功能描述:从用户层获取字符串

@name:参数名称(用户看见的)

@string:变量名称(模块变量)

@len:模块中存放变量的最大空间

@prem:权限

(4)MODULE_PARM_DESC(_parm, desc)

功能描述:当用户使用modinfo查看模块详细信息的时候,用来对参数功能进行描述,方便用户使用参数

@_parm:参数名称

@desc:描述字符串

3、应用实例

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

//这些参数必须要先定义,否则是没有空间存放这些参数的
static char *who = "wor    ld";
static int aa = 0x11;
MODULE_PARM_DESC(aa,"this is short var"); 

static short bb = 0x22;

static int cc_len = 0; 
static char cc[6] = {1,2,3,4,5,6};
static char str[12] = "wellcome !\n";

module_param(who, charp, 0644); //声明字符串,但是这里的字符串不能有空格
module_param(aa, int, 0644); //声明int变量
module_param(bb, short, 0644); //声明short变量
//module_param_array(cc, char, 0644); //声明字节,这种写法是错误的,编译报错,因为没有char类型
module_param_array(cc, byte, &cc_len, 0644);//声明数组,不能出现char类型
module_param_string(test, str, 6, 0644);

static int __init demo_init(void)
{
	char i = 0; 
	printk(KERN_DEBUG"demo_init !\n");

	printk("who = %s\n",who);
	printk("aa = %d\n", aa);
	printk("bb = %d\n",bb);
	for(i=0; i<6; i++)
	{
		printk("cc[%d] = %d\n", i, cc[i]);		
	}

	printk("str = %s\n", str);
	return 0;
}

static void __exit demo_exit(void)
{
	printk(KERN_DEBUG"demo_exit!\n");
}


module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

4、查看和修改参数

(1)加载时传递

(2)通过sysfs读写

在/sys/modules/模块名称/parameters/下有以参数名称为名的文件,可以直接进行读写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux内核命令行传参可以在运行内核时在命令行中添加参数。例如,要给内核传递 "debug" 参数,可以使用命令 "linux debug" 来启动内核。更多参数可以使用 "man bootparam" 来查看。 ### 回答2: 在Linux内核中,命令行传参可以通过在启动时使用启动参数来实现。当系统启动时,内核会读取启动命令行,并将其中的参数传递给内核。 在GRUB引导器中,可以编辑启动菜单并添加启动参数。在启动菜单中,可以按下"E"键编辑引导条目,然后找到以"linux"开头的行。在该行的末尾添加需要的参数,用空格分隔。完成后按下"F10"键来启动系统,内核会读取并使用这些传递的参数。 另一种方法是通过修改引导器的配置文件来设置默认的启动参数。在GRUB中,可以编辑"/etc/default/grub"文件,找到"GRUB_CMDLINE_LINUX"行,然后在引号中添加需要的参数。完成后保存文件并执行"sudo update-grub"命令使更改生效。 除了GRUB,其他引导器如SYSLINUX、LILO等也有类似的配置文件,请根据使用的引导器进行相应的操作。 通过这些方法,可以在Linux启动时传递参数给内核。这些参数可以用于控制内核启动的行为,如设置系统参数、加载特定模块、开启调试功能等。根据具体需求,可以按照上述步骤进行相应的设置和修改。 ### 回答3: 在Linux内核中,可以使用命令行传参来配置内核的行为。通过命令行传参,可以在启动系统时将特定的选项传递给内核。下面是一些步骤来实现这个过程: 1. 首先,开机时在引导加载程序(如GRUB)的启动菜单中选择要启动的内核项。 2. 在选择内核项后,按下"e"键,进入编辑模式。 3. 在编辑模式下,可编辑内核的命令行参数。在命令行参数中,可以指定各种选项和参数,用以配置内核。 4. 根据需要,在命令行参数中添加或修改选项。例如,可以指定内核的启动方式、硬件参数、系统参数等。 5. 修改完成后,按下"Ctrl+x"或"Ctrl+b"等组合键来启动内核。 此外,还有其他的方法来传递内核命令行参数,如修改GRUB的配置文件、通过/sys文件系统修改等。但无论是哪种方法,都可以通过命令行传参来配置内核的行为。 总结:Linux内核命令行传参是通过修改引导加载程序的启动菜单中的内核项来实现的。在编辑模式下,通过添加或修改内核命令行参数来配置内核的行为。内核命令行参数可以包括各种选项和参数,用以指定启动方式、硬件参数、系统参数等。这样,可以在启动系统时通过命令行传参来定制内核的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值