zoukankan      html  css  js  c++  java
  • Linux文件系统(上)

    Linux文件系统(下)https://www.cnblogs.com/-citywall123/p/12401347.html

    一、一切皆是文件

    在UNIX系统中有一个重要的概念:一切都是文件。也就是说,在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件

    这样用户就可以用读写文件的方式实现对硬件的访问。

    这样带来优势也是显而易见的:
      UNIX 权限模型也是围绕文件的概念来建立的,所以对设备也就可以同样分权限等级处理了。

     

     

    二、文件系统结构模型的细分

      

    我们想象中的文件操作大概是:用户空间-->文件系统-->磁盘设备,但是在一个计算机中的磁盘设备和文件系统是不唯一的,不同硬盘和文件系统对应的IO接口和API是不一样的

    (1). 不同的物理硬盘,需要不同的驱动支持,而不同的驱动,所提供的IO操作接口是不一样的,那么,有没有一个统一的IO操作接口呢?

    (2). 不同的文件系统,如ext3, ext4, btrfs等所提供的API也是不一样的,那么,有没有一个统一的东西来对这些不同的文件系统进行一个抽象,以提供一个统一的API接口呢?
     
     
     
     

      一、硬盘驱动设备(Device Driver)

        我们对硬盘的读写都是通过硬盘驱动设备进行的,硬盘驱动设备可以将存储在磁盘上的信息读进内存中,又能将内存中的信息写到磁盘上,所以即是输入设备,也是输出设备

        不同硬盘的驱动模块不一样,一般保存在内核目录树drivers/ata中,而对于一般通用的硬盘驱动,也许会直接被编译到内核中,而不会以模块的方式出现

      二、通用块设备层(General Block Device Layer)

        这一层的作用,正是解答了上面提出的第一个问题,不同的硬盘驱动,会提供不同的IO接口,内核认为这种杂乱的接口,不利于管理,需要把这些接口抽象一下,形成一个统一的对外接口,

        这样,不管你是什么硬盘,什么驱动,对外而言,它们所提供的IO接口没什么区别,都一视同仁的被看作块设备来处理。

      三、文件系统(EXT3、EXT4、btrfs等)

        文件系统是操作系统在存储设备上组织文件的方法,在文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。

        具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

        目前大多Linux发行版本默认使用的文件系统一般是ext4,不管什么样的文件系统,都是由一系列的mkfs.xxx命令来创建,如:  

    mkfs.ext4 /dev/sda

    mkfs.btrfs /dev/sdb

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

      四、虚拟文件系统(Virtual File System,VFS)

        VFS这一层,正是用来解决上面提出的第二个问题,试想,当我们通过mkfs.xxx系列命令创建了很多不同的文件系统,但这些文件系统都有各自的API接口,而用户想要的是,不管你是什么API,

        他们只关心mount/umount(挂载分区/卸载分区命令),或open/close(文件读写命令)等操作。

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

        用户空间就可以经过SCI的系统调用来操作不同的文件系统。

        VFS是一个抽象层,其向上提供了统一的文件访问接口,而向下则兼容了各种不同的文件系统。

        另外,VFS实现了一部分公共的功能,例如页缓存和inode缓存等,从而避免多个文件系统重复实现的问题。

        参考 https://baijiahao.baidu.com/s?id=1621555464151870974&wfr=spider&for=pc

      

      五、系统调用和应用程序API接口(System Call Interface)

        系统调用是应用程序调用内核空间提供服务的一个接口,通常是通过中断来实现的,会有用户态到内核态的切换

        应用程序的API接口是通过函数定义实现的,没有用户态到内核态的切换

    参考博客:http://blog.chinaunix.net/uid-26838492-id-3156661.html

  • 相关阅读:
    搜索框的实现
    图片瀑布流实现
    git的基本操作总结
    linux中常用命令总结
    JavaScript中的闭包
    springmvc执行过程
    位运算
    MySQL与Oracle数据库连接配置
    java 基础数据类型大小
    spring源码编译控制台输出乱码
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13524552.html
Copyright © 2011-2022 走看看