在 3.14 linux 内核中有如下宏:
#define SYSCALL_DEFINEx(x, sname, ...)
它位于 include/linux/syscalls.h。
我在源代码中添加了一个系统调用,我对其进行了编译,并使用该系统调用制作了一个小程序。它似乎有效,因为我的系统调用已被调用并打印了一条消息。
但是我没有使用宏。我读过有关它的东西。我知道这个宏是用于参数的。但我不明白什么时候我们必须使用它,因为我做了一个“grep”,似乎大多数带参数的系统调用都不使用它。
我必须使用它吗?为什么?
我对同一文件中的其他宏有同样的问题(SYSCALL_METADATA(sname,nb,...),SYSCALL_TRACE_ENTER_EVENT(sname)等)。即使我的系统调用有效,我是否必须全部使用它们?
如果我不使用这些宏,我害怕错过一些东西,而且我找不到足够的信息:/
谢谢!
最佳答案
你应该阅读 Anatomy of a system call, part1和 part 2 .
不应直接使用 SYSCALL_DEFINEEx
宏,而应使用 SYSCALL_DEFINE0
、SYSCALL_DEFINE1
、SYSCALL_DEFINE2
等. 取决于您的系统调用采用的参数数量。
这是在 Linux 中定义系统调用的常规方法。宏的目的是确保将适当的编译器编译指示应用于函数——标准 function prologue和 calling conventions不适用于系统调用。
取决于内核的配置,而不是您的个人喜好,您在系统调用宏中看到的其他代码片段是否包含在内。您可以看到整个 SYSCALL_METADATA
代码只包含在内 if CONFIG_FTRACE_SYSCALLS
is set .
关于linux - #define SYSCALL_DEFINEx(x, sname, ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070167/