2011-03-10 62 views
1

我目前正在編寫一個依賴於Linux安全模塊(LSM)的Linux內核模塊,目前它並不是真的,我只是想打印出一條簡單的消息,文件被打開。問題是:爲了註冊鉤子,我需要register_security函數,在googleing之後我發現它不再被導出,因此不能被可加載內核模塊使用 - 只能通過直接編譯到內核中的模塊。 當然這對於安全模塊來說是有意義的,但它對我的發展很吸引。 所以,現在你的問題:有沒有辦法將我的模塊修補到內核?我的意思是,我不想在每次修補程序或每次小改動後重新編譯我的內核。我可以住重新啓動我的電腦,每次新的嘗試,但重新編譯會花一點時間,我猜..LSM-Howto:具有非導出函數的內核模塊

編輯:嗯,沒有人:(我只是有一個想法,也許有人可以告訴我,如果它是不好:我不能只在內核源代碼中添加我需要的EXPORT_SYMBOL,然後重新編譯它,然後添加我的代碼作爲模塊嗎?當然這只是用於測試和調試

回答

0

Can' T優只是用在內核fsnotify,或fanotify從用戶空間?

這不是一般出口的是,筆者並不認爲這將是導出一個好主意的功能。如果你調用一個函數的一個好主意如果這不是公共接口的一部分,並且該函數有副作用,那麼您可能會破壞一些東西。此外,你的模塊不能在其他機器上工作,但也許你不關心這一點。

+0

是的,我知道這將是一種解決方法。但我只是爲了測試目的而做。而當我在虛擬機內測試時,事情並不是問題 – michael

0

不,沒有。如果符號未導出,則內核鏈接程序將無法找到它。但是將導出添加到用於測試的內核應該沒問題。您可以通過將模塊添加到./include/linux/Kbuild來將模塊添加到導出列表。

另外,如果在(user-mode-linux)[http://user-mode-linux.sourceforge.net/]或在虛擬盒中測試,重新編譯整個內核可能不是那麼大的問題。

0

這可能有點晚,因爲我看到你的問題。我發現一個好的解決方案是編寫一個模塊,將其編譯到內核中,然後導出幾個函數。

例如

//REGISTER FILE_PERMISSION 
static void k_register_file_permission(int (*my_file_permission) (struct file *file, int mask)) { 
    my_file_permission_func = my_file_permission; 
} 
EXPORT_SYMBOL(k_register_file_permission); 

然後,你可以調用k_register_file_permission從你的內核模塊,方便durring發展的過程。

您還需要像

int k_file_permission (struct file *file, int mask) { 
    if(my_file_permission_func == NULL) 
    { 
    //do nothing 
    } 
    else 
    { 
    return my_file_permission_func(file, mask); 
    } 
    return 0; 
} 

一個功能,您將與在引導時LSM註冊。