2014-03-14 41 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