zoukankan      html  css  js  c++  java
  • Linux内核之网络

    应用层:
    套接字将Unix一切都是内核的概念应用到网络连接中,内核跟用户空间套接字之间的接口实现在c的标准库中,使用了socketcall系统调用.
    socketcall充当了一个多路分解器,将各种任务分配到不同的过程执行,比如打开一个套接字,绑定或发送数据.
    对于程序使用的套接字来说,都对应一个socket结构和sock的实例,二者充当向下(内核)跟向上(用户)接口
    socket定义:
    1. struct socket{
    2. socket_state state;//套接字连接状态
    3. unsigned long flags;
    4. const struct proto_ops *ops; //具体协议类型
    5. struct file *file; //指向一个伪文件的file实例,用于跟套接字通信(描述符)
    6. struct sock *sk;
    7. short type; //所用协议类型的数字标识符
    8. };
    ops包含处理套接字的特定于协议函数
    1. struct proto_ops
    2. {
    3. int family;
    4. .....
    5. int (*bind)(.............);
    6. int (*connect)(...........);
    7. .......等等
    8. };
    这里跟c标准库的对应函数同名,因为c库函数会通过syscall系统调用来调用上面的函数指针

    套接字与文件
    在连接建立后,用户进程使用普通的文件操作来访问套接字,每个套接字都分配了一个该类型的inode,inode又管理到另外一个普通文件相关的结构.用于操作文件的函数保存到一个单独的指针表中
    1. struct inode{
    2. .....
    3. struct file_operations *i_fop;
    4. ....
    5. }

    因此,对套接字文件描述符的文件操作,可以透明的定向到网络子系统的代码,套接字使用的file_operations如下:
    1. struct file_operations socket_file_ops={
    2. .owner=THIS_MODULE,
    3. .poll=sock_poll
    4. .aio_read=sock_aio_read;
    5. .mmap
    6. .....
    7. };

    前缀为sock_的函数都是简单的包装器函数,他们会调用sock_operations.比如sock_mmap所示
    1. static int sock_mmap(struct file*file,struct vm_area_struct *vma)
    2. {
    3. struct socket*sock=file->private_data; //socket指向 文件实例
    4. return sock->ops->ops->mmap(file,sock,vma);
    5. }

    inode跟套接字的关联,是通过以下辅助结构完成的
    1. struct socket_alloc{
    2. struct socket socket;
    3. struct inode vfs_inode;
    4. }

    内核提供了两个宏进行必要的指针运算,根据inode找到相关套接字实例(socket_i)或者反过来(sock_inode)
    socketcall系统调用
    文件功能中的读写操作可以通过虚拟文件系统相关调用进入内核,然后重定向到socket_file_ops的函数指针,除此之外,还要对套接字执行其他任务
    Linux提供了socketcall系统调用,它实现在sys_socketcall中,17个套接字操作对应一个系统调用,由于所要处理的任务不同,参数列表有很大差别.
    1. sys_socketcall(int call,unsigned long _user*args)
    2. {
    3. switch(call)
    4.     { case sys_socket:
    5. err=sys_socket(a0,a1,a[2]);
    6. break;
    7.      case SYS_bind:
    8. err=sys_bind(a0,(struct sockaddr __user*)a1,a[2]);
    9.         ........
    10.     }
    11. }









  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    AngularJS学习笔记1
    实习第2天
    转:JavaScript事件冒泡简介及应用
    icon font字体图标字库汇总
    Express4--说明
  • 原文地址:https://www.cnblogs.com/zengyiwen/p/5679166.html
Copyright © 2011-2022 走看看