#define SYSCALL_DEFINEx(x,sname,...)

时间:2014-09-26 16:44:55

标签: linux kernel c


在3.14 linux内核中有以下宏:

#define SYSCALL_DEFINEx(x, sname, ...)

它位于 include / linux / syscalls.h

我在源代码中添加了一个系统调用,我编译了它,并使用系统调用创建了一个小程序。它似乎有效,因为我的系统调用已被调用并打印了一条消息。

但我没有使用宏。我读了一些关于它的事情。我明白这个宏是为了争论。但我不明白何时必须使用它,因为我做了一个“grep”,似乎大多数带参数的系统调用都没有使用它。

我必须使用它吗?为什么呢?

我对同一文件中的其他宏(SYSCALL_METADATA(sname,nb,...),SYSCALL_TRACE_ENTER_EVENT(sname)等)有同样的问题。即使我的系统调用有效,我是否必须全部使用它们?

如果我不使用这些宏,我不敢错过任何东西,我找不到足够的信息:/

谢谢!

1 个答案:

答案 0 :(得分:2)

您应该阅读Anatomy of a system call, part1part 2

不应直接使用SYSCALL_DEFINEx宏,而应使用SYSCALL_DEFINE0SYSCALL_DEFINE1SYSCALL_DEFINE2等,具体取决于系统调用所需的参数数量。< / p>

这是在Linux中定义系统调用的常用方法。宏的目的是确保将适当的编译器编译指示应用于函数 - 标准function prologuecalling conventions不适用于系统调用。

根据内核的配置而不是您的个人偏好,您在系统调用宏中看到的其他代码是否包括在内。您可以看到整个SYSCALL_METADATA代码仅包含if CONFIG_FTRACE_SYSCALLS is set