内核命令行传参

来源:互联网 发布:少女与战车 知乎 编辑:程序博客网 时间:2024/06/06 02:38

内核程序如何通过命令行进行传递参数

1.明确内核程序的哪个变量将来需要通过命令行传递参数;
2.利用一下宏对内核变量进行声明,告诉内核,将来可以通过命令行的形式给这个变量传递的参数
module_param (name, type, perm);
功能:对需要进行传参的内核变量进行声明
参数说明:
name: 变量名
type: 变量数据类型 bool, inbool, char, uchar, short, ushort, int, uint, long, ulong, charp:字符指针
切记:内核编程不允许处理浮点数!
解决方法:
1.浮点数的运算放在应用程序中完成!
2.3 * 3.2 -> 23 * 32
perm:对变量的访问权限,例如:0664 不允许有可执行权限!
3.一旦声明完毕,在加载内核或者内核运行期间, 可以给内核这个变量传递参数

编写内核程序,掌握内核命令行传递参数

实施步骤:

   PC执行:   1.mkdir /opt/drivers/2.0    2.cd /opt/drivers/2.0   3.vim helloworld.c   4.vim Makefile   5.make   6.cp helloworld.ko /opt/rootfs/  ARM执行:   //不传参   1.insmod helloworld.ko    2.rmmod helloworld   //加载内核程序时,传参   3.insmod helloworld.ko irq=2000 pstr=china     4.rmmod helloworld   //内核程序运行期间,传参   5.insmod helloworld.ko irq=2000 pstr=china   一旦加载完毕,内核就会在/sys/module目录下生产一个跟内核程序同名的目录    helloworld=>/sys/module/helloworld/parameters,   如果变量进行声明时,权限非0,那么在parameters目录会有一个根变量同名的文件,将来可以修改这   个文件的内容间接来修改变量的值;   如果权限为0,没有同名的文件,只能在insmod时传递参数   6.cat /sys/module/helloworld/parameters/irq  读文件        7.echo 25000 > /sys/module/helloworld/parameters/irq    向文件写入25000      8.rmmod helloworld //查看变量irq的值

helloworld.c程序如下:

#include <linux/init.h>#include <linux/module.h>//定义全局变量static int irq;static char *pstr;static int fish[10];static int nr_fish; //记录数组有效的个数//命令行传参的声明module_param(irq, int, 0664); //权限非0module_param(pstr, charp, 0); //权限为0module_param_array(fish, int, &nr_fish, 0664);//问:权限为0或者非0,有什么区别?static int helloworld_init(void){    int i;    printk("%s:irq = %d, pstr = %s\n", __func__, irq, pstr);    for (i = 0; i < nr_fish; i++)        printk("%s:fish[%d] = %d\n", __func__, i, fish[i]);    return 0;}static void helloworld_exit(void){    int i;    printk("%s:irq = %d, pstr = %s\n", __func__, irq, pstr);    for (i = 0; i < nr_fish; i++)        printk("%s:fish[%d] = %d\n", __func__, i, fish[i]);}module_init(helloworld_init);module_exit(helloworld_exit);MODULE_LICENSE("GPL");

内核程序命令行传递参数之数组

如何给内核程序中的数组传递参数呢?

1.明确内核程序的哪个数组将来需要通过命令行传参;
2.一旦明确,对这个数组进行传参声明
module_param_array (name, type, nump, perm);
name:数组名
type: 类型
nump: 有效数组元素个数指针
perm: 访问权限,注意0和非零

对内存程序数组进行传递参数

PC机执行:        1.cd /opt/drivers/day02/2.0        2.vim helloworld.c        3.make        4.cp helloworld.ko /opt/rootfs        ARM上执行:        加载时传递参数:         1.insmod helloworld.ko irq=280 pstr=china fish=1,2,3,4,5,6         2.cat /sys/module/helloworld/parameters/fish         3.echo 100,200,300,400,500,600,700,800 > /sys/module/helloworld/parameters/fish         4.rmmod helloworld       // 注意:传参的个数不能超过定义数组时指定的长度       // 注意:内核要求,如果没有在内核程序运行期间传递参数的需求,内核要求变量在声明的时候      // 权限给0,目的为了节省内存资源;因为/sys/目录在系统启动的时候,已经作为sysfs虚拟文件系统的入口,这种文件系统的内容都是存在内存中;掉电就丢失;
原创粉丝点击