EFI Protocol 的分析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章