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

5
我制作了一个新的Linux TCP拥塞算法实现,并在这段代码中使用了一些静态变量。现在我想通过使用某些配置方法使它们变成动态的。
据我理解,在内核级编程中,我们无法加载某些文本文件并将其中的值放入其中,并通过程序读取它们。
但我需要其他东西来使这些变量动态,以便用户可以在不每次更改值时编译内核代码的情况下更改它们。
我听说过proc条目可以帮助我们,但我不确定那是否是正确的方法。也不确定ioctl()是否有所帮助。
能否给出一些关于如何使这些变量动态的想法,以便我们可以在运行时更改它们并设置值。
2个回答

2

我建议使用模块参数。

在内核模块中包含 #include <linux/moduleparam.h>

使用 module_param() 变量和 module_param_array() 将数组传递给内核模块。

有关如何向模块传递值的参考,请访问将数组作为Linux内核模块命令行参数传递

这里是一个使用 module_param() 的示例程序。

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

#include "MyHeader.h"

int a = 0, b = 0, op = 0;


module_param(a, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
module_param(b, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
module_param(op, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);

int __init init_module(void)
{
  printk("\n Second Module Loaded...... \n");

  if((a == 0) && (b == 0) && (op == 0))
  {     
         printk("\n Supply Module Parameters...... \n");
         printk("\n insmod <modulename>.ko op=<1-4> a=<int data> b=<int data> \n");
         return 0;
  }

 switch(op)
  {
    case 1:
         printk("\n Result of Addition:%d \n", add(a,b));
         break;
    case 2:
         printk("\n Result of Subtraction:%d \n", sub(a,b));
         break;
    case 3:
         printk("\n Result of Multiplication:%d \n", mul(a,b));
         break;
    case 4:
         printk("\n Result of Division:%d \n", div(a,b));
         break;
    default:
         printk("\n Unknown Operation... \n");
  }

  return 0;
}

void cleanup_module()
{
  printk("\n Second Module UN--Loaded...... \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");
}

除了模块参数外,以下链接中还提出了其他替代方案。 http://kernelnewbies.org/FAQ/WhyWritingFilesFromKernelIsBad

该链接详细介绍了为什么从内核中编写文件是不好的选择。

是的,谢谢。我同意可以使用moduleparam,但它还需要从某个地方读取值...我们要么需要在环境变量中定义该变量,要么创建一些proc条目...? - NitinG

1
许多内核模块将文件放置在/proc文件系统中,其中数据确实呈现为文件,并且可以通过普通用户空间文件操作进行修改。
还有sysctl接口。

是的,可以使用proc entries来完成,但是如果用户更改了proc entries中的值,则在重新启动模块之前,这些值将不会得到更新。那么,我们是否有一种方法,在不需要重新启动模块的情况下,就能够在模块的进行过程中更新这些值呢? - NitinG
1
@NitinGoyal,你的模块中有一个特殊函数,当读取proc文件时会被调用,还有另一个函数,当写入proc文件时会被调用。因此,你肯定会在写入后立即得到更改。请参考这个简单的例子来了解如何使用procfs。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接