您的位置:首页 > 其它

socket()接口与内核协议栈的挂接

2014-01-10 15:54 134 查看
最近在看Brdige的代码,发现一个问题,同样的调用ioctl接口实现添加网桥、删除网桥、网桥增加网卡、网桥删除网卡等操作,一个应用层的接口,却通过两条路径实现,sock_ioctl和RTNETLINK(这本就不是一个级别的东西),而应用层的brctl-utils源码中并没有直接使用PF_NETLINK协议簇的情况,让我感到非常奇怪,因此想把glibc到系统调用,到协议簇注册,以及和VFS的关系再理一下。

  这篇博客主要分析框架和流程,对于一些具体的细节,并不取讨论。所谓框架,指关键的数据结构、操作以及逻辑分层。此篇博客耗时12小时。

  1、socket()到系统调用

  Linux下,用户空间的调用的socket()接口由glibc实现,man socket如下,三个参数domain,type和protocol:

  1

  2

  3

  4

  5

  6

  7

  NAME

  socket - create an endpoint for communication

  SYNOPSIS

  #include <sys/socket.h>

  int socket(int domain, int type, int protocol);

  libc实现系统调用同名函数通常使用INT 0x80 + 系统调用号的方式陷入内核,一般来说,read对应sys_read,write对应sys_write.但是,socket系列却不是这样,为了节约系统调用号,将所有的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: