Linux
如何在 linux kernel 4.x 中添加系統呼叫
我正在嘗試使用 linux kernel 4.1.6 添加系統呼叫,但我能找到的所有文件都是針對舊版本的。有誰知道它是如何在較新的核心中完成的或者有什麼好的參考資料?
應該有3個步驟:
- 添加到系統呼叫表。我發現他們現在使用 arch/x86/syscalls/syscall_64.tbl 而不是 entry.S。所以我在裡面放了一些東西。
- 添加到 asm/unistd.h 文件中。顯然 unistd.h 文件現在是自動生成的,所以我們不必手動更新它?所以我沒有為這一步做任何事情,因為文件不存在。 https://stackoverflow.com/questions/10988759/arch-x86-include-asm-unistd-h-vs-include-asm-generic-unistd-h
- 將系統呼叫編譯到核心中。我已按照基於核心 2.6 的書(Robert Love 的 linux 核心開發書)中的建議將實際的系統呼叫程式碼添加到 kernel/sys.c。我又編譯了核心。
然後我按照書中的建議編寫了一個客戶端程序,但是當我嘗試編譯它時它顯示未知類型名稱“helloworld”。我的程序與書不同,但結構相同。
#include <stdio.h> #define __NR_helloworld 323 __syscall0(long, helloworld) int main() { printf("I will now call helloworld syscall:\n"); helloworld(); return 0; }
網際網路(和可用的書籍)似乎嚴重缺乏這些資訊——或者Google並不像它想的那樣聰明。無論如何,任何幫助表示讚賞。
謝謝。~
~
~
根據_syscall(2)手冊頁,
_syscall0
宏可能已過時並且需要#include <linux/unistd.h>
;確實 Linux 4.x 沒有它但是,您可以安裝musl-libc並使用它的
_syscall
功能。您可以簡單地在使用者程式碼中使用間接系統呼叫(2)。所以你的測試程序將是
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include <unistd.h> #include <sys/syscall.h> #include <stdio.h> #define __NR_helloworld 323 static inline long mysys_helloworld(void) { return syscall(__NR_helloworld,NULL); } int main (int argc, char**argv) { printf("will do the helloworld syscall\n"); if (mysys_helloworld()) perror("helloworld"); return 0; }
以上程式碼未經測試!