在3.14 linux内核中有以下宏:
#define SYSCALL_DEFINEx(x, sname, ...)
它位于 include / linux / syscalls.h 。
我在源代码中添加了一个系统调用,我编译了它,并使用系统调用创建了一个小程序。它似乎有效,因为我的系统调用已被调用并打印了一条消息。
但我没有使用宏。我读了一些关于它的事情。我明白这个宏是为了争论。但我不明白何时必须使用它,因为我做了一个“grep”,似乎大多数带参数的系统调用都没有使用它。
我必须使用它吗?为什么呢?
我对同一文件中的其他宏(SYSCALL_METADATA(sname,nb,...),SYSCALL_TRACE_ENTER_EVENT(sname)等)有同样的问题。即使我的系统调用有效,我是否必须全部使用它们?
如果我不使用这些宏,我不敢错过任何东西,我找不到足够的信息:/
谢谢!
答案 0 :(得分:2)
您应该阅读Anatomy of a system call, part1和part 2。
不应直接使用SYSCALL_DEFINEx
宏,而应使用SYSCALL_DEFINE0
,SYSCALL_DEFINE1
,SYSCALL_DEFINE2
等,具体取决于系统调用所需的参数数量。< / p>
这是在Linux中定义系统调用的常用方法。宏的目的是确保将适当的编译器编译指示应用于函数 - 标准function prologue和calling conventions不适用于系统调用。
根据内核的配置而不是您的个人偏好,您在系统调用宏中看到的其他代码是否包括在内。您可以看到整个SYSCALL_METADATA
代码仅包含if CONFIG_FTRACE_SYSCALLS
is set。