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

标签 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)等)。即使我的系统调用有效,我是否必须全部使用它们?

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

谢谢!

最佳答案

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

不应直接使用 SYSCALL_DEFINEEx 宏,而应使用 SYSCALL_DEFINE0SYSCALL_DEFINE1SYSCALL_DEFINE2 等. 取决于您的系统调用采用的参数数量。

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

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

关于linux - #define SYSCALL_DEFINEx(x, sname, ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070167/

相关文章:

linux - 关于操作系统中的进程控制 block

用于从ubuntu服务器获取centOS服务器日期时间的C程序?

linux - 在 Buildbot 中指定 SVN 目标文件夹名称

c - sysctl 迁移到 2.6.35

核心转储分析 gdb : print return address and arguments

c++ - Qt Creator gdb 显示 C 数组元素

linux - 从 makefile 运行可执行文件

linux - uinput虚拟设备和/dev/input/mice

c - 如何将从文件输入的整数网格转换为字符串网格

c - 是否有不需要操作系统和文件系统的嵌入式键值存储实现?