• 文件系统,根文件系统,MTD


    为什么会有不同的文件类型?
    由于存储介质有很多种,所以没有办法用一种统一的格式存放文件系统到各种不同的存储介质上,
    而是需要多种不同的存储格式来适应各种存储介质的特性。
    以求达到存取效率和空间利用率的最优化,这样就需要对每种存储格式制定一个规范,这种规范就叫文件系统类型。

    文件系统是对一个存储设备上的数据和元数据进行组织的机制。
    这种机制有利于用户和操作系统的交互。

    尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。

    在 UNIX 传统中,它使用文件 I/O 机制管理硬件设备和数据文件

    cpio
    jffs2
    squashfs
    ubifs
    yaffs2
    romfs //引导系统的文件系统

    文件系统实际上是什么?
    文件系统是一个程序,管理harddisk的程序。
    实际上文件系统应该包含两部分,一部分是软件逻辑,另一部分是记录文件归档所需要的数据结构(数据的组织机制)。
    软件逻辑实际上可以作为操作系统内核的一部分而存在,是提供操作系统访问存储器的软件接口。
    文件系统不是一种运行中的软件,而是一堆等待被调用的代码,有点像驱动,但又不纯粹是驱动,感觉它并没有直接操控硬件。
    在用户需要存储文件的时候,如使用touch命令 touch test.c;
    这个时候就会创建一个文件,这个文件有目录(path),文件名,等各种文件信息。
    对应不同的文件系统就会以不同的数据组织方式登记在存储器分区中了。而登记和文件信息的组织方式就是在调用文件系统的那一堆驻留内核的代码来完成的。

    而记录文件归档所需要的数据结构则是在实际的存储器空间之外的存在harddisk固定位置的一堆元数据,
    每次存取文件或一切改变文件归档的操作都会对这里的数据结构产生修改。

    我们烧写程序时,实际是将程序先烧写到了内存当中,然后由内存搬运到NAND flash中。

    分区是将存储器分别管理的一种做法。
    存储器分区即可以实现对不同的分区使用不同的文件系统。
    文件系统是建立于管理存储器的一种程序。

    VFS

    VFS是虚拟文件系统,在VFS中有对各种具体文件系统的接口,
    虚拟文件系统向上能提供统一的一套操作设备的接口,向下调用下层具体文件系统接口即可实现。

    VFS虚拟文件系统,linux内核中的一个软件层;
    给用户空间的程序提供文件系统接口;提供了抽象的功能,运行不同的文件系统共存;
    所有的文件系统依赖VFS共存,也依靠VFS协同工作;

    VFS是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;
    VFS所提供的常用API有:mount umount open close。
    同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。
    系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
    换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准的接口,才能与 VFS 协同工作。
    实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。

    MTD和flash

    具体地讲,基于 MTD 的 FLASH 驱动,承上可以很好地支持 cramfs , jffs2 和 yaffs 等文件系统,启下也能对 FLASH 的擦除,读写,
    FLASH 坏块以及损耗平衡进行很好的管理。
    所谓损耗平衡,是指对 NAND 的擦写不能总是集中在某一个或某几个 block 中,这是由 NAND 芯片有限的擦写次数的特性决定的。

    MTD Memory Technology Device 内存技术设备
    虚拟设备驱动层,类似于VFS。
    提供标准API给那些device driver

    三种操作:read,write和erase,
    另外,还需要一种wear leveling算法来做损耗均衡

     

    MTD 分区与文件系统联系://讲得不错
    https://blog.csdn.net/u010442934/article/details/80269884

    VFS与MTD //两者关系讲得不错,尤其是emmc介绍
    https://blog.csdn.net/chun_1959/article/details/38585645

    根文件系统理解 //鸡生蛋,蛋生鸡
    https://liefyuan.blog.csdn.net/article/details/108489390

    浅谈linux中的根文件系统(rootfs的原理和介绍)://根文件系统介绍得很好
    https://blog.csdn.net/polarisyj86/article/details/94553628

    Linux内核启动及根文件系统加载过程://内核启动过程讲解很好
    https://blog.csdn.net/gqb_driver/article/details/26954425

    Linux磁盘分区,目录树,文件系统的关系(转):
    https://www.cnblogs.com/softidea/p/5155503.html

    LINUX 文件系统根目录 挂载点间的区别与联系:
    https://blog.csdn.net/baidu_34051990/article/details/60963947

    Linux系统挂载点与分区的关系(转载):
    https://blog.csdn.net/stillwaters123/article/details/61639405?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242

    u-boot中添加mtdparts支持以及Linux的分区设置:
    https://www.cnblogs.com/pengdonglin137/p/4646269.html

    MTD和 uboot中的bootargs 下属 mtdparts://讲得很好
    https://blog.csdn.net/lh2016rocky/article/details/53207637

    mtd分区,uboot分区;
    https://www.cnblogs.com/pengdonglin137/p/3291277.html

    linux内核中mtd架构分析:
    https://www.cnblogs.com/embedded-linux/p/5816970.html

    mtdparts格式介绍:
    https://www.cnblogs.com/rohens-hbg/p/6844295.html

    uboot,mtdparts与mtd:
    https://blog.csdn.net/bigmarco/article/details/7354491?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=97ed61df-b659-4fb9-8ff6-b3164ee5f961&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control


    ============【内核启动过程,挂载根文件系统】===============
    内核启动过程:
    启动第一个进程init;在启动前必须挂载根文件系统;
    只读方式挂载根文件系统,
    linux启动阶段还不是很稳定,可以防止linux万一宕机了破坏根文件系统上的数据。

    挂载根文件系统的目的:
    1、安装适当的内核模块;以便驱动某些硬件设备或启动某些功能;
    2、启动存储于文件系统中的init服务


    驱动程序编译成模块的方式;
    内核加载时判定当前用的是什么磁盘再加相应的磁盘驱动模块;
    但是文件系统还没加载的阶段,根本加载不了磁盘驱动模块,也就访问不了磁盘。
    加载文件系统的前提是磁盘启动程序已经加载了。
    这就是一个鸡生蛋,蛋生鸡的问题。
    解决方法是内核加载的时候,RAM已经可以用了。
    基于RAM建立一个临时文件系统;
    临时文件系统挂载到自己身上。


    根文件系统首先是一种文件系统。
    该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,
    它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统;
    内核代码的映像文件保存在根文件系统中,
    系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。
    在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。

    根文件系统处于文件系统的最上层,其很重要的作用是用来挂载其他文件系统。
    实际文件系统有实际的存储设备(ROM)与之对应,又可分为远程文件系统和本地文件系统
    根文件系统可以是虚拟文件系统也可以是实际文件系统,只要条件支持。

    根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件。
    init进程的应用程序必须运行在根文件系统上
    根文件系统提供了根目录“/”

    Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。
    成功之后可以自动或手动挂载其他的文件系统。
    因此,一个系统中可以同时存在不同的文件系统。
    在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。
    使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。
    在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。
    根文件系统被挂载到根目录下“/”上后,在根目录下就有根文件系统的各个目录,文件:/bin /sbin /mnt等,
    再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录和文件。

    ===================================================

    参考链接:

    MTD系统剖析:
    https://blog.csdn.net/lwj103862095/article/details/21545791

    Linux根文件系统制作与各种挂载方式的实现
    https://blog.csdn.net/hubinbin595959/article/details/79403914

    ROMFS文件系统分析:
    https://blog.csdn.net/yi412/article/details/45967775

    对嵌入式Linux中的根文件系统的理解和解析
    https://blog.csdn.net/weixin_37414365/article/details/80658546

    linux根文件系统的挂载过程详解

    https://www.jb51.net/linuxjishu/540693.html

    Linux文件系统详解
    https://blog.csdn.net/github_37882837/article/details/90672881

    linux的VFS详解:
    https://blog.csdn.net/jinking01/article/details/90669534

     

    一些参考图:

     

     

     

     

     

     

    知行合一
  • 相关阅读:
    fastcgi(一)
    矩阵旋转运算(一)
    【10.9】multiprocessing多进程编程
    【10.8】多线程和多进程的比较
    【10.7】ThreadPoolExecutor线程池
    【10.6】线程同步--Semaphore 使用以及源码分析
    【10.5】线程同步--conditon 使用以及源码分析
    【10.4】线程同步--Lock、RLock
    【10.3】线程间通信--共享变量和Queue
    【10.2】多线程编程-threading
  • 原文地址:https://www.cnblogs.com/grooovvve/p/14580000.html
Copyright © 2020-2023  润新知