硬盘与文件系统

  • 硬盘物理结构
    • MBR分区
    • GPU分区
  • FAT
  • ROM Layout

硬盘物理结构


以一个机械硬盘为例,内部包括磁片、主轴、速写磁头、传动手臂、传动轴、反力矩弹簧装置,SSD没有这样的结构,但都有一个相同的存储介质(主轴外一圈的部分)右边为存储介质的内部情况。

MBR分区

主引导记录MBR(Master Boot Record) Leagcy 启动最后就是通过读MBR做校验检测硬盘是否存在系统等

扇区0 扇区1 扇区2 扇区3 扇区N-2 扇区N-1 扇区N
MBR

通常磁盘512 Byte分为一个扇区(Logical Block Address 0)LBA0, MBR存放在磁盘的第一个扇区, 用4个字节(StartingLBA)表示该分区的起始扇区号,4个字节(SizelnLBA)表示该分区拥有的总扇区数,最大只能支持4个分区(每个分区最大是2T 4G扇区数x512B每扇区 =2TB)下图为MBR的组成:0X55 0xAA相当于标志符

MBR最多有四个分区,下表为分区信息结构:

存储字节位 内容及含义
第1字节 引导标志,若值为80H表示活动分区,若值为00H表示非活动分区
第2、3、4字节 本分区的起始磁头号、扇区号、柱面号。其中:磁头号——第2字节、扇区号——第3字节的低6位、柱面号——第3字节高2位+第4字节8位
第5字节 分区类型符 00H——表示该分区未用(即没有指定)、06H——FAT16基本分区、0BH——FAT32基本分区、05H——扩展分区、07H——NTFS分区、0FH——(LBA模式)扩展分区(83H为Linux分区等)
第6、7、8字节 磁头号——第6字节、扇区号——第7字节的低6位、柱面号——第3字节高2位+第8字节
第9、10、11、12字节 本分区之前已用的扇区数
第13、14、15、16字节 本分区的总扇区数

GPU分区

GPT(GUID Partition table), 为了弥补MBR的不足, Intel设计了GPT分区。GPT分区支持更大容量, 更多分区(Windows最大支持128个), 更加安全(首尾部分分别保存了一份相同的分区表), 兼容MBR。
0号扇区称为保护性MBR,同MBR硬盘的0号扇区格式相同。其主要作用是兼容 MBR硬盘时代的工具,防止这些工具因不识别GPT格式而破坏硬盘。

扇区0 扇区1 扇区2 扇区3 扇区4 扇区N-2 扇区N-1 扇区N
MBR GPT头 分区表项1、2、3、4 分区表项5 分区表项6 备份GPT头


硬盘的1号扇区称为G P T头,存储了硬盘的结构信息,主要包括:G P T头标志 “EFIPART”、表头字节数、表头CRC32校验码、GPT头和备份表头地址、可用于分区的扇区范围

// GPT分区表项结构体
typedef struct {EFI_GUID PartitionTypeGUID;  //分区类型GUID, 0表示此项为空
EFI_GUID UniquePartitionGUID;//分区标志GUID
EFI_LBA StartingLBA;         //分区的首扇区
EFI_LBA EndingLBA;           //分区的尾扇区
UINT64 Attributes;           //分区属性
CHARI6 PartitionName[36];    //分区名字符串,必须以0x0000结尾
} EFI_PARTITION_ENTRY;

FAT

每个UEFI系统至少有一个ESP(EFI System Partition)分区, 在这个分区上存放启动文件. EFI也要有读取文件的功能. UEFI内置的文件系统基于FAT开发.

文件配置表 (英文: File Allocation Table, 首字母缩略字: FAT)是一种由微软发明的并带有部分专利的文件系统, 供MS-DOS使用, 也是非NT内核的微软窗口使用的文件系统. FAT文件系统考虑当时计算机效能有限, 所以未被复杂化, 因而被几乎所有个人计算机的操作系统支持. 这特性使它成为理想的软盘和记忆卡文件系统, 也适合用作不同操作系统中的数据交流.

DrivIver Binding流程:

