2011-02-18 90 views
1

我試圖讓用戶級程序通過/ proc與內核進行通信。從內核代碼的其他部分訪問/ proc fs變量

我也跟着上tldp的說明,是能夠成功地創建自定義的proc文件,與insmod的動態加載和讀取(貓)和write(回聲)從用戶空間的proc文件。

現在我的問題是如何從內核的另一部分(比如系統調用基礎結構)訪問/ proc變量(它是一個字節緩衝區)?由於自定義proc文件是動態加載和鏈接的,我如何從靜態編譯的內核代碼中引用它?

系統規格:Ubuntu的10.10運行在VMware Fusion上的MacBook Pro 13" (2009年)

編輯:相關代碼(按要求) -

procfile.c

//This function is called when the module is loaded 
int init_module() 
{ 
    /* create the /proc file */ 

    EXPORT_SYMBOL(procfs_buffer); 
    EXPORT_SYMBOL(procfs_buffer_size); 
... 
... 
} 

get_procvariable.c(在內核的另一部分)

//The buffer used to store character for this module 
extern char * procfs_buffer; 

//The size of the buffer 
extern unsigned long procfs_buffer_size; 

int get_procvariable(void) 
{ 
.. do something 
return procfs_buffer; // LD Error: Undefined reference 
} 

請讓我知道在c省略,如果你需要更多的細節。提前致謝。

+0

回答我自己的問題,從下面幾個提示: – Warr1ck 2011-02-22 08:24:06

回答

1

回答我自己的問題,採取了一些提示從答案以上:

我缺少的是,我需要聲明一個變量(比如INT kernel_var = 0;)事情的關鍵內核本身(和不在procfs開銷模塊內,因爲我以前做錯了)。然後用EXPORT_SYMBOL導出它,並將其添加到全局模塊符號表中,最後將其作爲extern變量包含在開銷procfs模塊中。

所以基本上,開銷變量已經存在於內核中,我只是簡單地使用procfs模塊來引用它作爲一個外部變量並修改它的值。

我編碼了這個假設,它的工作就像一個魅力。

0

使用EXPORT_SYMBOL從模塊中導出符號,然後在內核的其他部分使用它。

+0

你能給我多一點細節?我需要在內核的其他部分聲明它爲extern嗎?我試過這個,並得到一個'未定義的參考'錯誤。 – Warr1ck 2011-02-20 10:08:28

1

您不應該從靜態加載的代碼(即系統調用)引用內核中動態加載的代碼(即模塊)。如果你將靜態加載的代碼放在內核中,它的任何配置都應該被其他靜態加載的代碼暴露出來。但是,如果不知道您正在實施哪種功能,則很難提供更具體的建議。