2014-03-14 74 views
0

我跟在Ubuntu 10.04的Linux內核3.9.3工作。我在linux-3.9.3源代碼樹的內核目錄中添加了一個基本的系統調用。我可以通過在syscall()中將我的新系統呼叫號碼作爲參數來使用它。但是我想直接調用它的方法名稱,如getpid()open()系統調用。任何人都可以幫助我將它添加到GNU C庫中。我瀏覽了一些文檔,但沒有清楚如何完成它。如何通過功能ID不使用系統調用調用新添加的系統調用(__ NR_mysyscall)

謝謝!

+0

通知其C包裝,C沒有「方法的名稱」唯一「功能名」 –

回答

0

假設您使用的是64位Linux x86-64,則相關的ABIx86-64 ABI。也可以參考x86 calling conventions WIKIPAGE和linux assembly howtosyscalls(2)

所以syscalls使用比普通函數調用不同的約定(例如,所有的參數都是通過寄存器傳遞,錯誤條件可以使用進位)。因此,您需要一個C封裝器來使您的系統調用可供C應用程序使用。

您可以查看現有C庫的源代碼,如GNU libcmusl libc(因此您需要爲該系統調用創建自己的庫)。 MUSL libc源代碼非常易讀,請參閱以其src/unistd/fsync.c爲例。

我建議包裝新的系統調用在自己的庫,而不打補丁libc。請注意,一些不常見的系統調用位於不同的庫中,例如request_key(2)libkeyutils