2016-04-01 50 views
0

所以我看到了一些關於添加系統調用的問題,但我找不到使用LKM的任何示例。我發現這樣的資源:http://tldp.org/LDP/lkmpg/2.6/html/ 這在理論上,但沒有編譯。任何人都可以指向一個簡單的例子來添加一個hello世界系統調用或其他東西。像這樣的:https://tssurya.wordpress.com/2014/08/19/adding-a-hello-world-system-call-to-linux-kernel-3-16-0/,不需要我重新編譯我的內核?使用內核模塊(LKM)添加系統調用

回答

1

通常,強烈建議而不是實施全新的系統調用。

相反,只實現一個新的ioctl並可能有一些新的塊或字符設備。

對於如何做到這,它看起來像有一個問題/答案已經:How do I use ioctl() to manipulate my kernel module?

+0

我不認爲你有直覺如何使用這些東西?我找到了一個例子:http://www.tldp.org/LDP/lkmpg/2.6/html/x892.html,但我不知道你將如何去使用ioctl的。所以你可以使用設備驅動程序,然後通過設置驅動程序讀取它。你對ioctl做什麼? – BashOverride

+0

我想我應該重新定義我的問題。假設我想添加一個系統調用,它將返回有關當前正在運行的進程的數據。所以我會把它傳遞給一個pid,它會返回像那個父pid,開始時間等等。這個ioctl會調用一個讀取,它會發現這個信息嗎?或者是什麼?我很難理解這種設置是如何工作的。 – BashOverride

0

我不認爲你可以做到這一點的模塊。系統調用的定義進入兩個地方,在運行時無法真正改變(據我所知):syscall表(它爲每個架構分配數字)和syscalls包含文件(與內核本身一起安裝,而不是模塊)。 (或者至少不能在運行時忽略代碼重寫)。

在這種情況下,您總是需要重新編譯內核。但是如果你想有一個快速的更新/嘗試循環,你可以實現一個系統調用,它只是一個存根,如果它被加載,就會向正確的模塊傳遞一個消息。它可以讓你改變實現,但不是簽名。