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

时间:2012-12-05 05:40:04

标签: c linux linux-kernel kernel-module

我已经制作了一个新的Linux TCP cong算法实现,并且在这段代码中有一些静态变量,现在我希望它们是动态的,使用一些配置方法。

根据我在内核级编程中的理解,我们无法加载一些文本文件并将值放在那里并通过程序读取它。

但我还需要其他东西来使这些值动态化,这样用户就可以在每次用户更改值时都不用编译内核代码来更改它们。

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

有人可以就如何使这些变量变为动态提出一些想法,以便我们在飞行中更改它们并设置值。

2 个答案:

答案 0 :(得分:2)

我建议使用模块参数。

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

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

请参阅如何将值传递给模块Passing an array as command line argument for linux kernel module

以下是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

答案 1 :(得分:1)

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

还有sysctl接口。