我正在使用ubuntu 10.04中的linux-3.9.3内核。我在Linux-3.9.3源树的内核目录中添加了一个基本的系统调用。我能够通过将我的新系统调用号码作为参数传递给syscall()
。但是我想通过使用其方法名称直接调用它,例如getpid()
或open()
系统调用。任何人都可以帮助我将其添加到GNU C库中。我经历了几个文件,但对如何完成该文件没有任何清楚的想法。
谢谢!!!
假设您在64位Linux X86-64上,则相关的ABI是X86-64 ABI。另请阅读X86调用惯例Wikipage和Linux组件HOWTO和SYSCALLS(2)
因此,syscalls使用的惯例与普通函数调用不同(例如,所有参数均由寄存器传递,错误条件可以使用随身携带的位)。因此,您需要一个C包装器才能使您的SYSCALL可用于C应用程序。
您可以查看现有C库的源代码,例如GNU LIBC或MUSL LIBC(因此,您需要为SYSCALL制作自己的库)。 musl libc 源代码非常可读,例如它的src/unistd/fsync.c为例。
我建议在不修补libc
的情况下将您的新Syscall包裹在您自己的库中。请注意,一些罕见的syscall坐在另一个图书馆中,例如request_key(2)在libkeyutils