以umount系统调用为例
在fs/namespace.c中有:
SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
{
......
}
在include/linux/syscalls.h中有:
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
--->SYSCALL_DEFINEx(2, _umount, char __user *, name, int, flags)
在include/linux/syscalls.h中,因为CONFIG_FTRACE_SYSCALLS没有被定义,所以:
#define SYSCALL_DEFINEx(x, sname, ...) \
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
--->__SYSCALL_DEFINEx(2, _umount, char __user *, name, int, flags)
在include/linux/syscalls.h中,因为CONFIG_HAVE_SYSCALL_WRAPPERS没有被定义,所以
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
--->asmlinkage long sys_umount(__SC_DECL2(char __user *, name, int, flags))
#define __SC_DECL1(t1, a1) t1 a1
#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
--->__SC_DECL2(t2, a2, t1, a1) == t2 a2, t1 a1
--->__SC_DECL2(char __user *, name, int, flags) == char __user * name, int flags
--->asmlinkage long sys_umount(char __user * name, int flags)
最终可以推出如下结论:
===>>>SYSCALL_DEFINE2(umount, char __user *, name, int, flags) == asmlinkage long sys_umount(char __user * name, int flags)
这与在syscalls.h中的声明一致
asmlinkage long sys_umount(char __user *name, int flags);
linux kernel中的系统调用是怎么定义的
最新推荐文章于 2022-09-16 11:07:26 发布