2012-12-05 40 views
4

我已經做了一個新的Linux TCP cong算法實現,並且在這段代碼中有一些靜態變量,現在我希望它們通過使用某種配置方法是動態的。在Linux內核模塊中設置動態變量

按我的內核級編程的理解,我們不能加載一些文本文件,並把這些值在那裏,並通過程序讀取它..

,但我需要別的東西來使這些值動態的,所以用戶每次用戶更改值時都可以在不編譯內核代碼的情況下更改它們。

我聽說過可以幫助我們的proc條目,但我不確定這是否是正確的方法。不確定ioctl()是否也可以提供幫助。?

一些人能給出關於如何使這些變量動態的,所以我們飛和值的變化他們得到設置一些想法..

回答

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

+0

yeah謝謝,我同意moduleparam可以使用,但它也需要從某處讀取值..要麼我們需要在env變量中定義var或者創建一些proc條目..? – NitinG

+0

更新了替代品。 – Jeyaram

1

許多內核模塊將文件放在/proc文件系統中,其中的數據確實是以文件的形式呈現的,並且可以通過普通的用戶空間文件操作進行修改。

還有sysctl接口。

+0

耶proc條目可以完成,但如果用戶更改proc條目中的值,值將不會得到更新,直到我們重新啓動模塊。那麼,我們是否有辦法在不需要重新啓動模塊的情況下在模塊的正在進行的過程中更新值? – NitinG

+1

@NitinGoyal在模塊中有一個特殊功能,當讀取proc文件時會調用該函數,而在寫入proc文件時會調用另一個函數。所以你一旦寫完就肯定會有變化。見例如[這個簡單的例子](http://linux.die.net/lkmpg/x769.html)如何使用procfs。 –