1、简介

由于最近开发录像存储功能,因此需要对文件系统进行了解,这一节先介绍一下磁盘的的基础知识。

2、机械硬盘

2.1 机械硬盘物理结构

机械硬盘主要由盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。如下图所示:

2.2 机械硬盘的逻辑结构

机械硬盘会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。机械硬盘逻辑上将空间分为扇区、磁道、柱面进行管理。具体示意图如下:

  • 扇区:硬盘的内部圆形金属盘片被磁道划分成若干个扇形区域,用以存储数据,硬盘的读写以扇区为基本单位。
  • 块/簇:磁盘块/簇(虚拟出来的)。 块是操作系统中最小的逻辑存储单位。操作系统与磁盘打交道的最小单位是磁盘块。

存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数;

下面的命令查看的是SD的信息

# fdisk -l /dev/mmcblk0Disk /dev/mmcblk0: 31.9 GB, 31927042048 bytes
4 heads, 16 sectors/track, 974336 cylinders
Units = cylinders of 64 * 512 = 32768 bytesDevice Boot      Start         End      Blocks        Id System
/dev/mmcblk0p1      1          974336    31178744   c Win95 FAT32 (LBA)

3、FAT32文件系统

3.1 FAT32简介

  • 文件系统:操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。

  • FAT32文件系统: FAT32指的是文件分配表是采用32位二进制数记录管理的磁盘文件管理方式,因FAT类文件系统的核心是文件分配表,命名由此得来。FAT32是从FAT和FAT16发展而来的,优点是稳定性和兼容性好,能充分兼容Win 9X及以前版本,且维护方便。缺点是安全性差,且最大只能支持2T分区,单个文件也只能支持最大4GB

3.2 FAT32 存储器数据分布结构详解

FAT32文件系统存储器数据分布结构如下所示:

  • MBR扇区;
  • 保留扇区;
  • DBR扇区即文件系统0扇区;
  • FSINFO扇区,文件系统1扇区;
  • 保留扇区;
  • FAT表;
  • 根目录;
  • 数据区;

其具体示意图如下:

下面对上述内容分别介绍:

  • MBR扇区:
    硬盘第一个扇区,前446字节为硬盘主引导记录(即Master Boot Record,MBR),其后64字节为分区表,最后2个字节为结束码(固定为55 AA)。下图是分区表的示意图:

    分区表,每16字节为一个分区表项,64字节总共可以存放4个分区表项,分区表数据结构如下所示。

    其数据结构如下所示:
struct partition {uint8_t boot_ind;uint8_t head;uint8_t sector;uint8_t cyl;uint8_t sys_ind;uint8_t end_head;uint8_t end_sector;uint8_t end_cyl;uint8_t start[4];uint8_t size[4];
}__attribute__ ((__packed__));
  • DBR扇区:
    DBR扇区详细结构如下图所示:

    其数据结构如下所示:
struct msdos_boot_sector
{uint8_t boot_jump[3];uint8_t system_id[8];uint8_t sector_size[3];uint8_t cluster_size;uint16_t res; uint8_t fats;uint8_t dir_entries[2];uint8_t sectors[2];uint8_t media;uint16_t fat_lenght;uint16_t secs_track;  uint16_t heads;uint32_t hidden;uint32_t total_sect;union {struct {struct msdos_volume_info vi;uint8_t boot_code[BOOTCODE_SIZE];}__attribute__ ((packed)) _oldfat;struct {uint32_t fat32_lenght;uint16_t flags;uint8_t ver[2];uint32_t root_cluster;uint16_t info_sector;uint16_t backup_root;uint16_t res[2];}__attribute__ ((packed)) _fat32;}__attribute__ ((packed)) fstype;uint16_t boot_sign;
}
  • FSINFO扇区:
    FSINFO扇区如下如所示:

    其具体数据结构如下图所示:
struct fat32_fsinfo {uint32_t res;uint32_t signature;uint32_t free_clusters;uint32_t next_cluster;uint32_t res[4];
}
  • FAT表:
    文件系统分配磁盘空间按簇来分配。对于大文件,需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘中一个连续地区域内,而往往会分若干段,像链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,文件系统必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继的下一个簇的簇号,对于文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT 表对应表项中记录着它所代表的簇的有关信息:诸如是空,是不是坏簇,是否是已经是某个文件的尾簇等。

每个簇的簇地址是有32bit(4个字节),FAT表中的所有字节位置以4字节为单位进行划分。

  • 特殊:0x0FFFFFF8
  • 结束:0x0FFFFFFF
  • 坏簇:0x0FFFFFF7
    其中FAT表0、1固定为 0x0FFFFFF8、 0x0FFFFFFF ,2号簇为根目录;
  • 目录项:
    目录所在的扇区,都是以32 Bytes划分为一个单位,每个单位称为一个目录项,即每个目录项的长度都是32 Bytes 。根目录由若干个目录项组成,一个目录项占用32个字节,可以是长目录项、短目录项、“.”目录项和“…”目录项等。每个文件都对应于一个目录项。
  • 短目录项:

    其数据结构:
