SYSCALL_DEFINE

 在include/linux/syscall.h里有下面一组宏:
  1. #define SYSCALL_DEFINE0(name)     asmlinkage long sys_##name(void)
  2. #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
  3. #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
  4. #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
  5. #define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
  6. #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
  7. #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
    这里每个SYSCALL_DEFINE后面的数字说明了,名为name的系统调用接收几个输入参数。这些宏都由一个基础宏SYSCALL_DEFINEx来实现:
  1. #define SYSCALL_DEFINEx(x, sname, ...) \
  2.    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
   继续找__SYSCALL_DEFINEx宏的定义:
  1. #define __SYSCALL_DEFINEx(x, name, ...) \
  2.    asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
    关于__SC_DECL##x最后也被展开,其定义如下:
  1. #define __SC_DECL1(t1, a1)    t1 a1
  2. #define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
  3. #define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
  4. #define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
  5. #define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
  6. #define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)
    __SC_DECLx宏实现了系统调用输入参数类型和参数名的结合,因为宏定义时是无法确定参数类型的。我们来逐步分解一下open系统调用的实现:
步骤宏扩展内容
1SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
2SYSCALL_DEFINEx(3, _open, __VA_ARGS__)
3__SYSCALL_DEFINEx(3, _open, __VA_ARGS__)
4asmlinkage long sys_open(__SC_DECL3(__VA_ARGS__))
5asmlinkage long sys_open(const char __user *filename, __SC_DECL2(__VA_ARGS__))
6asmlinkage long sys_open(const char __user *filename, int flags, __SC_DECL1(__VA_ARGS__))
7asmlinkage long sys_open(const char __user *filename, int flags, umode_t mode)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值