硬盘是一种块设备,所以每个硬盘设备控制器都安装有一个BlockIo实例、一个BlockIo2实例,然后还安装了一个DiskIo实例、一个DiskIo2实例,这两者的区别就是BlockIo只能按块读写设备,而DiskIo可以从任意便宜出读写磁盘,并且可以读取任意字节数,BlockIo是EFI_BLOCK_IO_PROTOCOL的缩写,DiskIo是EFI_DISK_IO_PROTOCOL的缩写。

虽然BlockIo和DiskIo极大的方便了我们操作磁盘,但是其功能十分有限,通过BlockIo和DiskIo,我们只能对硬盘设备进行读、写、flush操作,如果相对硬盘进行更多的操作,则需要通过PassThrough向硬盘发送命令。

以获取NVME硬盘信息为例:

# define TEMP_POOL_SIZE   300 VOID
UpdateNvmePortInfo ()
{EFI_STATUS                            Status;UINTN                                 HandleCount;EFI_HANDLE                            *HandleBuffer;EFI_DISK_INFO_PROTOCOL                *DiskInfo;UINTN                                 Index;CHAR16                                *UnicodeStr;EFI_IDENTIFY_DATA                     *IdentifyDriveInfo;NVME_ADMIN_CONTROLLER_DATA             NvmeIdentifyControllerData;
//找出所有支持BlockIo的设备
Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &HandleBuffer);
//遍历所有支持BlockIo设备,获取他们全部的信息for (Index = 0; Index < HandleCount; Index++) {Status = gBS->HandleProtocol (HandleBuffer [Index], &gEfiDiskInfoProtocolGuid, (VOID **)&DiskInfo);if (!EFI_ERROR (Status)) { // if Nvme HDD devicesUnicodeStr = (CHAR16*)AllocateZeroPool (TEMP_POOL_SIZE);IdentifyDriveInfo = (EFI_IDENTIFY_DATA*)AllocatePool (sizeof (EFI_IDENTIFY_DATA));
//通过compareGuid,定位NVME硬盘设备if (CompareGuid (&DiskInfo->Interface, &gEfiDiskInfoNvmeInterfaceGuid)) {//获取NVME硬盘设备全部信息Status = NvmeIdentifyController (HandleBuffer[Index], &NvmeIdentifyControllerData);if (EFI_ERROR (Status)) {continue;}//从信息中筛选出设备ModelName,显示在setup界面NvmeIdentifyControllerData.Mn[40] = 0;UnicodeSPrintAsciiFormat (UnicodeStr, TEMP_POOL_SIZE, "%a",(CHAR8 *)&NvmeIdentifyControllerData.Mn);HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN(STR_NVME_DISK_INFO), UnicodeStr, NULL) ;}}
}
}

待写。。。。

UEFI原理与编程实践--硬盘相关的Protocol:BlockIo/DiskIo/DiskInfo/PassThrough相关推荐

  1. UEFI原理与编程实践--EFI System Table中的输入输出

    这一节UEFI原理与编程的书籍里面貌似没有提到,不过在我上次使用飞腾源代码增加功能的过程中发现logo界面的左上角有个光标,后来发现源代码也有,这就让有强迫症的人非常不爽啦,这个光标怎么来的呢,我找了 ...

  2. UEFI原理与编程实践--UEFI系统的启动过程

    看图粗略说一下: SEC: 安全验证阶段,这个阶段,需要用Assembly做一些 C 无法处理的工作,C语言无法处理CPU的特殊寄存器.让CPU进入Protected Mode(Flat Mode)的 ...

  3. UEFI原理与编程实践--Device Path

    系统中的每个设备都有一个唯一的路径.例如,每次进入shell时,都会打印出系统中的硬盘设备以及设备路径.针对硬盘和文件系统,将在BIOS学习实战中通过获取U盘路径,读取BIOS文件,然后进行更新的具体 ...

  4. UEFI原理与编程实践--UEFI驱动模型之显卡(UEFI方向)驱动分析

    拆开一台国产电脑,会发现,很多重要芯片,其实已经国产化了,CPU.GPU.电源管理芯片等等,刚做了一下GOP的笔记,回头想想,之前包入厂商的显卡驱动一直没怎么关注他们的运行逻辑是什么,那么,这篇文章就 ...

  5. UEFI原理与编程实践--UEFI工程模块文件

    标准应用程序工程模块 该模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块,标准应用程序工程模块,UefiMain就是这个模块的入口函数 EFI_STATUS EFIAPI U ...

  6. UEFI原理与编程实践--PCD的使用

    PCD说白了就是个全局变量,就看你怎么去调用了,先看一下它的定义用法: 然后再看一下通过编译后有AutoGen生成的一个定义: PCD的类型有很多种,但是经常使用的也就是静态PCD与动态PCD 静态P ...

  7. UEFI原理与编程实践--Variable的使用

    基础知识 在书中本章主要说明了系统表,启动服务,运行时服务. 挑简单明了的:系统表(gST)的使用方法: SystemTable->BootServes指向系统的启动服务表,ConIn/ConO ...

  8. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...

    7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...

  9. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...

    4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...

最新文章

  1. mysql大规模读写性能_十招搞定 MySQL 大规模数据库的性能和伸缩性优化
  2. ibatis mybatis传入List参数
  3. php查询字段的总和,ThinkPHP 多表查询-如其字段A相同,则把字段B相加
  4. 长路漫漫,唯剑作伴--Automatic Reference Counting
  5. UFLDL教程:Exercise:Softmax Regression
  6. VC程序员常用工具篇
  7. Java 按行读写文件(解决中文乱码)
  8. centos-安装pycharm
  9. 未注册小程序名称-小程序名称大全-周期更新未注册的好名字
  10. windows局域网传文件5种常用方法
  11. HDU 5857 Median(找中位数)
  12. Theano官方文档的测试和总结(1):安装、基础语法、逻辑斯蒂回归
  13. 【工具介绍】fastcopy的下载与使用方法,可用于硬盘对拷
  14. java异常说法正确的是什么意思_以下关于Java异常说法不正确的是( )。
  15. iOS - CodeReview 代码评审
  16. VS粘贴word时中文乱码修复工具v1
  17. stm32f030c8之基础定时器TIM6
  18. 用python打开浏览器的四种方法
  19. 张朝阳:做秀并快乐着,我要活到150岁
  20. Uber将颠覆B.A.T?

热门文章

  1. MySql如何将远程数据库复制到本地
  2. 智慧物流大势所趋,机器人、无人机、5G价值凸显
  3. 音乐满屋 sonos无线家庭音乐系统试用
  4. CPS渠道统计难?你可能没用过这个统计工具
  5. 智能外呼机器人为你带来快速高效邀约
  6. 面试必问之redis
  7. Sublime Text 3运行PyQt5代码不能显示窗口
  8. 美和易思再次获得十二项国家版权证书!
  9. 赚钱 36 计 - 第三十计:频次计
  10. 如何在CAD编辑工具中将CAD图纸导出为dxf格式