上一节主要对Linux系统中的内核空间与用户空间做了简单的分析,在这一节里,将从内核空间和用户空间对Linux文件系统进行一定的剖析。
谈及文件系统,很多Linux用户都会有一个比较模糊和神秘的概念,如果对文件系统的来龙去脉有一定的了解,相信大家就能走出迷雾,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() ...

 

最新文章

  1. js/javascript format json(js/javascript 格式化json字符串)
  2. 【Beta】Daily Scrum Meeting第一次
  3. aBowman >>可以运用到自己博客上的小插件
  4. IOS第16天(2,Quartz2D下载进度条)
  5. 9_13学习完整修改和查询&&实体类,数据访问类
  6. js generator数据类型
  7. Android IOS WebRTC 音视频开发总结(五一)-- 降噪基本原理
  8. Java再学习——sleep(), wait(), notify(), notifyAll()
  9. Gson ------ 实例演习
  10. idea导入项目出错
  11. SQL Server MYSQL 检查点的好处
  12. Application(basic)----Easyui
  13. web前端上传图片的几种方法
  14. Python中模块之os的功能介绍
  15. Machine Learning 思维导图
  16. 关于webApi 跨域请求
  17. Hadoop 学习之Docker
  18. 判断字符串是否为正整数 & 浮点小数
  19. IOZONE测试工具使用方法
  20. java.util.Random 类

热门文章

  1. ASP.NET中把xml转为dataset与xml字符串转为dataset及dataset转为xml的代码
  2. 从问题看本质:socket到底是什么(问答式)? .
  3. Iterator之java.util.ConcurrentModificationException
  4. (转) Tomcat部署Web应用方法总结
  5. (spring-第4回【IoC基础篇】)spring基于注解的配置
  6. Monogb基本概念及基本操作
  7. iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
  8. js打印方法总结
  9. HDU 1350
  10. WPF Step By Step 自定义模板