UEFI设计了一种简单的文件系统协议UEFI File System.

gEfiSimpleFileSystemProtocolGuid <MdePkg/include/Protocol/SimpleFileSystem.h>

struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL {////// The version of the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. The version/// specified by this specification is 0x00010000. All future revisions/// must be backwards compatible.///UINT64                                      Revision;EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume;
};

OpenVolume 打开的protocol结构:

// EFI_FILE_PROTOCOL为支持的文件系统提供文件IO访问。
// EFI_FILE_PROTOCOL提供对文件或目录内容的访问,也是对文件所在文件系统目录树中位置的引用。
// 对于任何给定的文件句柄,可以相对于该文件的位置打开其他文件,从而产生新的文件句柄。
struct _EFI_FILE_PROTOCOL {////// The version of the EFI_FILE_PROTOCOL interface. The version specified/// by this specification is EFI_FILE_PROTOCOL_LATEST_REVISION./// Future versions are required to be backward compatible to version 1.0.///UINT64                Revision;EFI_FILE_OPEN         Open;EFI_FILE_CLOSE        Close;EFI_FILE_DELETE       Delete;EFI_FILE_READ         Read;EFI_FILE_WRITE        Write;EFI_FILE_GET_POSITION GetPosition;EFI_FILE_SET_POSITION SetPosition;EFI_FILE_GET_INFO     GetInfo;EFI_FILE_SET_INFO     SetInfo;EFI_FILE_FLUSH        Flush;EFI_FILE_OPEN_EX      OpenEx;EFI_FILE_READ_EX      ReadEx;EFI_FILE_WRITE_EX     WriteEx;EFI_FILE_FLUSH_EX     FlushEx;
};

FAT驱动的核心函数 OpenVolume实体:

EFI_STATUS
EFIAPI
FatOpenVolume (IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *This,OUT EFI_FILE_PROTOCOL                **File)
{EFI_STATUS  Status;FAT_VOLUME  *Volume;FAT_IFILE   *IFile;Volume = VOLUME_FROM_VOL_INTERFACE (This);FatAcquireLock ();//// Open Root file打开根目录//Status = FatOpenDirEnt (NULL, &Volume->RootDirEnt);if (EFI_ERROR (Status)) {goto Done;}//// Open a new instance to the root//Status = FatAllocateIFile (Volume->Root, &IFile);if (!EFI_ERROR (Status)) {*File = &IFile->Handle;}Done:Status = FatCleanupVolume (Volume, Volume->Root, Status, NULL);FatReleaseLock ();return Status;
}

OpenVolume ——>Open ——>Read/Write ——>Close

EFI_STATUS
EFIAPI
FatOpen (IN  EFI_FILE_PROTOCOL   *FHand,OUT EFI_FILE_PROTOCOL   **NewHandle,IN  CHAR16              *FileName,IN  UINT64              OpenMode,IN  UINT64              Attributes)
{return FatOpenEx (FHand, NewHandle, FileName, OpenMode, Attributes, NULL);
}
;
EFI_STATUS
EFIAPI
FatRead (IN     EFI_FILE_PROTOCOL  *FHand,IN OUT UINTN              *BufferSize,OUT VOID               *Buffer)
{return FatIFileAccess (FHand, ReadData, BufferSize, Buffer, NULL);
}
;
EFI_STATUS
EFIAPI
FatWrite (IN     EFI_FILE_PROTOCOL  *FHand,IN OUT UINTN              *BufferSize,IN     VOID               *Buffer)
{return FatIFileAccess (FHand, WriteData, BufferSize, Buffer, NULL);
}

ROM Layout

BIOS ROM 文件主要由 FV(Firmware Volume)类型, Data类型和FILE类型构成每一种类型都要定义好Offset和Length, 以防冲突

