我跟在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没有“方法的名称”唯一“功能名” –