我跟在Ubuntu 10.04的Linux內核3.9.3工作。我在linux-3.9.3源代碼樹的內核目錄中添加了一個基本的系統調用。我可以通過在syscall()
中將我的新系統呼叫號碼作爲參數來使用它。但是我想直接調用它的方法名稱,如getpid()
或open()
系統調用。任何人都可以幫助我將它添加到GNU C庫中。我瀏覽了一些文檔,但沒有清楚如何完成它。如何通過功能ID不使用系統調用調用新添加的系統調用(__ NR_mysyscall)
謝謝!
我跟在Ubuntu 10.04的Linux內核3.9.3工作。我在linux-3.9.3源代碼樹的內核目錄中添加了一個基本的系統調用。我可以通過在syscall()
中將我的新系統呼叫號碼作爲參數來使用它。但是我想直接調用它的方法名稱,如getpid()
或open()
系統調用。任何人都可以幫助我將它添加到GNU C庫中。我瀏覽了一些文檔,但沒有清楚如何完成它。如何通過功能ID不使用系統調用調用新添加的系統調用(__ NR_mysyscall)
謝謝!
假設您使用的是64位Linux x86-64,則相關的ABI是x86-64 ABI。也可以參考x86 calling conventions WIKIPAGE和linux assembly howto和syscalls(2)
所以syscalls使用比普通函數調用不同的約定(例如,所有的參數都是通過寄存器傳遞,錯誤條件可以使用進位)。因此,您需要一個C封裝器來使您的系統調用可供C應用程序使用。
您可以查看現有C庫的源代碼,如GNU libc或musl libc(因此您需要爲該系統調用創建自己的庫)。 MUSL libc源代碼非常易讀,請參閱以其src/unistd/fsync.c爲例。
我建議包裝新的系統調用在自己的庫,而不打補丁libc
。請注意,一些不常見的系統調用位於不同的庫中,例如request_key(2)在libkeyutils
通知其C包裝,C沒有「方法的名稱」唯一「功能名」 –