BIOS知识枝桠——文件系统相关推荐

  1. BIOS知识枝桠——FV

    FV 基本概念 架构组成 File Type&Section Type FV的访问 FV拓展 EFI IMAGE (PE/COFF) FV拓展 EFI OPTIONROM 基本概念 FD:固件 ...

  2. BIOS知识枝桠——Event

    Event 传统的中断模式 硬件中断 软件中断 Event Overview Event Function Event Use TPL Timer UEFI不再为开发者提供中断支持,但在UEFI内部还 ...

  3. BIOS知识枝桠——Device Path

    EFI Device Path 定义&原型 文本表示形式 EFI Device Path种类 Hardware Device Path ACPI Device Path Messaging D ...

  4. BIOS知识枝桠——GPU

    GPU理论阐述 概念 功能 供应商 NVIDIA GPU 名称解读 显存 GPU/显卡信息查看.鉴别工具 显示接口 GPU通用计算编程 科普类文章,无实际技术相关,内容来源网络 概念 图形处理器(英语 ...

  5. BIOS知识枝桠 -- PCIE

    博客内容来源为网络下载ppt,侵删 PCI的发展 PCI Local Bus 示意图 NoteBook上常见的PCIE Device:SSD DGPU WLAN LAN CardReader. 通过总 ...

  6. BIOS知识枝桠——SCI SMI IRQ

    SCI SMI 中断 中断分析 SCI SMI SMM SCI和SMI的异同 特殊的GPE: Q event SMI的几种常见的注册 SWSMI的触发 常见SMI的应用 中断 中断: 指当出现需要时, ...

  7. BIOS知识枝桠——ACPI

    ACPI在BIOS中的应用 ACPI Overview Power State ACPI Table XSDT FADT ASL Code 变量和运算 函数 ACPI Overview 完全解读:Ad ...

  8. BIOS知识枝桠—— Library

    Library overview Lib Overview Lib的文件结构 库的实体: 库的头文件: 库的Dec文件: 库函数的调用: MdePkg 常用Lib PUBLIC DEFINITIONS ...

  9. BIOS知识枝桠——HII

    HII Database HII OverView HII Protocol HII OverView HII(Human Interface Infrastructure), 定义了一套管理用户输入 ...

最新文章

  1. 教你怎么样在 Java8 中优雅的避开空指针异常
  2. cjson调用的实例 c++
  3. Android 设计模式一:EIT造型
  4. java spring mvc json ajax 优势_SpringMVC后台json数据前台ajax获取不到!!!急求解答!!!...
  5. CLR的程序集定位算法(转)
  6. JavaScript:JavaScript语法的详细介绍
  7. mysql5.6 慢查询_MySQL5.6 如何优化慢查询的SQL语句
  8. 都说「跳一跳」是微信抄袭了育碧,万万没想到,他们在一起了!
  9. 杂志订阅管理系统c语言实训报告,C语言程序设计报告—杂志订阅管理软件、、.doc...
  10. 【java集合框架源码剖析系列】java源码剖析之ArrayList
  11. 用python将word文档导入数据库_python读取word文档,插入mysql数据库实例
  12. 智慧交通:数字孪生三维可视化大屏管控运维平台
  13. JavaScript设计模式之策略模式-优化if条件过多
  14. SDelete v2.04安全地擦除磁盘未分配部分中存在的任何文件数据(包括已经删除或加密的文件)
  15. 感悟较多影响较多的心理效应
  16. windows7系统的“ .exe”图标显示不正常解决办法
  17. 转贴:ubuntu Rhythmbox歌曲名乱码问题
  18. tomcat+前端的简单配置
  19. mac一直ReportCrash
  20. 【Rust日报】 2019-04-05

热门文章

  1. 2022年唯品会年货节活动力度咋样?
  2. 基于计算机视觉的食物新鲜度分级检测
  3. 火山引擎联合中国信通院发布《边缘云总体技术与测试要求》
  4. 计算机科学家格言,未来科技有关名言
  5. 如何搭建一个拥有个人域名又带点Geek味的独立博客
  6. 戴森空气净化器php00使用,戴森空气净化器使用—戴森空气净化器使用方法
  7. 计算机虚拟空间怎么设置,虚拟内存怎么设置最好,教您电脑虚拟内存怎么设置最好...
  8. 2012年4月10日 周二
  9. 【目标检测】轻量级网络SqueezeNet
  10. WAPI 产 业 联 盟成 员