加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 22:53:48 所属栏目:Linux 来源:网络整理
导读:我已经制作了一个新的 Linux TCP cong算法实现,并且在这段代码中有一些静态变量,我希望它们通过使用一些配置方法是动态的. 根据我在内核级编程中的理解,我们无法加载一些文本文件并将值放在那里并通过程序读取它. 但我需要其他东西来使这些值动态化,以便用户
我已经制作了一个新的 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,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
module_param(op,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,&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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读