C 在Linux内核模块中设置动态变量

C 在Linux内核模块中设置动态变量,c,linux,linux-kernel,kernel-module,C,Linux,Linux Kernel,Kernel Module,我已经做了一个新的LinuxTCPCONG算法实现,在代码中有一些静态变量,现在我希望通过使用一些配置方法使它们成为动态的 根据我在内核级编程中的理解,我们不能加载一些文本文件并将值放入其中,然后通过程序读取 但是我需要一些其他东西来使这些值成为动态的,这样用户就可以在每次用户更改值时不必编译内核代码就可以更改它们 我听说proc条目可以帮助我们,但我不确定这是否是正确的方法。不确定ioctl()是否也有帮助 有人能告诉我们如何使这些变量成为动态的,这样我们就可以动态地更改它们并设置值。我建议使

我已经做了一个新的LinuxTCPCONG算法实现,在代码中有一些静态变量,现在我希望通过使用一些配置方法使它们成为动态的

根据我在内核级编程中的理解,我们不能加载一些文本文件并将值放入其中,然后通过程序读取

但是我需要一些其他东西来使这些值成为动态的,这样用户就可以在每次用户更改值时不必编译内核代码就可以更改它们

我听说proc条目可以帮助我们,但我不确定这是否是正确的方法。不确定ioctl()是否也有帮助


有人能告诉我们如何使这些变量成为动态的,这样我们就可以动态地更改它们并设置值。

我建议使用模块参数

在内核模块中包含
#包含

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

int a[5];
int count;
module_param_array(a, int, &count, 0);

int init_module(void)
{

    int i = 0;
    printk("\n Welcome to sample kernel module \n");

    for(i = 0; i < count; i++)
    {
       printk("\na[%d] = %d", i, a[i]);
    }

    return 0;

}

void cleanup_module()
{
     printk("\n Exit success \n");
}
使用
模块参数()
变量和
模块参数数组()
将数组传递给内核模块

请参阅如何将值传递给模块

下面是模块_param()的示例程序

#包括
#包括
#包括
#包括“MyHeader.h”
INTA=0,b=0,op=0;
模块参数(a,int,S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IWGRP);
模块参数(b,int,S|u IRUSR | S|u IWUSR | S|u IRGRP | S|IWGRP);
模块参数(op,int,S|U IRUSR | S|U IWUSR | S|U IRGRP | S|IWGRP);
int\uu init\u模块(void)
{
printk(“\n第二个加载的模块…”\n”);
如果((a==0)和&(b==0)和&(op==0))
{     
printk(“\n供应模块参数……”\n”);
printk(“\n insmod.ko op=a=b=\n”);
返回0;
}
开关(op)
{
案例1:
printk(“\n添加的结果:%d\n”,添加(a,b));
打破
案例2:
printk(“\n减法结果:%d\n”,子(a,b));
打破
案例3:
printk(“\n乘法结果:%d\n”,mul(a,b));
打破
案例4:
printk(“\n除法结果:%d\n”,div(a,b));
打破
违约:
printk(“\n未知操作…\n”);
}
返回0;
}
void cleanup_模块()
{
printk(“\n第二个模块未加载…”\n”);
}
将数组传递给内核模块的另一个示例

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

int a[5];
int count;
module_param_array(a, int, &count, 0);

int init_module(void)
{

    int i = 0;
    printk("\n Welcome to sample kernel module \n");

    for(i = 0; i < count; i++)
    {
       printk("\na[%d] = %d", i, a[i]);
    }

    return 0;

}

void cleanup_module()
{
     printk("\n Exit success \n");
}
#包括
#包括
#包括
int a[5];
整数计数;
模块参数数组(a、int和count,0);
int init_模块(void)
{
int i=0;
printk(“\n欢迎使用示例内核模块\n”);
对于(i=0;i
除了模块param,以下链接中还建议了其他替代方案。

许多内核模块将文件放在
/proc
文件系统中,在该文件系统中,数据确实以文件的形式呈现,并且可以通过正常的用户空间文件操作进行修改


还有sysctl接口。

可以完成proc条目,但是如果用户更改proc条目中的值,在我们重新启动模块之前,这些值不会得到更新。那么,我们是否有办法不需要重新启动模块,并且在模块正在进行的过程中更新值?@NitinGoyal您的模块中有一个特殊的函数,在读取proc文件时调用,另一个函数在写入proc文件时调用。因此,一旦它们被写入,您肯定会得到更改。例如,请参阅如何使用procfs。是的,谢谢,我同意可以使用moduleparam,但它还需要从某处读取值。。要么我们需要在env vars中定义var,要么创建一些proc条目?