SOCKET用户接口与系统调用关系

所有的socket系统调用的总入口是sys_socketcall(),在include/linux/Syscalls.h中定义

其中,
@param call 标识接口编号,
@param args 是接口参数指针

接口编号的定义在 include/uapi/linux/net.h中定义


接口编号对应的参数个数在net/socket.c文件中的nargs数组中定义


在net/socket.c中有一个函数SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)便是socket调用的入口。


其中SYSCALL_DEFINE2是一个宏,定义在include/linux/syscall.h中






下面我们来展开展开SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args):
展开第一步得到:
SYSCALL_DEFINEx(2, _##socketcall, int, call, unsigned long __user *, args)

继续展开SYSCALL_DEFINEx,
SYSCALL_METADATA(_socketcall,2,int, call, unsigned long __user *, args) \
__SYSCALL_DEFINEx(2, _socketcall, int, call, unsigned long __user *, args)

SYSCALL_METADATA定义是空,忽略

继续展开__SYSCALL_DEFINEx,
asmlinkage long sys_socketcall(__MAP(2,__SC_DECL,__VA_ARGS__));\
static inline long SYSC_socketcall(__MAP(2,__SC_DECL,__VA_ARGS__)); \
asmlinkage long SyS_socketcall(__MAP(2,__SC_LONG,__VA_ARGS__))\
{\
	long ret = SYSC_socketcall(__MAP(2,__SC_CAST,__VA_ARGS__));\
	__MAP(2,__SC_TEST,__VA_ARGS__);\
	__PROTECT(x, ret,__MAP(2,__SC_ARGS,__VA_ARGS__));\
	return ret;\
} \
SYSCALL_ALIAS(sys_socketcall, SyS_socketcall);\
static inline long SYSC_socketcall(__MAP(2,__SC_DECL,__VA_ARGS__))

这时候的宏包括__MAP(),__SC_DECL 将其展开得到,其中__MAP是一个降维的过程,继续展开得到:
asmlinkage long sys_socketcall (int call, unsigned long __user *args);
static inline long SYSC_socketcall(int call, unsigned long __user *args);
asmlinkage long SyS_socketcall(int call, unsigned long __user *args)
{
long ret = SYSC_socketcall (call, ( unsigned long __user *)args);
return ret;
}
SYSCALL_ALIAS(sys_socketcall, SyS_socketcall);
static inline long SYSC_socketcall((int call, unsigned long __user *args)

到目前为止,sys_socketcall似乎并没有定义,原因是还有一个宏未展开,SYSCALL_ALIAS,在include/linux/linkage.h中定义,


在include/linux/export.h中定义,


将 SYSCALL_ALIAS(sys_socketcall, SyS_socketcall) 展开得到:
asm (".globl" sys_socketcall
".set" sys_socketcall, SyS_socketcall)

即sys_socketcall是SyS_socketcall的别名。

所以:展开之后是:


那内核为什么要这样呢?可以参考 http://blog.csdn.net/hxmhyp/article/details/22619729

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值