存储器相关的Protocol有BlockIo,BlockIo2,DiskIo,DiskIo2。DiskIo/DiskIo2的实现分别依赖与BlockIo/BlockIo2,其中BlockIo,DiskIo提供了访问设备的阻塞函数,BlockIo2,DiskIo2提供异步函数。。它们的区别是BlockIo只能按照扇区为单位访问存储器,而DiskIo可以按照字节为单位访问。UEFI也会为每个分区生成对应的控制器,并且根据分区属性安装对应的BlockIo/BlockIo2/DiskIo/DiskIo2实例。

除了上面的Protocol之外,UEFI还提供了文件系统的支持,通常UEFI需要提供一个ESP(EFI System Partition)分区,在这个分区上提供启动文件。这就要求UEFI具有提取文件的功能,要达到此目的,UEFI必须要支持文件系统。ESP主要用来存放启动相关的文件,对文件系统的要求比较简单,所以FAT32即可满足要求,UEFI提供了对此文件系统的支持。

本文只以DiskIo作介绍说明,其他几种Protocol的操作方法类似。

DiskIo

操作DiskIo,需要首先需要查找对应的控制器Handler,然后OpenProtocol打开对应的服务,接下来才可以使用DiskIo的操作函数来操作存储器。
对应的Protocol提供的操作有:

typedef struct _EFI_DISK_IO_PROTOCOL EFI_DISK_IO_PROTOCOL;
///
/// This protocol is used to abstract Block I/O interfaces.
///
struct _EFI_DISK_IO_PROTOCOL {////// The revision to which the disk I/O interface adheres. All future/// revisions must be backwards compatible. If a future version is not/// backwards compatible, it is not the same GUID.///UINT64          Revision;EFI_DISK_READ   ReadDisk;EFI_DISK_WRITE  WriteDisk;
};

使用实例:

  Status = gBS->OpenProtocol(HandleInfoList[0].Handle,&gEfiDiskIoProtocolGuid,(VOID **)&pDiskIo,gImageHandle,NULL,EFI_OPEN_PROTOCOL_GET_PROTOCOL);if (Status != EFI_SUCCESS) {DEBUG((EFI_D_ERROR, "%a(): Failed to get open protocol from partition. Reason: %r\n", __func__, Status));return Status;}Status = pDiskIo->ReadDisk(pDiskIo,MediaId,Offset,DataSize,(VOID *)Buffer);

FAT32文件系统

UEFI实现了一个EFI_SIMPLE_FILE_SYSTEM_PROTOCOL用来支持FAT32文件系统。它的定义如下:

typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL;typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME)(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,OUT EFI_FILE_PROTOCOL                 **Root    //返回Root句柄);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;
};

此Protocol中只有一个关键函数OpenVolume,主要功能是用来获取对应分区Root句柄,而Root句柄实际上也是一个Protocol,其中真正包含了文件操作,如下所示:

typedef struct _EFI_FILE_PROTOCOL         EFI_FILE_PROTOCOL;
typedef struct _EFI_FILE_PROTOCOL         *EFI_FILE_HANDLE;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;};

实例:

