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