2016-07-12 64 views
0

我正在嘗試讀取正在工作的模塊的配置文件(位於/在內核的特定位置生成)。在內核中按行讀取配置文件行

我可以通過使用帶有O_RDONLY標誌的filp_open(只讀)來讀取整個文件,但我無法想出一種逐行閱讀的方式。

目前代碼

f = filp_open("/etc/my_module",O_RDONLY, 0); 

if (f==NULL) { 
    printk("Error in loading config for birdge.\n"); 
    return 1; 
} else { 
    fs = get_fs(); 
    set_fs(get_ds()); 

    /* read line config here */ 
    f->f_op->read(f, buf, 128, &f->f_pos); 

    set_fs(fs); 
    printk("buf:%s\n",buf); 
} 

Linux內核版本:3.8.0-29-通用

我所試圖實現的是把每一個(第n)線到緩衝區數組(字符* BUF [ 128] [128]),稍後我將使用純c來分析參數和值。

通過這種方式,配置文件中的變量可以在模塊的運行時使用,當然我會做一些條件檢查配置是否正常。

感謝

+0

不,這幾乎完全是錯誤的做法。 –

+0

你應該閱讀怎麼問。這是一個可怕的問題。 –

+0

有關配置複雜事物的靈感,請查看內核如何配置網絡,路由和防火牆。 –

回答

2

[TL; DR:避免做這樣的事,作爲直接從內核空間讀取文件系統的文件。]

你已經幾乎完成。

您當前唯一需要的是使用kcalloc()(類似於libc calloc(),帶有一個額外的參數,您可以[爲了示例的目的]設置爲GFP_KERNEL)分配一個字符串數組,然後循環遍歷文件與f->f_op->read(f, &chr, 1, &f->f_pos);(通過字符讀取char類似於libc read(f, &chr, 1) ...您可以稍後通過讀取塊中的文件並處理塊以避免在內核空間中進行大量讀取來進行優化。

這將給你類似的方法來處理內核下的fgetc(),以及爲你的char *buf[]陣列提供類似的calloc()接口。

您也可以實現自己的(不良優化)kfgetc()如:

int kfgetc(struct file *f) { 
    char chr = 0; 

    f->f_op->read(f, &chr, 1, &f->f_pos); 

    return chr; 
} 

有了這個例子,你可以很容易地創建一個kfgets()(只是kfgetc()循環,直到你找到一個「\ n」或沒有別的可讀的)。

請注意,一般來說,你在做什麼似乎不是一個好的做法(說實話,這是一個非常糟糕的主意),但把它放在一邊(因爲我不知道你爲什麼這樣做),以上是開始工作的一個很好的開始。當它開始工作,然後看看在那裏你可以優化它(另見其他內核組件如何檢索配置,如@ZanLynx說明)。

您的情況下,一些其他有用的內存分配器(因爲kcalloc()可能不會解決你的問題,如果你不知道有多少行將會對文件):kmalloc()krealloc()(類似於在libc malloc()realloc())。

4

解析內核中的配置文件非常麻煩和危險。不要這樣做。

如果您的內核模塊需要配置,通常通過在模塊加載時傳遞參數來完成,例如, insmod example.ko foo=123。您可以使用宏在module_param宏中聲明這些參數。有關如何操作的信息,請參閱the Linux Kernel Module Programming Guide

如果您的模塊需要比使用模塊參數可行的更復雜的配置,則模塊可能適合在此配置的sysfs中創建端點。請注意,這將意味着您的模塊很可能需要用戶空間幫助程序腳本來配置它。 這是正常的,並確定。在用戶空間中編寫這個腳本比在內核中運行它要簡單和安全得多。