SYSCALL_DEFINE3宏定义的分析

SYSCALL_DEFINE3分析
1.SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
2.#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
3.#define SYSCALL_DEFINEx(x, sname, ...)
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
4.#define __SYSCALL_DEFINEx(x, name, ...)
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
5. #define __SC_DECL1(t1, a1) t1 a1
#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)
上面四步就是整个SYSCALL_DEFINE3宏定义的每个步骤下面对他们进行组合
name ...
socket int, family, int, type, int, protocol
SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
等于 SYSCALL_DEFINE3(socket, ...)
等于 SYSCALL_DEFINEx(3, _socket, int, family, int, type, int, protocol)
等于 __SYSCALL_DEFINEx(3, _socket,int, family, int, type, int, protocol)
等于 asmlinkage long sys_socket(__SC_DECL##3(int, family, int, type, int, protocol))
等于 asmlinkage long sys_socket(__SC_DECL##3(int, family, int, type, int, protocol))
等于 asmlinkage long sys_socket(__SC_DECL3(int, family, int, type, int, protocol))
asmlinkage long sys_socket(int family ,__SC_DECL2(int, type, int, protocol))
asmlinkage long sys_socket(int family ,int type ,__SC_DECL1(int, protocol))
asmlinkage long sys_socket(int family ,int type ,int protocol)
这样分解之后就得到了函数
asmlinkage long sys_socket(int family ,int type ,int protocol)
备注:__VA_ARGS__:总体来说就是将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的,目前似乎只有gcc支持(VC从VC2005开始支持)。要注意的是,printf 的输出格式是括号内左边是字符串,右边是变量,而且右变量与左输出格式是一一对应的。所以在上面那个例子中, __VA_ARGS__只能是一些不含任何变量的字符串常量。因为上面的例子中若__VA_ARGS__含有变量,整个printf的输出与变量便不能一一对应,输出会出错。

原文地址:https://www.cnblogs.com/longbiao831/p/4556261.html