Linux 内核态系统调用函数定义
file:include/linux/syscalls.h
SYSCALL_DEFINE0
#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
asmlinkage 通过堆栈而不是寄存器进行参数传递。
#define asmlinkage CPP_ASMLINKAGE __attribute__((syscall_linkage))
示例函数:SYSCALL_DEFINE2(gethostname, char __user *, name, int, len) {......}
说明:SYSCALL_DEFINE[1,2,3,4,5,6],这1,2,3...其实表示定义系统调用函数的参数个数:
有一个参数的函数定义:#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__)
__SC_DECL定义如下(函数定义时使用):
#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__)
宏推演如下:__SC_DECL2(int, a, int, b)----> int a, __SC_DECL1(int, b)---->int a, int b
__SC_LONG定义如下(将参数类型强转成long):
#define __SC_LONG1(t1, a1) long a1
#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__)
#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__)
#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__)
#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__)
#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__VA_ARGS__)
推演如下:__SC_LONG2(int, a, int b)----> long a, __SC_LONG1(int, b)---->long a, long b
__SC_CAST定义如下(函数调用时使用):
#define __SC_CAST1(t1, a1) (t1) a1
#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__)
#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__)
#define __SC_CAST4(t4, a4, ...) (t4) a4, __SC_CAST3(__VA_ARGS__)
#define __SC_CAST5(t5, a5, ...) (t5) a5, __SC_CAST4(__VA_ARGS__)
#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__)
推演如下: func(__SC_CAST2(int, a, int, b))---->func((int)a, (int)b)
函数别名设置:
#define SYSCALL_ALIAS(alias, name) \
asm ("\t.globl " #alias "\n\t.set " #alias ", " #name)
推演如下:SYSCALL_ALIAS(sys_gethostname, SyS_gethostname),这两个函数是一个函数
SYSCALL_DEFINEx定义如下:
SYSCALL_DEFINE2(gethostname, char __user *, name, int, len) {......}
推演如下:SYSCALL_DEFINEx(2, _gethostname, char __user *, name, int, len){......}
#define SYSCALL_DEFINEx(x, sname, ...) \
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
推演如下:__SYSCALL_DEFINEx(2, _gethostname, char __user *, name, int, len){......}
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \ //行1
static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \ //行2
asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \ //行3
{ \
__SC_TEST##x(__VA_ARGS__); \
return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__)); \ //行4
} \
SYSCALL_ALIAS(sys##name, SyS##name); \ //行5
static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)) //行6
行1推演:asmlinkage long sys_gethostname(char __user * name, int len);
行2推演:static inline long SYSC_gethostname(char __user *name, int len);
行3推演:asmlinkage long SyS_gethostname(long name, long len)
{
行4推演: return SYSC_gethostname((char __user *)name, (int)len);
}
行5推演:SYSCALL_ALIAS(sys_gethostname, SyS_gethostname);
行6推演:static inline long SYSC_gethostname(char __user * name, int len) {......}