UEFI原理与编程实践-protocol的创建与使用

搭建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文件添加相应的内容即可,怎么去传值啥的相信看完这些也能轻易理解

Supongo que te gusta

Origin blog.csdn.net/u011397314/article/details/121403297
Recomendado
Clasificación