<small id='Quq0tKcl'></small> <noframes id='g3XjT'>

  • <tfoot id='EBuRw'></tfoot>

      <legend id='3rLp8'><style id='VcWrTm'><dir id='LTqomp'><q id='FfeV2rGajS'></q></dir></style></legend>
      <i id='wruoNg'><tr id='RoC8tx4f'><dt id='BzUq7u'><q id='rCdujBOZ'><span id='MkBiX1Z5Y'><b id='WYBmUZO'><form id='TjosgKUZC'><ins id='4LTuJoftr'></ins><ul id='z3MkO8fNe'></ul><sub id='EcefRx'></sub></form><legend id='gcGFpU3QP'></legend><bdo id='GoqBkeEmN'><pre id='mYs4A'><center id='ZWsKq'></center></pre></bdo></b><th id='rCsy1ieD'></th></span></q></dt></tr></i><div id='WrHFztS'><tfoot id='p3LORMUm4'></tfoot><dl id='lGRAc'><fieldset id='csEC'></fieldset></dl></div>

          <bdo id='I03pXRy'></bdo><ul id='zIb7'></ul>

          1. <li id='JDHcVQzZ'></li>
            登陆

            壹号平台会员登录-LINUX 套接字文件体系(sockfs)剖析之一 文件体系注册剖析

            admin 2019-11-18 152人围观 ,发现0个评论

            在之前的文章中,咱们介绍了VFS、VFS与进程模块之间的代码剖析,也剖析了devtmpfs文件体系。

            本次咱们介绍socketfs文件体系,阐明下socketfs与vfs之间的相关。

            在剖析VFS以及剖析devtmpfs时,其文件体系变量file_system_type->mount接口完成超级块的创立以及根目录相关的dentry、inode的创立,在root_inode的i_op接口中,完成了文件及目录inode创立的接口(i_op->mkdir完成目录的创立、i_op->create完成文件的创立)。而针对socket而言,其并不需要创立实在的文件,因而,其root_inode的i_op接口中并没有mkdir、create接口,其首要将进程描述符的struct file类型的指针与socket相关的结构体相关。

            关于sockfs文件体系的剖析主题,首要剖析如下几个方面的内容:

            一、sockfs文件体系类型的界说、注册及挂载

            二、sockfs相关的结构体

            三、socket fd创立的进程

            四、socket相关的体系调用扼要介绍

            五、socket的ioctl处理流程

            1. ioctl的处理流程

            2. ifconfig up/down

            一、sockfs文件体系类型的界说及注册

            针对sockfs,其在sock_init接口中,进行文件体系的注册以及挂载操作,sock_init的接口流程图如下:

            经过调用register_filesystem完成文件体系的注册(文件体系的注册之前文章中现已介绍过,可在此处检查)。

            其注册流程相对比较简略,而关于文件体系注册相关的阐明,可参阅之前的文章,链接如下:LINUX 文件体系剖析之文件体系注册与挂载相关的剖析

            sockfs文件体系变量的界说

            sockfs文件体系的界说如下,其mount接口为sockfs_mount

            static struct file_system_type sock_fs_type = {
            .name = "sockfs",
            .mount = sockfs_mount,
            .kill_sb = kill_anon_super,
            };

            针对sockfs,调用kern_mount进行sockfs的挂载操作,而kern_mount经过调用vfs_kern_mount进行挂载(但没有调用do_add_mount,将该sockfs挂载到详细目录中,因sockfs无需挂载详细目录)。在vfs_kern_mount->mount_fs->type->mount时,即调用sockfs_mount接口,进行超级块、根root、根dentry相关的创立及初始化操作。如下接口界说,其间sockfs_ops为sockfs的超级块变量相关的操作接口,而sockfs_dentry_operations为sockfs的根dentry的操作接口。

            static struct dentry *sockfs_mount(struct file_system_type *fs_type,
            int flags, const char *dev_name, void *data)
            {
            return mount_pseudo(fs_type, "socket:", &sockfs_ops,
            &sockfs_dentry_operations, SOCKFS_MAGIC);
            }

            socketfs 超级块的操作接口,首要包含:

            1. inode节点的创立接口sock_alloc_inode;
            2. inode节点的删去接口sock_destroy_inode;
            3. 文件体系的状况获取接口simple_statfs,可获取文件体系的类型、块巨细、文件体系称号巨细等
            static const struct super_operations sockfs_ops = {
            .alloc_inode = sock_alloc_inode,
            .destroy_inode = sock_destroy_inode,
            .statfs = simple_statfs,
            };
            struct socket_alloc {
            struct socket 壹号平台会员登录-LINUX 套接字文件体系(sockfs)剖析之一 文件体系注册剖析socket;//struct socket socket变量,用于表明socketfs模块相关的变量,依据该变量可完成对socket链接的树立、数据收发等操作。
            struct inode vfs_inode;//inode节点变量
            };

            下面略微阐明下alloc_inode接口,在介绍该接口之前引进结构体struct socket_alloc,该结构体中包含了vfs模块的inode和socket模块的socket变量,可以说该变量链接了VFS与SOCKETFS模块。

            下面咱们剖析下sock_alloc_inode函数,该函数也便是创立struct socket_alloc类型的指针变量,并对该变量中的inode与socket变量,详细功能为:

            1.初始化socket变量的状况、flag、ops、sk、file等成员变量;

            2.初始化socket的等候行列成员变量wq

            static struct inode *sock_alloc_inode(struct super_block *sb)
            {
            struct socket_alloc *ei;
            struct socket_wq *wq;
            ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL);
            if (!ei)
            return NULL;
            wq = kmalloc(sizeof(*wq), GFP_KERNEL);
            if (!wq) {
            kmem_cache_free(sock_inode_cachep, ei);
            return NULL;
            }
            init_waitqueue_head(&wq->wait);
            wq->fasync_list = NULL;
            RCU_INIT_POINTER(不言而喻ei->socket.wq, wq);
            ei->socket.state = SS_UNCONNECTED;
            ei->socket.flags = 0;
            ei->socket.ops = NULL;
            ei->socket.sk = NULL;
            ei->socket.file = NULL;
            return &ei->vfs_inode;
            }

            而针对dentry的处理操作接口sockfs_dentry_operations,则供给了sockfs_dname接口,该接口用于生成dentry的称号

            static const struct dentry_operations sockfs_dentry_ope壹号平台会员登录-LINUX 套接字文件体系(sockfs)剖析之一 文件体系注册剖析rations = {
            .d_dname = sockfs壹号平台会员登录-LINUX 套接字文件体系(sockfs)剖析之一 文件体系注册剖析_dname,
            };

            本末节首要介绍socketfs文件体系的注册,并介绍了socketfs的inode节点的创立等内容,介于咱们之前已剖析了文件体系注册的接口,因而针对socketfs文件体系的注册剖析,相对来说简略了许多。

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP