搭建EDK编译环境由于家里头的电脑罢工,只能贴代码,实践的话可自行实践

什么是protocol

不想说的那么复杂,什么是protocol,它就是个结构体,只是这个结构体中的成员有的比较复杂而已,看一个:

瞅一下,EFI_BLOCK_IO_PROTOCOL就是个结构体,看一下这一句:

看我函数指针的笔记就能清楚理解,EFI_BLOCK_IO_PROTOCOL结构体中什么EFI_BLOCK_RESET/READ这些就是函数指针,它的函数第一参数必须是指向Protocol的指针,用来模拟this指针,好,看一下:

typedef EFI_STATUS(EFIAPI *EFI_BLOCK_READ)(arg...);这不就是函数指针?看下它的第一个参数,是不是上面说的呢?

所以什么是protocol,中文叫协议,实际就是一个结构体,这个结构体里面有很多工具或者重要的数据,有需要就拿来用就行,protocol在哪呢

EFI_HANDLE

理解这一段话,对设备驱动的加载有一个认识基础 ,然后再重点理解这一段:

在本节中,咱们需要创建我们自己的protocol,并且使用它,在实践中进行理解

创建protocol

一般做项目每家公司都会有自己的一个PKG,那么这个自己创建的protocol就可以放在这个PKG里面,在这个PKG里面找到dec文件,看到[Protocols]这一列表没,咱们新建一个:

gCsdnGoodProtocolGuid   = {0xf8dec080, 0x22a3, 0x4d51, {0x90, 0x1a, 0x81, 0x2a, 0xae, 0x79, 0x59, 0xf8}}

创建好GUID后,找到include/protocol(放其他地方也行,但是为了规范),咱们再新建一个CsdnGood.h文件,内容如下:

#ifndef _CSDN_GOOD_
#define  _CSDN_GOOD_
#include <Uefi.h>typedef struct _CSDN_GOOD_PROTOCOL  CSDN_GOOD_PROTOCOL;extern EFI_GUID                   gCsdnGoodProtocolGuid;struct _CSDN_GOOD_PROTOCOL {UINT8             version;UINT8             number;
};#endif

到时候你要调用,直接#include <protocol/CsdnGood.h>,这个protocol包含了两个成员,一个version,一个是number,创建好了之后咱们就可以进行安装

安装Protocol

怎么安装,第8章的开头写的很明白,在模块入口函数进行安装,啥是模块化入口函数?

上面的就是,函数名字可以不一样,但是这个参数是一样滴,具体看你的ENTRY_POINT怎么写的了

直接上需要的代码:

#include <protocol/CsdnGood.h>EFI_STATUS
EFIAPI
UefiMain (IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable)
{  CSDN_GOOD_PROTOCOL  mCsdnGoodProtocol;mCsdnGoodProtocol.version = 0;mCsdnGoodProtocol.number =1;Status = gBS->InstallProtocolInterface(&ImageHandle,&gCsdnGoodProtocolGuid,EFI_NATIVE_INTERFACE,&mCsdnGoodProtocol);ASSERT_EFI_ERROR (Status);}

代码中咱们初始化了成员的值,后面的你可以自己修改,当然放哪个入口函数自己看放哪合适就行。

安装完了,咱们就可以使用了,怎么使用呢

使用protocol

使用需要明白一点,肯定是在你安装之后,别安装的代码都还没跑,你就用上了,这种能不能编译通过还是个问号

第三步可用可不用

反正一通看完发现使用LocateProtocol最简单方便,那就经常使用它打开protocol了

#include <protocol/CsdnGood.h>CSDN_GOOD_PROTOCOL *gCsdnGoodProtocol;Status = gBS->LocateProtocol (&gCsdnGoodProtocolGuid, NULL, (VOID **) &gCsdnGoodProtocol);if (!EFI_ERROR (Status)){if(gCsdnGoodProtocol != NULL){gCsdnGoodProtocol->version = 1;}}

ok,Protocol的创建和使用就说到这里,使用protocol记得inf文件添加相应的内容即可,怎么去传值啥的相信看完这些也能轻易理解

UEFI原理与编程实践-PROTOCOL相关推荐

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

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

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

    硬盘是一种块设备,所以每个硬盘设备控制器都安装有一个BlockIo实例.一个BlockIo2实例,然后还安装了一个DiskIo实例.一个DiskIo2实例,这两者的区别就是BlockIo只能按块读写设 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. UEFI原理与编程(一)

    第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口) 常见缩写及描述: 缩略词 全名 描述 UEFI Unified Extensi ...

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

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

最新文章

  1. 在析构函数中delete this指针问题
  2. FPGA之道(13)FPGA芯片的应用模式
  3. PVUVIP之间的区别和联系
  4. 1、创建数据表(CREATE TABLE语句)
  5. php 毛玻璃,CSS3实现毛玻璃(图片模糊)效果
  6. html用bmob做留言,bmob js-sdk 在vue中的使用教程
  7. SAP Fiori应用发生超时错误的一个可能原因
  8. 4键电子手表说明书_数字S1系统7寸门口主机操作说明书
  9. C++ 操作符new和delete
  10. JMETER HTTP 请求
  11. spring中的context:include-filter和context:exclude-filter的区别
  12. win7优化设置_Win10系统优化软件,这是我用的最舒服的一款软件了!
  13. php上js实现ajax请求,原生JS实现ajax与ajax的跨域请求实例
  14. uni-app 更改默认组件样式
  15. 【MATLAB】求定积分
  16. win10修改命令行默认字体
  17. 骑士cms(74cms)个人版 整合UC
  18. 【制作脑图】万彩脑图大师教程 | 关于设置
  19. python递归输出斐波那契数列_艾艾精工涨停
  20. 酷比魔方iplay20_酷比魔方iPlay20Pro配置怎么样?iPlay20Pro处理器性能全面评测

热门文章

  1. manage run-time environment
  2. 多智能体系统的分布式协同控制——采样控制、脉冲控制、弹性控制
  3. 论文复现——CE-FPN: Enhancing Channel Information for Object Detection
  4. 高等数学:第六章 定积分的应用(4)平面曲线的弧长
  5. 高等数学——曲线积分的计算(弧长)
  6. 算法、数据结构经典资料简介(TAOCP、Robert Sedgewick、算法导论、编程珠玑)
  7. 基于Python的A-Priori算法发现购物篮关联规则
  8. 网络创业成功的7堂课(读书笔记)
  9. 四月一个晴朗的早晨,遇见一个百分之百的女孩
  10. MyBatis在字段返回为null不返回字段