typedef struct {uint8_t name[8];uint8_t ext[3];uint8_t lcase;uint8_t ctime_ms;uint16_t ctime;uint16_t cdate;uint16_t adate;uint16_t starthi;uint16_t time;uint16_t date;uint16_t start;uint32_t size;
} msdos_dir_entry;
  • 长目录项:

    其数据结构:
typedef struct
{uint8_t id;uint8_t name0_4[10];uint8_t attr;uint8_t res;uint8_t alias_checksum;uint8_t name5_10[12];uint16_t start;uint8_t name11_12[4];
} msdos_dir_slot;

3.3 FAT32 文件系统格式化流程

FAT32格式化主要分为5部分:

  1. 设置分区表;
  2. FAT32的DBR扇区;
  3. FSINFO扇区;
  4. FAT表;
  5. 根目录初始化;
  • 设置分区表:
    –prepare_for_createfile
    ----getTotalSectors获取SD卡总扇区
    ----usrFdiskPartCreate根据SD卡大小进行分区
    ------add_partition_auto填写分区表
    --------set_partition设置每个分区表
    ----------set_start_sect填写分区起始扇区
    ----------set_nr_sects填写分区总扇区数
    ------write_part_table_flag写结束码(0xAA55)
    ------write_sector将内存数据写入到SD卡

  • FAT32的DBR扇区初始化:
    prepare_for_createfile格式化总接口
    –dosFsCreate格式化分区,可传入扇区大小、簇大小等参数
    ----mkfs_main格式化主函数
    ------getopt解析参数,目前不带入参数
    ------count_blocks统计设备分区总块数
    ------open打开分区文件,所有的格式化都是对这个分区文件进行读写
    ------establish_params创建参数
    --------media设置媒体介质0XF8
    --------cluster_size设置簇大小,fs size >= 16G: 16k clusters
    --------setup_tables设置表参数
    --------system_id文件系统标志和版本号,mkdosfs
    --------volume_id卷序列号,格式化时间
    --------volume_label卷标,11个空格
    --------boot_jump跳转指令
    --------fat32.boot_code引导码,420字节
    --------boot_sign结束码,0xAA55
    --------reserved保留扇区个数
    --------fats,FAT表个数,2个
    --------hidden隐藏扇区数,未使用
    --------fat32.fat32_length,FAT表大小
    --------fat32.flags 标志,0
    --------fat32.version版本号,0
    --------fat32.root_cluster根目录簇号,簇号2
    --------fat32.info_sector,FSINFO扇区号,扇区1
    --------fat32.backup_boot,DBR扇区备份扇区号,扇区6
    --------total_sect文件系统总扇区数
    --------ext_boot_sign扩展引导标志,0x29

  • 根目录初始化:
    prepare_for_createfile
    –dosFsCreate格式化分区,可传入扇区大小、簇大小等参数
    ----mkfs_main格式化主函数
    ------setup_tables设置表参数
    --------de->name文件名
    --------de-> ext扩展名
    --------de->attr 文件属性 ATTR_VOLUME卷标
    --------de->time时间
    --------de->date日期
    --------de->starthi文件起始簇号高2位
    --------de->start文件起始簇号低2位
    --------de->size文件大小

  • FAT表初始化:
    prepare_for_createfile
    –dosFsCreate格式化分区,可传入扇区大小、簇大小等参数
    ----mkfs_main格式化主函数
    ------setup_tables设置表参数
    --------mark_FAT_cluster (0, 0xffffffff)设置第一个FAT表项0x0FFFFFF8
    --------mark_FAT_cluster (1, 0xffffffff)设置第一个FAT表项0x0FFFFFFF
    --------mark_FAT_cluster (2, FAT_EOF)设置根目录簇号FAT表项

  • FSINFO扇区:
    prepare_for_createfile
    –dosFsCreate格式化分区,可传入扇区大小、簇大小等参数
    ----mkfs_main格式化主函数
    ------setup_tables设置表参数
    --------扩展引导标志 4字节,字符串“RRaA”
    --------未使用区域,420字节,置零
    --------info->signature 4字节,签名0x72724161
    --------info->free_clusters 4字节,文件系统空簇数
    --------info->next_cluster 4字节 下一可用簇号,2号
    -------info->next_cluster 4字节 下一可用簇号,2号

  • 写入到SD卡:
    prepare_for_createfile
    –dosFsCreate格式化分区,可传入扇区大小、簇大小等参数
    ----mkfs_main格式化主函数
    ------write_tables将初始化在内存的数据写到SD卡
    --------seekto定位到偏移地址
    --------writebuf写入数据

参考资料:
https://baike.baidu.com/item/FAT32/827339?fr=aladdin
https://blog.csdn.net/li_wen01/article/details/79929730/
https://blog.csdn.net/z1026544682/article/details/99759500

