2014-09-26 88 views
0


的#define SYSCALL_DEFINEx(X,SNAME,...)

在3.14 linux内核有以下宏:

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

它位于在include/linux/syscalls.h

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

但我没有使用宏。我阅读有关它的事情。我明白这个宏是为了争论。但是我不明白什么时候需要使用它,因为我做了一个“grep”,看起来大部分带参数的系统调用都没有使用它。

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

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

我怕如果我不使用这些宏错过的东西,我不能找到它足够的信息:/

谢谢!

+0

双向试用你的程序。如果输出是相同的,那么你不需要,但如果它不同,那么研究它们的差异。 – eyoung100 2014-09-26 17:01:57

+0

我试过但我不明白有什么区别。现在更清楚了。谢谢! – Kany 2014-09-28 15:15:18

回答

2

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

SYSCALL_DEFINEx宏不应该直接使用,而是SYSCALL_DEFINE0SYSCALL_DEFINE1SYSCALL_DEFINE2等,这取决于你的系统调用需要的参数数量。

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

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

+0

好吧,我需要它现在好多了!谢谢! – Kany 2014-09-28 15:16:03