加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Linux 的虚拟文件系统(真正理解“一切皆文件”)

发布时间:2019-06-15 02:34:50 所属栏目:站长百科 来源:cpp软件架构狮
导读:1,弁言 Linux 中应承浩瀚差异的文件体系共存,如 ext2, ext3, vfat 等。通过行使统一套文件 I/O 体系 挪用即可对 Linux 中的恣意文件举办操纵而无需思量其地址的详细文件体系名目;更进一步,对文件的 操纵可以跨文件体系而执行。如图 1 所示,我们可以使

不管是path_lookup_open()照旧path_lookup_create()最终都是挪用 __path_lookup_intent_open()来实现查找文件的成果。 查找时,在遍历路径的进程中,会逐层地将各个路径构成部门理会成目次项工具,假云云目次项工具在目次项缓存中,则直接从缓存中得到;假如该目次项在缓存中 不存在,则举办一次现实的读盘操纵,从磁盘中读取该目次项所对应的索引节点。获得索引节点后,则成立索引节点与该目次项的接洽。云云轮回,直到最终找到目 标文件对应的目次项,也就找到了索引节点,而由索引节点找到对应的超等块工具就可知道该文件地址的文件体系的范例。 从磁盘中读取该目次项所对应的索引节点;这将激发VFS和现实的文件体系的一次交互。以前面的VFS理论先容可知,读索引节点要领是由超等块来提供的。而 当安装一个现实的文件体系时,在内存中建设的超等块的信息是由一个现实文件体系的相干信息来添补的,这里的相干信息就包罗了现实文件体系所界说的超等块的 操纵函数列表,虽然也就包罗了读索引节点的详细执行方法。 当继承追踪一个现实文件体系ext3的ext3_read_inode()时,可发明这个函数很重要的一个事变就是为差异的文件范例配置差异的索引节点操 作函数表和文件操纵函数表。

清单8. ext3_read_inode

  1. void ext3_read_inode(struct inode * inode) 
  2.  { 
  3.  …… 
  4.  //是平凡文件  
  5.  if (S_ISREG(inode->i_mode)) { 
  6.  inode->i_op = &ext3_file_inode_operations; 
  7.  inode->i_fop = &ext3_file_operations; 
  8.  ext3_set_aops(inode); 
  9.  } else if (S_ISDIR(inode->i_mode)) { 
  10.  //是目次文件 
  11.  inode->i_op = &ext3_dir_inode_operations; 
  12.  inode->i_fop = &ext3_dir_operations; 
  13.  } else if (S_ISLNK(inode->i_mode)) { 
  14.  // 是毗连文件  
  15.  …… 
  16.  } else {  
  17.  // 假如以上三种环境都解除了,则是装备驱动 
  18.  //这里的装备还包罗套结字、FIFO等伪装备  
  19.  ……  

3.1.2 nameidata_to_filp子函数:__dentry_open

这是VFS与现实的文件辖档酮系的一个要害点。从3.1.1末节说明中可知,挪用现实文件体系读取索引节点的要领读取索引节点时,现实文件体系会按照文件 的差异范例赋予索引节点差异的文件操纵函数集,如平凡文件有平凡文件对应的一套操纵函数,装备文件有装备文件对应的一套操纵函数。这样当把对应的索引节点 的文件操纵函数集赋予文件工具,往后对该文件举办操纵时,好比读操纵,VFS固然对各类差异文件都是执行统一个read()操纵界面,可是真正读时,内核 却知道怎么区分看待差异的文件范例。

清单9. __dentry_open

  1. static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt, 
  2.  int flags, struct file *f, 
  3.  int (*open)(struct inode *, struct file *)) 
  4.  { 
  5.  struct inode *inode; 
  6.  …… 
  7.  //整个函数的事变在于添补一个file工具 
  8.  …… 
  9.  f->f_mapping = inode->i_mapping;  
  10.  f->f_dentry = dentry; 
  11.  f->f_vfsmnt = mnt; 
  12.  f->f_pos = 0;  
  13.  //将对应的索引节点的文件操纵函数集赋予文件工具的操纵列表 
  14.  <span class="boldcode">f->f_op = fops_get(inode->i_fop); </span> 
  15.  ……  
  16.  //若文件本身界说了open操纵,则执行这个特定的open操纵。 
  17.  if (!open && f->f_op) 
  18.  open = f->f_op->open;  
  19.  if (open) { 
  20.  error = open(inode, f); 
  21.  if (error) 
  22.  goto cleanup_all; 
  23.  …… 
  24.  return f; 

3.2 sys_read()

sys_read()体系挪用用于从已打开的文件读取数据。如read乐成,则返回读到的字节数。如已达到文件的尾端,则返回0。图9是sys_read()实当代码中的函数挪用相关图。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读