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 函數是如何如何是如何實現的,就是通過鏈表進行添加查找的。