SOCKET用户接口与系统调用关系
来源:互联网 发布:什么是数据api接口 编辑:程序博客网 时间:2024/06/06 02:34
所有的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 0
- SOCKET用户接口与系统调用关系
- SOCKET用户接口与系统调用关系(2)
- socket为用户提供的系统调用
- 系统调用接口与应用编程接口
- MIT OS lab3--小结续 系统调用与用户接口 (cprintf..)
- 用户画像与推荐系统的关系
- 调用socket接口
- Linux用户进程与系统调用
- Linux系统调用及用户编程接口(API)学习
- Linux系统调用及用户编程接口(API)学习
- Linux系统调用及用户编程接口(API)
- Linux系统调用及用户编程接口(API)学习
- Linux系统调用及用户编程接口(API)
- Linux系统调用及用户编程接口(API) (三)
- Linux系统调用及用户编程接口(API) (四)
- 系统调用及用户编程接口(API)
- Linux系统调用及用户编程接口(API)
- Linux系统调用接口、系统调用例程和内核服务例程之间的关系
- 转载: HDMI 基础知识
- MonggoDB In Action-更新、原子操作与删除(Part3)
- shell小脚本--laod博客更新hosts文件[脚本]
- 算法题之-二维数组元素查找
- [Android6.0][RK3399] 实现耳机和喇叭自动切换功能
- SOCKET用户接口与系统调用关系
- Eclipse安装
- UVA
- PAT 1034. Head of a Gang (30) DFS,删边
- 【HDU
- linux的Anaconda环境下安装TensorFlow
- HDU 6166 2017多校 Team09 1006:Dijkstra顶点子集最短路径
- 深入了解HDMI接口
- JDBC概述和初体验