2009-05-03 109 views
7

是否可以編譯包含由非內核定義的功能的linux內核(2.6)模塊?編譯包含非內核頭文件的linux內核(2.6)模塊

例如:


kernelmodule.h

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> // printk() 
// ... 
#include <openssl/sha.h> 
// ... 

的Makefile

obj-m := kernelmodule.o 
all: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules 

clean: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean 
    $(RM) Module.markers modules.order 

我寫的內核模塊,並試圖編譯包含發現功能一些o penssl包含文件。

上面提供的標準makefile不允許包含在linux頭之外。是否可以包含這個功能,如果可以的話,請指點一下正確的方向。

謝謝, 邁克

回答

11

內核不能使用用戶空間代碼,必須獨立(即完全獨立的,沒有庫),因此它不會拿起標準的頭。

試圖挑選用戶空間標題有什麼好處是不明確的。如果有些東西可以使用它們(常量,某些宏或許提供了它們不會調用任何用戶空間函數),那麼複製它們可能會更好,並且只包含您需要的與內核兼容的部分。

無法將內核與爲用戶空間使用而設計的庫鏈接 - 即使它們沒有進行任何操作系統調用 - 也是因爲內核中的鏈接環境無法提取它們。

取而代之的是,重新編譯內核中使用的任何函數(假設它們不進行任何操作系統或庫調用 - 例如malloc--在這種情況下,它們將需要進行修改)。將它們合併到您自己的庫中以用於內核模塊。


最新的Linux版本包含加密功能,無論如何,包括各種SHA哈希 - 也許你可以使用其中的一個來代替。


另一個想法是停止試圖做內核空間密碼和代碼移動到用戶空間。用戶空間代碼更容易編寫/調試/維護等。

6

我已經寫了一些用戶空間代碼,並將其轉換爲內核空間(例如使用kmalloc()等),但並不那麼困難。然而,你僅限於內核對C的理解,而不是用戶空間,它略有不同,特別是對於各種標準的int類型。

只與用戶空間DSO鏈接是不可能的 - Linux內核是單片的,完全獨立的。它不像其他人所說的那樣使用用戶空間libc,庫或其他位。

9/10次,你會在內核中找到你需要的東西某處。很有可能其他人遇到了同樣的需求,並在某些模塊中編寫了一些靜態函數以實現您想要的功能。只需抓住這些並重新使用它們即可。

在加密的情況下,正如其他人所說的,只是使用內核中的內容。需要注意的一點是,您需要在kconfig中啓用它們,這可能會或可能不會發生,具體取決於用戶在構建它時選擇的內容。因此,注意依賴關係並明確指出,您可能必須在kconfig中修改幾個條目,這些條目還會選擇您選擇模塊時所需的加密API。這樣做在建立樹木之外可能會有點痛苦。

因此,一方面我們「在複製和重新命名的同時添加整體膨脹」,另一方面你有「告訴人們他們必須擁有完整的內核源代碼」。這是單片內核帶來的怪癖之一。

有了Microkernel,幾乎所有的東西都在用戶空間中運行,無需爲某些驅動程序與DSO進行鏈接......這不是問題。請不要把這個陳述作爲重新啓動內核設計理念的提示,這不在這個問題的範圍之內。