Protocol顾名思义,协议,其实就是一些函数和数据的集合,这些函数集合在一起视乎就形成了协议。我们在使用protocal的时候需要先install这个protocal,install之前会先实现这些函数,和数据,把他们进行赋值。install一个protocal时相当于吧这些函数的指针传递给了一个handle,我们要使用这些实例,只需要local这个protocal找到这个handle就可以找到这些实例去使用了。
例如:
//
//定义protocal 结构体
//
typedef struct _EFI_CPU_ARCH_PROTOCOL {
EFI_CPU_FLUSH_DATA_CACHE FlushDataCache;
EFI_CPU_ENABLE_INTERRUPT EnableInterrupt;
EFI_CPU_DISABLE_INTERRUPT DisableInterrupt;
EFI_CPU_GET_INTERRUPT_STATE GetInterruptState;
EFI_CPU_INIT Init;
EFI_CPU_REGISTER_INTERRUPT_HANDLER RegisterInterruptHandler;
EFI_CPU_GET_TIMER_VALUE GetTimerValue;
EFI_CPU_SET_MEMORY_ATTRIBUTES SetMemoryAttributes;
UINT32 NumberOfTimers;
UINT32 DmaBufferAlignment;
} EFI_CPU_ARCH_PROTOCOL;
//
//给结构体成员赋值
//
EFI_CPU_ARCH_PROTOCOL mCpu = {
CpuFlushCpuDataCache,
CpuEnableInterrupt,
CpuDisableInterrupt,
CpuGetInterruptState,
CpuInit,
CpuRegisterInterruptHandler,
CpuGetTimerValue,
CpuSetMemoryAttributes,
1, // NumberOfTimers
4, // DmaBufferAlignment
};
//
//把protocal安装到NewHandle上,且用gEfiCpuArchProtocolGuid来标注这个protocal
//
Status = gBS->InstallProtocolInterface (
&NewHandle,
&gEfiCpuArchProtocolGuid,
EFI_NATIVE_INTERFACE,
&gCpu
);
//
//使用要使用这个protocal,需要通过LocateProtocol 来找到这个protocal,把地址付给CpuArch
//
Status = gBS->LocateProtocol (
&gEfiCpuArchProtocolGuid,
NULL,
&CpuArch
);
CpuArch->GetInterruptState (
CpuArch,
&InterruptState
);
而这些InstallProtocolInterface 和locateprotocol 函数是如何如何是如何实现的,就是通过链表进行添加查找的。