在include/linux/syscall.h里有下面一组宏:
- #define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
- #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
- #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
- #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
- #define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
- #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
- #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
- #define SYSCALL_DEFINEx(x, sname, ...) \
- __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
- #define __SYSCALL_DEFINEx(x, name, ...) \
- asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
- #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__)
步骤 | 宏扩展内容 |
1 | SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) |
2 | SYSCALL_DEFINEx(3, _open, __VA_ARGS__) |
3 | __SYSCALL_DEFINEx(3, _open, __VA_ARGS__) |
4 | asmlinkage long sys_open(__SC_DECL3(__VA_ARGS__)) |
5 | asmlinkage long sys_open(const char __user *filename, __SC_DECL2(__VA_ARGS__)) |
6 | asmlinkage long sys_open(const char __user *filename, int flags, __SC_DECL1(__VA_ARGS__)) |
7 | asmlinkage long sys_open(const char __user *filename, int flags, umode_t mode) |