EFI_STATUS TestOpen()
{EFI_STATUS  Status = 0;EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;EFI_FILE_PROTOCOL *Root = 0;EFI_FILE_PROTOCOL *EfiDirectory = 0;Status = gBS->LocateProtocol(&gEfiSimpleFileSystemProtocolGuid,NULL,(VOID**)&SimpleFileSystem);if (EFI_ERROR(Status)) {//未找到EFI_SIMPLE_FILE_SYSTEM_PROTOCOLreturn Status;}Status = SimpleFileSystem->OpenVolume(SimpleFileSystem, &Root);// 在根目录下生成efi目录Status = Root->Open(Root, &EfiDirectory,(CHAR16*)L"efi",EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, //打开模式EFI_FILE_DIRECTORY);//在efi目录下生成readme.txt文件{EFI_FILE_PROTOCOL *ReadMe = 0;Status = EfiDirectory ->Open(EfiDirectory,    //This 指向目录\efi\ &ReadMe,          //新文件的句柄   (CHAR16*)L"readme.txt",  //文件全路径为\efi\readme.txtEFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,//创建并打开0  //生成普通文件,使用默认属性);Status = ReadMe -> Close(ReadMe);}Status = EfiDirectory->Close(EfiDirectory);return Status;
}

参考:《UEFI 原理与编程》–戴正华

UEFI开发与调试---文件操作相关推荐

  1. iOS开发学无止境 - NSFileManager文件操作的十个小功能

    (配图的小故事还记得嘛) NSFileManager是一个单列类,也是一个文件管理器.可以通过NSFileManager创建文件夹.创建文件.写文件.读文件内容等等基本功能. 下面将介绍NSFileM ...

  2. Python 开发-2 (文件操作,正则表达式,类,JSON,装饰器,异常处理,Socket)

    文章目录 文件操作 递归创建目录 删除文件或目录 拷贝文件 修改文件名或目录名 文件路径名操作 判断文件,目录是否存在 文件大小与修改时间 当前目录与目录切换 遍历目录文件 遍历目录下指定后缀 目录文 ...

  3. UEFI开发与调试---edk2中的应用模块/库模块/驱动模块

    应用模块 应用模块包含标准应用程序模块,shell应用程序模块,以及main应用程序模块 标准应用程序模块 它是所有其他应用程序模块的基础,作为一个模块来说,同样由源文件和工程文件(.inf)组成. ...

  4. UEFI开发与调试---edk2中的Package

    在开始编写UEFI APP之前,我们需要先对UEFI包和模块的概念有个了解. 在edk2的根目录下,我们可以发现有很多*Pkg命令的目录,这些实际上都是各个不同的包,每个包中都是一组模块的集合,每个包 ...

  5. UEFI开发与调试---QEMU虚拟盘的创建与修改

    支持的文件格式 qemu支持多种类型的文件系统,而最原生的以及最灵活的是qcow2类型了,这种文件系统支持写时复制,加密,压缩以及VM快照. 除了这种文件系统之外,如下类型也是被支持的:raw ,cl ...

  6. 【Python开发】8. 文件操作

    本文专栏:Python开发笔记 点击查看系列文章 本文主要内容: 1. 读取文件 1.1 文件路径 1.2 读取整个文件 1.3 逐行读取 2. 写入文件 2.1 写入空文件 2.2 写入多行 2.3 ...

  7. UEFI开发与调试--edk2中的基础组件

    还记得前面介绍的MdePkg和MdeModulePkg吗?这两个包中会实现UEFI内核中的基础组件,其中就包括了系统表,启动服务表,运行时服务表. 系统表(System Table) 系统表是edk2 ...

  8. UEFI开发与调试---edk2中的Module

    Edk2在设计是按照模块来进行的,其中模块包含有很多种类型,比如最常见的三种:应用程序模块,驱动模块,库模块.每个模块都包含了一个工程元数据文件(.inf)和源文件..inf文件是用来辅助编译的,功能 ...

  9. 飞腾FT2000/4 u-boot/UEFI开发环境搭建

    参考 UEFI开发与调试-edk2中子目录介绍 ACP基础--Resource Descriptors for ACPI ubuntu16.04操作系统下的edk2安装 [UEFI实战]如何在OS下获 ...

  10. UEFI开发探索100 – 《UEFI编程实践》发布啦

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) <UEFI编程实践>发布 1 内容简介 第一部分 UEFI环境搭建及UEFI应用构建 ...

最新文章

  1. HTML iframe 和 frameset 的区别
  2. 听说你想去大厂看学妹,带你看看作业帮产品经理岗面经
  3. 微信小程序家庭记账本开发进度二
  4. 熟悉java环境实验报告_2018-2019-2 20175324实验二面向对象程序设计《Java开发环境的熟悉》实验报告...
  5. 基于CarbonData的电信时空大数据探索
  6. 台达b2伺服modbus通讯_台达C2000促进油毛毡切割包装机的发展
  7. OBS Windows10 1909版本黑屏问题解决方案
  8. install 命令用法详解
  9. docker镜像打包
  10. select count(*) ,count() , select *
  11. Linux时间戳与日期相互转换
  12. 目标检测中的常见指标
  13. 稀疏编码中的正交匹配追踪(OMP)与代码
  14. 双稳态电路的两个稳定状态是什么_数字电路学习笔记(九):初识锁存器
  15. react学习笔记(二)
  16. 密码学-常见加密算法逆向学习
  17. flask (python web app framework)
  18. 网站安全之XSS攻击
  19. SSL P1194 最优乘车 题目
  20. 【小毛驴的絮叨】2020年半年总结

热门文章

  1. 学校教材管理系统html,学校教材管理系统
  2. An'droid TextView
  3. c语言 大写字母转换为小写字母后的第五个,将大写字母转换为对应小写字母之后的第5字母;若小写字母为v~z,使小写字母的值减21。...
  4. python 规则引擎 drools_Drools规则引擎入门指南(一)
  5. IE离线脱机安装,解决IE11安装时需要“获取更新”
  6. 复制EXCEL单元格的值到SpreadJs单元格中,会多加一个可见的空格和一个不可见的0宽度空格的解决方法(ie11)
  7. yml转换html,properties转换yml格式
  8. 产生式系统的基本概念
  9. 排版怎么排?八大技巧提升版面设计感
  10. MCMC 改进粒子滤波算法及其在目标跟踪中的应用