【笔记:http://m.blog.csdn.net/blog/zhouzhou135】
在了解文件系统之前,先了解磁盘格式化的知识。
所以要理解文件系统的数据结构,要从两个方向来理解:
1:磁盘中的数据结构:因为在磁盘格式化的时候,操作系统将初始的文件系统数据结构写到磁盘上。这些数据结构包括空闲和已分配的空间(FAT或者iNode)和一个初始为空的目录。
2:内存中的数据结构:
文件管理是操作系统的主要任务之一,也是平常编程中经常涉及的一个知识点。
先参考维基百科了解什么是文件系统,引入文件系统的目的是什么,文件系统的职责是什么。
简言之:文件系统是为了方便用户管理硬盘和光盘等物理设备中的数据而引入的这么一个逻辑上的概念。
假设没有文件系统,那么对用户而言:
读数据的时候:必须要知道这个数据块保存在光盘或者磁盘的具体哪个扇区上,然后要读取多长的记录。
写数据的时候:必须要知道哪些磁盘块是空闲的以便写入数据。
同时用户必须自己保存数据和磁盘块之间的映射信息,以便读写的时候知道从哪个磁盘地址开始读写。
于是用户就幻想说要是有这样一个中间者就好了:
读的时候,我把数据名给中间者,中间者直接给我具体的磁盘数据,而不是我自己去磁盘上找。
写的时候,我把要写的数据给中间者,中间者具体负责写到磁盘上的某个位置。
这样的话,这个中间者必须维护某个数据名与磁盘位置的映射关系。而用户只需要和某个数据名(逻辑名字)打交道,而不用关心这个逻辑名字代表的数据在物理上的具体存储位置。
用户 ——> 具体的磁盘或光盘
用户 ——> 中间者提供的接口 ——> 具体的磁盘或者光盘
也就是说,有了中间者,用户只需要和中间者提供的接口打交道,而不再与具体的物理设备耦合。
最后为了方便,大家说咱们取一个统一的名字吧,于是出现了一下称呼:
文件系统:代表这个中间者。最终映射到计算机上,这个文件系统的实现会表现为具体的程序代码。
文件:代表存储在某种长期储存设备或临时存储设备中的一段数据流。虽然一个文件表现为一个单一的流,但它经常在磁盘不同的位置存储为多个数据碎片(甚至是多个磁盘)。
一个代表数据名的结构 ——> 一个封装了磁盘块信息的结构。
比如说数据名dataone在硬盘的a分区的b位置开始,长度为3个磁盘块。
如果不引入树形结构的这个方式的话,那么数据a,数据b,数据c,数据d, 数据abc就很容易重名。于是就映入了树形结构的命名空间。
在文件系统中,文件名是提供给用户标志他存放在磁盘上的某个数据的。
APUE:p56 文件共享 打开文件的内核数据结构。
APUE:p86 文件系统
Linux高级程序设计:
进程打开文件的内核数据结构。p101
VFS虚拟文件系统 p129
概述
VFS中的数据结构
超级块
VFS的索引节点
目录项对象
与进程相关的文件结构
主要数据结构间的关系
有关操作的数据结构
如何实现一个文件系统
struct stat、struct inode 、struct file 的关系
===========================================
参考《操作系统概念(第七版)》第四部分 存储管理,先弄清文件、目录的概念。
文件:
目录:可以实现为一张表,里面保存了数条文件名和该文件名对应的索引信息的映射关系。其中的每一项叫做目录项。
打开文件表:因为每次对文件读、写等操作都要涉及到去目录中搜索对应的文件名对应的所有信息,因此非常耗时,为避免该问题,系统维护了一个包含所有打开文件的信息表。参考P323
多个进程打开同一文件的处理方法?p324 系统范围内的系统打开文件表 vs 每个进程的进程打开文件表
a,b,...进程的进程打开文件表→系统打开文件表(保存进程无关的信息)→目录→具体的物理设备
这些内容在《现代操作系统(原书第3版)》p446有详细描述。
===========================================
参考《现代操作系统(原书第3版)》第4章 文件系统:★★★★★
文件:是为了解决进程存储信息时遇到的一些问题而建立的一种抽象。文件时进程创建的信息逻辑单元。
p153 文件系统在磁盘上的布局
p156:物理inode
p161 : 虚拟文件系统,open系统调用在VFS中的过程。
p179 :Unix v7文件系统:open系统调用时查找iNode的过程。
p440:Linux文件系统
p445 :SuperBlock、Dentry、Inode、File对象
p448:文件描述符表、打开文件描述符表、INode表之间的关系
深入理解磁盘文件系统之inode:http://www.cnblogs.com/thinksasa/archive/2013/04/10/3013445.html
一天一点学习Linux之认识文件系统:http://www.opsers.org/base/the-knowledge-that-one-day-learn-linux-file-system.html
一天一点学习Linux之Inode详解:http://www.opsers.org/base/one-day-the-little-learning-linux-inode-detailed.html
===========
VFS中的超级块、VFS的索引节点、目录项这三个对象的理解,结合视频12.10中00:06:08处的那张图,并结合以下链接:
超级块
VFS的索引节点
目录项对象
或者《linux内核设计与实现》对应部分一起理解。