EFI Protocol 的分析

来源:互联网 发布:中国移动 大数据 优势 编辑:程序博客网 时间:2024/05/17 00:06

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 函数是如何如何是如何实现的,就是通过链表进行添加查找的。

原创粉丝点击