内核网络子系统之 ----socket系统调用 篇

本文探讨了Linux内核中的socket系统调用,以accept为例,详细阐述了从用户态到内核态的过程。通过分析socket.S、accept.S等文件,揭示了系统调用号的确定和参数传递机制,以及如何通过sys_socketcall找到对应的内核函数,如sys_accept。
摘要由CSDN通过智能技术生成

  一切操作网络的应用都是通过 socket ,所以我们从最上层的 BSD socket 开始。以 socket 函数 accpet 为例。

  Linux 系统使用 0x80 软中断支持系统调用,同样 socket 也是使用这个中断从用户态进入到内核态。一般而言,对于每个系统调用都有一个内核如何函 数与之对应,比如代开文件 open ,对应的系统调用入口函数是 sys_open ,同理, read 对应 sys_read write 对应 sys_write 。但是, socket 的系统调用可不是这样的,它有一个统一的内核入口函数 sys_socketcall

  贴段代码碎片:

  switch (call) {
    case SYS_SOCKET:
        err = sys_socket(a0, a1, a[2]);
        break;
    case SYS_BIND:
        err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
        break;
    case SYS_CONNECT:
        err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
        break;
    case SYS_LISTEN:
        err = sys_listen(a0, a1);
        break;

    ... ...

    }

    明白了吧,实际上里面还是有条件判断的,最终还是调用对应的 sys_xxx 了。但无论如何,内核入口函数就一个,确实是节省了不少系统调用号。那应用层调用了 accept ,它是如何找到 sys_socketcall 这个函数的呢? call 这个又是怎么被传进去的呢?下面我们一一解决。

    首先看看,当应用层调用 accept 时,是如何进入到内核入口函数 sys_socketcall 的。

第一层入口: accepts.S(glibc 里面的 socket 实现 ) /glib/sysdeps/unix/sysv/linux/accept.S

当应用层调用 accept 时,它会先跑到这里面来,下面看看它的部分源码:

#define socket accept

#define NARGS         3  // 表明 accept 系统调用的参数个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值