sys_socketcall 代码片段分析

读者可以根据1.1代码清单1.1所列出函数glibc源码看到它们都会执行系统调用sys_socketcall函数函数sys_socketcall 内核提供socket通信总入口对于这个函数分析我们重点放在路线有关内容因此摘取sys_socketcall 函数关键代码部分代码1.6所示

asmlinkage long sys_socketcall(int call, unsigned long __user *args)

{

unsigned long a[6];

unsigned long a0, a1;

if (copy_from_user(a, args, nargs[call]))

return -EFAULT;

a0 = a[0];

a1 = a[1];

switch(call) {

case SYS_SOCKET;

err = sys_socket(a0, a1, a[2]);

    }

}

sys_socketcall 函数linux内核socket系统调用入口前面介绍函数两个参数分别通过寄存器ebxecx传递参数call具体socjet调用号ebx寄存器保存1这个2028SYS_SOCKET相同

参数args 指针ecx寄存器传递参数数组由于服务器程序用户u空间linux内核空间用户空间 系统调用函数内核空间需要这些参数服务器程序复制内核用户空间复制内核空间复制函数copy_from_user()

另外还需要copy_from_user()函数明确复制参数个数这是nargs[]数组决定参数call下标传递1数组可以找到对应参数个数

#define AL(x) ((x) * sizeof(unsigned long))

static const unsigned char nargs[18] = {

};

对应callAL(3), 通过AL() 定义得到复制3参数字节总数12于是copy_from_user 函数args指向3参数AF_INET,SOCK_STREAM0用户空间服务器程序复制内核空间数组a

可以看到include /linux/ net.h 规定调用call详细内容细心读者可以对照glibc这些调用定义目录sysdeps/unix/sysv/linuxsocketcall.h 文件中 可以看出linux内核对这些调用定义完全glibc相同这也是linux内核glibc版本严格要求原因

代码1.8 参数call对应内容

#define SYS_SOCKET 1

#define SYS_BIND 2

#define SYS_CONNECT 3

#define SYS_LISTEN 4

#define SYS_ACCEPT 5

#define SYS_GETSOCKNAME 6

#define SYS_GETPEERNAME 7

#define SYS_SOCKETPAIR 8

#define SYS_SEND 9

#define SYS_RECV 10

#define SYS_SENDTO 11

#define SYS_RECVFROM 12

#define SYS_SHUTDOWN 13

#define SYS_SETSOCKOPT 14

#define SYS_GETSOCKOPT 15

#define SYS_SNEDMSG 15

#define SYS_RECVMSG 17

根据call具体定义可以明确sys_socketcall 函数2027switch路线注意代码清单1.8 注释后缀表示这些定义系统调用

sys_socketcall函数对于服务器程序客户程序来说就是一扇大门服务器程序客户端程序调用函数都要通过这扇门找到各自对应函数代码清单1.1 调用socket 重要部分为了清楚显示函数调用过程本书以后代码清单前面->表示调用线路

sys_socketcall()->sys_socket()

asmlinkage long sys_socket(int family, int type, int protocol)

{

retval = sock_create(family, type, protocol, &sock);

retval = sock_map_fd(sock); 文件系统建立映射关系

}

上面函数名称就可以看出sock_create 作用就是创建一个服务器socket插口传递3参数familyAF_INETtypeSOCK_STREAM, protocol0这个函数肚饿分析将在下一章进行1225调用sock_map_fd 函数新建socket网络文件系统申请文件号文件描述符结构

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值