文件系统 -- 磁盘基础知识和FAT32文件系统详细介绍相关推荐

  1. Sketch Mac入门基础知识——蒙版(Mask)的详细使用方法介绍

    在上一篇文章,我们认识了Sketch Mac这款软件,在本文中,我们再来看看Sketch Mac入门基础知识--蒙版(Mask)的详细使用方法介绍,让您更多更好的了解Sketch Mac,为以后使用奠 ...

  2. 存储系统基础知识与RAID存储技术介绍【转载自微信公众号开源Linux】

    存储系统基础知识与RAID存储技术介绍 存储系统是整个IT系统的基石,是IT技术赖以存在和发挥效能的基础平台.早先的存储形式是存储设备(通常是磁盘)与应用服务器其他硬件直接安装于同一个机箱之内,并且该 ...

  3. 【MySQL基础教程】DML语句详细介绍

    前言 本文为 [MySQL基础教程]DML语句详细介绍 相关知识,DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增.删.改操作.下 ...

  4. Sketch基础教程之文字工具详细介绍

    Sketch 是最强大的移动应用矢量绘图设计工具,对于网页设计和移动设计者来说,比PhotoShop好用N倍!尤其是在移动应用设计方面,Sketch 的优点在于使用简单,学习曲线低,并且功能更加强大易 ...

  5. linux修复fat文件系统,如何修复损坏的FAT32文件系统

    问题描述 我正在为我的笔式驱动器使用FAT32文件系统.它经常有文件/数据损坏. 在Windows中,我使用扫描磁盘实用程序来修复FAT32 /NTFS文件系统.我如何在Ubuntu中做到这一点? 最 ...

  6. exfat文件系统_u盘文件系统exfat格式优缺点有哪些【详细介绍】

    exfat是u盘文件系统的一种类型格式, exfat 是对fat文件系统的一种延续,即扩展文件分配表,是一种更适合于闪存的文件系统,是为了解决fat16/32的局限性和缺点而推出的一种新的文件系统.它 ...

  7. 进程和线程基础知识(已经是最详细的啦)

    进程和线程基础知识 文章目录 进程和线程基础知识 一.前言 二.进程 1.引入 2.并发和并行有什么区别? 3.进程与程序的关系的类比 4.进程的状态 5.进程的控制结构 6.进程的控制 7.进程的上 ...

  8. Linux - 磁盘基础知识、磁盘管理(类型、引导、分区、挂载、raid、LVM、loop、overlayfs)

    相关链接: lvm ⭐️使用LVM方式安装Ubuntu 16.04 - https://www.cnblogs.com/xiaogan/p/6071892.html Ubuntu LVM 分区实战 h ...

  9. 分布式文件系统KFS基础知识介绍

    Kosmos distributed file system,简称KFS,是一个类GFS的分布式文件系统,被设计用于分布式的结构化存储.下面将对KFS的体系结构进行简单介绍,最后给出一个使用KFS C ...

  10. Linux基础篇——Linux磁盘操作(磁盘基础知识、分类、分区、挂载、卸载、扩容)详解

    目 录 1. 概 念 2. 为啥要分区 3. 磁盘的结构 4. 磁盘的分类 4.1 IDE硬盘 4.2 SCSI硬盘 4.3 SATA硬盘 4.4 固态硬盘 5. 磁盘分区命名规则 6. 磁盘分区类型 ...

最新文章

  1. 稠密仿射变换 cvWarpAffine
  2. 为什么PUE只说明了数据中心能效的一部分?
  3. bugku ——杂项
  4. C# 2.0中泛型编程初级入门教程
  5. 送ta一朵独一无二的玫瑰花
  6. 鼠标移动到版块图标产生的渐变效果
  7. 如何循环数据库中的所有表名?
  8. UITextView UITextField退出键盘的常用三种方式
  9. python网络编程百度云_python网络编程.mobi
  10. 合并账号_亚马逊账号最新死法:合并listing和折扣促销
  11. 高并发的常见策略--大型web项目
  12. VMware windows2003系统安装教程
  13. 苹果android怎么设置,天猫魔盒怎么投屏使用 苹果和安卓手机操作设置方法
  14. 人工智能发展将使人类沦落为“无用阶级”
  15. 32、出任爬虫公司CEO(爬取职友网招聘信息)
  16. Codeforces-1487 D. Pythagorean Triples(数学)
  17. 设置centos笔记本合盖不休眠
  18. 非常简单的中英互译在线翻译操作方法
  19. L1006 连续因子
  20. 7个地方可以帮助你快速寻找到你需要的代码

热门文章

  1. 饿了么神级UI组件库——Element-UI使用指南
  2. 前端UI框架网址大全----后续会有添加
  3. 高校学生社团管理系统
  4. android高德地图获取省市编码,android中高德地图地理编码
  5. 微信小程序生成海报图片导出相册
  6. Python利用Reportlab生成PDF文档
  7. react引入本地mp4视频
  8. MATLAB中pdetool工具求解泊松方程和Laplace方程
  9. keepalived mysql 主主_MySQL主主+Keepalived高可用(一):解决单点故障
  10. Algorithm:数学建模大赛(CUMCM/NPMCM)之全国大学生数模竞赛简介 相关书籍、文章推荐等详细攻略