📄 00000003.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: BlueOcean (Blue), 信区: Unix <BR>标 题: 好书共赏-《Unix Internels》(三) <BR>发信站: BBS 水木清华站 (Mon Apr 27 13:20:24 1998) m2mWWW-POST0m0m <BR> <BR> <BR>Chapter 8 File System Interface and Framework <BR> <BR>本节前半段讨论(复习)跟filesystem有关的系统呼叫. 後半段讨论mordern <BR>Unix的VFS (vnode)架构, 亦即, kernel处理file system的方法. 下一个chapter <BR>主要讨论file system在disk上的layout. <BR> <BR>s5fs是unix早期(System V r4以前)档案系统,特色是简单但功能尚可,最大 <BR>的缺点是有14个字的档名限制. 4.2BSD设计了Fast File System, FFS, <BR>提供了较优的performance和功能. FFS受到广大的欢迎, 最後被SVR4 <BR>所采用. FFS又称为UFS (UNIX File System) <BR> <BR>早期的Unix kernel不能同时支援两种以上的档案系统. 各家 <BR>都有解决之道. AT&T用file system switch, DEC用gnode/gfs, Sun <BR>所提出的vnode/vfs最广为接受, 最後赢得胜利,成为SVR4的 <BR>一部份. <BR> <BR>inode 是Unix特有的观念. Unix kernel利用inode来作为他对档案的介面. <BR>一个inode代表一个档案, 记录了kernel存取该档案所需要用到的资料, <BR>以及该档案的属性等等.名叫inode的原因是因为本资料结构的大部份 <BR>内容皆由on-disk的inode而来.Unix file system 在disk上的image不用档名 <BR>而用整数(i-number)来表示每一个档案. 目录只是一个较为特别的档案, <BR>记录i-number和档名的对照而已.有了i-number,kernel才找得到inode, <BR>也就是记录档案存放位置与属性的地方.一般称在disk上的inode为on-disk <BR>inode,被kernel读进记忆体,使用中的inode为in-core inode. <BR> <BR>vnode/vfs的概念是把原来in-core inode物件化成为 virtual class. <BR>vnode提供一个抽象化的介面. kernel要对档案的所有操作接 <BR>透过vnode所定义的虚拟函式来达成. 一个vnode 初始化後,就 <BR>会有个指标指向file system dependant part.所以不管底下的档案 <BR>系统格式为何, kernel皆能呼叫到正确的函数. VFS的架构使得 <BR>Unix可以支援多重档案系统, kernel经由vnode提供档案系统的 <BR>发展者一个标准的介面. 七月号的InfoMac介绍狂想曲的 <BR>一篇文章说VFS可以有档案压缩,解压缩,线上防毒的功能, <BR>真的是颇为奇怪.. <BR> <BR>比较特别的是Unix的实作和定义有点不太一样. <BR>定义说: <BR> <BR> struct vnode { <BR> <BR> public_data1,2,3,.... <BR> <BR> caddr_t v_data; <BR> <BR> } vnode; <BR> <BR> vnode.v_data = (caddr_t *)&ffs_data; <BR> <BR>而实作作成这样,把interface和file system dependant data放在一起: <BR> <BR> struct ffs_node { <BR> <BR> public_data1,2,3,... /*和struct vnode顺序一样*/ <BR> <BR> caddr_t v_data; <BR> <BR> private_data1,2,3.... /* ffs private data */ <BR> <BR> } vnode; <BR> <BR> vnode.v_data = (caddr_t *)&vnode; <BR> <BR>Understand?不懂就去看书吧!书上是用图示法的,见图知意. <BR> <BR>vnode/vfs有个地方和原本的unix不一样,会导致race condition.我想这是 <BR>许多security hole的泉源.就是file name lookup不一样.以前只有一个 <BR>filesystem的时候(看Bach的书) Unix是传一个路径给namei(),就可以找到 <BR>inode. vnode的方法要把一个路径切碎,一段一段找.这也使performance <BR>降低不少. (unix filesystem瓶颈之一在file name lookup,每次lookup都会 <BR>碰到路径上每一个目录的inode....4.4BSD和OSF/1都有提出解决的对策. <BR>(自己看书,太琐碎了) <BR> <BR>有了vnode/vfs, 则可以鼓励出更多的创意, 更多的档案系统可以被提出来. <BR>比较有趣的有NFS, specfs, fifofs, /proc fs.这里顺便提一下後三者.本书是在 <BR>稍後的章节才提到. <BR> <BR>specfs在干什麽的呢?以前s5fs的时代,有些特别的inode不表示实体的档案, <BR>而是用来表示周边装置.现在假设我们的ffs上有个/dev/tty1的档案. 利用 <BR>刚刚提到的vnode/vfs的方式, kernel会去呼叫到ffs的函式,而这些函式并不能 <BR>知道怎样驱动tty driver.解决的方式是设计一个specfs.只要kernel发现 <BR>inode是个device file的话,就不去呼叫vnode的open,而是呼叫specvp(),把 <BR>该vnode传给他.specvp就会把适当的virtual function和指标填到vnode去, <BR>而得到所希望的操作.这就是specfs存在的目的. Chapter 16有更详细的资料. <BR>并讨论到不同device file major/minor device number都一样,也就是指到 <BR>相同device的问题解法. <BR> <BR>fifofs和specfs一样.用来把ffs的某个vnode换成有fifo作用的named pipe. <BR> <BR>/proc file system则是把process在记忆体中的状态,转换为file system的方式 <BR>方便存取.这样子debugger得以更方便的控制process,提供更多的功能, <BR>也可以debugger执行到一半的process. (前面提到在旧的Unix下,这是不可行的) <BR> <BR> <BR>Chapter 9 File System Implementations <BR> <BR>本章主要讨论on disk file system layout, 和一些其他的file system. <BR>前面没有提到vnode在kernel如何组织,所以这章也补齐. <BR> <BR>首先是s5fs.其实这还是自己看比较快,看图说故事就对了. <BR> <BR>比较特别的是file system如何处理free block. s5fs用free block <BR>list来管理free block.这个list会很占空间吗?不会的,因为此 <BR>list在free block上,也就是借用没有用的的空间.free block list <BR>的大小和所剩的空间成正比.如果没有空间了,也不需要 <BR>free block list了; free block list原先占用的空间就 <BR>会释出来当作free block用. <BR> <BR>其实前面没说清楚. free block list分成两部份.在super block <BR>内有一小节,剩下的才放在free data block上. super block的 <BR>free list用完了就会从free data block上的list调借. 所以 <BR>free block list占用data block的空间会在data block用完前释出. <BR> <BR> <BR>Berkeley Fast File System <BR> <BR>s5fs有许多限制, performance是一个问题.比如说ls -l dir,就会在inode和dir <BR>的档案间来回奔跑. (inode才有file attribute.) s5fs把inode table放在disk <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -