Linux套接字与虚拟文件系统.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux套接字与虚拟文件系统

引言 ???在Unix的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作。对于网络套接字socket也是如此,除了专属的Berkeley Sockets API,还支持一些标准的文件IO系统调用如read(v)、write(v)和close等。那么为什么socket也支持文件IO系统调用呢?在Linux上,这是通过套接口伪文件系统sockfs来实现的,因为sockfs实现了VFS中的4种主要对象:超级块super block、索引节点inode、目录项对象dentry和文件对象file,当执行文件IO系统调用时,VFS就将请求转发给sockfs,而sockfs就调用特定的协议实现,层次结构如下图: ???本文以linux 2.6.34实现为基础,本篇阐述初始化和Socket创建两部分的实现,下篇阐述Socket创建和销毁两部分的实现。 初始化 ???在内核引导时初始化网络子系统,进而调用sock_init,该函数主要步骤如下:创建inode缓存,注册和装载sockfs,定义在net/socket.c中。 1static?int?__init?sock_init(void) 2{ 3???? 4????init_inodecache(); 5????register_filesystem(sock_fs_type); 6????sock_mnt?=?kern_mount(sock_fs_type); 7???? 8} ??? ???创建inode缓存 ???init_inodecache为socket_alloc对象创建SLAB缓存,名称为sock_inode_cachep,socket_alloc定义在include/net/sock.h中。 1struct?socket_alloc?{ 2????struct?socket?socket; 3????struct?inode?vfs_inode; 4}; ???socket_alloc由socket和inode结构2部分组成,这样就方便了在套接字与inode对象间双向定位。 ???注册sockfs ???调用VFS的函数register_filesystem实现注册,sock_fs_type定义在net/socket.c中。 1static?struct?file_system_type?sock_fs_type?=?{ 2????.name?=????????sockfs, 3????.get_sb?=????sockfs_get_sb, 4????.kill_sb?=????kill_anon_super, 5}; ???sock_fs_type包含了文件系统sockfs的名称、创建和销毁super block的函数,其中sockfs_get_sb实现在net/socket.c中。 1static?int?sockfs_get_sb(struct?file_system_type?*fs_type,int?flags,?const?char?*dev_name,?void?*data,struct?vfsmount?*mnt) 2{ 3????return?get_sb_pseudo(fs_type,?socket:,?sockfs_ops,?SOCKFS_MAGIC,?mnt); 4} ???它在kern_mount内被执行,通过调用get_sb_pseudo创建了一个super block(包含一个对应dentry及一个关联inode):操作对象为sockfs_ops,根目录名称为socket:,对应的根索引节点编号为1。 ???sockfs_ops定义在net/socket.c中。 1static?const?struct?super_operations?sockfs_ops?=?{ 2????.alloc_inode?=????sock_alloc_inode, 3????.destroy_inode?=?sock_destroy_inode, 4????.statfs?=????simple_statfs, 5}; ???sock_alloc_inode用于分配inode对象,将在socket创建过程中被调用;sock_destroy_inode用于释放inode对象,将在socket销毁过程中被调用;simple_statfs用于获取sockfs文件系统的状态信息。 ??? ???装载sockfs ???由kern_mount函数实现装载一个伪文件系统(当然,它没有装载点),返回一个static vfsmount对象sock_mnt。 ???经过以上步骤后,所创建

文档评论(0)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档