我已经制作了一个新的 Linux TCP cong 算法实现并且在此代码中有一些静态变量现在我希望它们通过使用一些配置方法是动态的。
根据我对内核级编程的理解,我们不能加载一些文本文件并将值放在那里并通过程序读取它..
但我需要其他东西来使这些值动态化,以便用户可以在每次用户更改值时更改它们而无需编译内核代码。
我听说过 proc 条目可以帮助我们,但我不确定这是否是正确的方法。不确定 ioctl() 是否也有帮助。?
有人可以给出一些关于如何使这些变量动态化的想法,以便我们即时更改它们并设置值..
最佳答案
我建议使用模块参数。
包括 #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
关于c - 在 Linux 内核模块中设置动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13716994/