Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5207148
  • 博文数量: 553
  • 博客积分: 13864
  • 博客等级: 上将
  • 技术积分: 11041
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-28 21:25
个人简介

个人Blog: hhktony.com

文章分类

全部博文(553)

文章存档

2015年(1)

2014年(2)

2013年(12)

2012年(384)

2011年(154)

分类: LINUX

2012-04-15 05:20:02

Linux文件系统的整体结构模型大概可以划分为以下层次:
Hard Disk => Disk Driver => Filesystem(ext3,ext4,btrfs ...) => User Operation
 
上面结构模型很简单,有一块物理硬盘,首先这块硬盘需要有硬盘驱动的支持,然后才能在这块硬盘上创建不同的文件系统,然后用户才能使用这块硬盘。但有下面两个问题需要思考:
 
(1). 不同的物理硬盘,需要不同的驱动支持,而不同的驱动,所提供的IO操作接口是不一样的,那么,有没有一个统一的IO操作接口呢?
 
(2). 不同的文件系统,如ext3, ext4, btrfs等所提供的API也是不一样的,那么,有没有一个统一的东西来对这些不同的文件系统进行一个抽象,以提供一个统一的API接口呢?
 
于是,上面的结构层次还可以细分为:


上面的结构中,从硬盘驱动,文件系统,虚拟文件系统,以及系统调用,都属于内核空间,换言之,这些不同层次的实现,都是由内核来做的;而所谓用户空间的操作,也就是一些对磁盘的读写访问操作。
 
1. 硬盘驱动
常见的硬盘类型有PATA, SATA和AHCI等,在Linux系统中,对不同硬盘所提供的驱动模块一般都存放在内核目录树drivers/ata中,而对于一般通用的硬盘驱动,也许会直接被编译到内核中,而不会以模块的方式出现,可以通过查看/boot/config-xxx.xxx文件来确认:

CONFIG_SATA_AHCI=y

2. General Block Device Layer

这一层的作用,正是解答了上面提出的第一个问题,不同的硬盘驱动,会提供不同的IO接口,内核认为这种杂乱的接口,不利于管理,需要把这些接口抽象一下,形成一个统一的对外接口,这样,不管你是什么硬盘,什么驱动,对外而言,它们所提供的IO接口没什么区别,都一视同仁的被看作块设备来处理。

所以,如果在一层做的任何修改,将会直接影响到所有文件系统,不管是ext3,ext4还是其它文件系统,只要在这一层次做了某种修改,对它们都会产生影响。

3. 文件系统

文件系统这一层相信大家都再熟悉不过了,目前大多Linux发行版本默认使用的文件系统一般是ext4,另外,新一代的btrfs也呼之欲出,不管什么样的文件系统,都是由一系列的mkfs.xxx命令来创建,如:

mkfs.ext4 /dev/sda
mkfs.btrfs /dev/sdb


内核所支持的文件系统类型,可以通过内核目录树 fs 目录中的内容来查看。

4. 虚拟文件系统(VFS)

Virtual File System这一层,正是用来解决上面提出的第二个问题,试想,当我们通过mkfs.xxx系列命令创建了很多不同的文件系统,但这些文件系统都有各自的API接口,而用户想要的是,不管你是什么API,他们只关心mount/umount,或open/close等操作。

所以,VFS就把这些不同的文件系统做一个抽象,提供统一的API访问接口,这样,用户空间就不用关心不同文件系统中不一样的API了。VFS所提供的这些统一的API,再经过System Call包装一下,用户空间就可以经过SCI的系统调用来操作不同的文件系统。

VFS所提供的常用API有:

mount(), umount() ...

open(),close() ...

mkdir() ...
阅读(2041) | 评论(1) | 转发(3) |
给主人留下些什么吧!~~

long_yii2012-04-16 10:53:29

可以理解为VFS是块设备的抽象,那对于字符设备呢,那么多字符设备Linux提供怎么样的通用接口的,解释下啊