UEFI开发与调试--edk2中的基础组件

还记得前面介绍的MdePkg和MdeModulePkg吗?这两个包中会实现UEFI内核中的基础组件,其中就包括了系统表,启动服务表,运行时服务表。

系统表(System Table)

系统表是edk2提供的一个最重要也是最基础的数据结构之一,它是沟通内核和应用/驱动的桥梁。通过系统表,应用程序和驱动才能够访问到内核和硬件资源。系统表包含了如下信息:

  • 表头
  • 固件信息
  • 标准输入设备,标准输出设备,标准错误输出设备
  • 启动服务表
  • 运行时服务表
  • 系统配置表

它的结构体定义在MdePkg/Include/Uefi/UefiSpec.h:

 ///
 /// EFI System Table
 ///

 typedef struct {
   ///
   /// The table header for the EFI System Table.
   ///
   EFI_TABLE_HEADER                  Hdr;

   ///
   /// A pointer to a null terminated string that identifies the vendor
   /// that produces the system firmware for the platform.
   ///
   CHAR16                            *FirmwareVendor;

   ///
   /// A firmware vendor specific value that identifies the revision
   /// of the system firmware for the platform.
   ///
   UINT32                            FirmwareRevision;

   ///
   /// The handle for the active console input device. This handle must support
   /// EFI_SIMPLE_TEXT_INPUT_PROTOCOL and EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.
   ///
   EFI_HANDLE                        ConsoleInHandle;

   ///
   /// A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface that is
   /// associated with ConsoleInHandle.
   ///
   EFI_SIMPLE_TEXT_INPUT_PROTOCOL    *ConIn;

   ///
   /// The handle for the active console output device.
   ///
   EFI_HANDLE                        ConsoleOutHandle;

   ///
   /// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
   /// that is associated with ConsoleOutHandle.
   ///
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL   *ConOut;

   ///
   /// The handle for the active standard error console device.
   /// This handle must support the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.
   ///
   EFI_HANDLE                        StandardErrorHandle;

   ///
   /// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
   /// that is associated with StandardErrorHandle.
   ///
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL   *StdErr;

   ///
   /// A pointer to the EFI Runtime Services Table.
   ///
   EFI_RUNTIME_SERVICES              *RuntimeServices;

   ///
   /// A pointer to the EFI Boot Services Table.
   ///
   EFI_BOOT_SERVICES                 *BootServices;

   ///
   /// The number of system configuration tables in the buffer ConfigurationTable.
   ///
   UINTN                             NumberOfTableEntries;

   ///
   /// A pointer to the system configuration tables.
   /// The number of entries in the table is NumberOfTableEntries.
   ///
   EFI_CONFIGURATION_TABLE           *ConfigurationTable;


} EFI_SYSTEM_TABLE;

在UEFI中会定义一个初始化的System Table,在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c:

 EFI_SYSTEM_TABLE mEfiSystemTableTemplate = {
   {
     EFI_SYSTEM_TABLE_SIGNATURE,                                           // Signature
     EFI_SYSTEM_TABLE_REVISION,                                            // Revision
     sizeof (EFI_SYSTEM_TABLE),                                            // HeaderSize
     0,                                                                    // CRC32
     0                                                                     // Reserved
   },
   NULL,                                                                   // FirmwareVendor
   0,                                                                      // FirmwareRevision
   NULL,                                                                   // ConsoleInHandle
   NULL,                                                                   // ConIn
   NULL,                                                                   // ConsoleOutHandle
   NULL,                                                                   // ConOut
   NULL,                                                                   // StandardErrorHandle
   NULL,                                                                   // StdErr
   NULL,                                                                   // RuntimeServices
   &mBootServices,                                                         // BootServices
   0,                                                                      // NumberOfConfigurationTableEntries
   NULL                                                                    // ConfigurationTable
 };

在UEFI运行到DXE阶段时,UEFI内核会以此构建System Table,具体实现也在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c:

//
// Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
// Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
//

gDxeCoreST = AllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE), &mEfiSystemTableTemplate);
ASSERT (gDxeCoreST != NULL);

经过上面的拷贝动作我们可以知道,UEFI内核构建了一个System Table,以此作为提供给应用和驱动的接口,由构建的代码可知,它只能在DXE阶段开始后才能使用。需要注意的一点是,BootServices是在mEfiSystemTableTemplate静态设置的&mBootServices,而RuntimeServices初始化设置的是NULL,所以需要后面在代码中进行构建。这部分我们将在后面介绍。

启动服务表(BootServices)

和System Table一样,结构体也是定义在MdePkg/Include/Uefi/UefiSpec.h:

 /// EFI Boot Services Table.
 ///
 typedef struct {
   ///
   /// The table header for the EFI Boot Services Table.
   ///
   EFI_TABLE_HEADER                Hdr;

   //
   // Task Priority Services
   //
   EFI_RAISE_TPL                   RaiseTPL;
   EFI_RESTORE_TPL                 RestoreTPL;

   //
   // Memory Services
   //
   EFI_ALLOCATE_PAGES              AllocatePages;
   EFI_FREE_PAGES                  FreePages;
   EFI_GET_MEMORY_MAP              GetMemoryMap;
   EFI_ALLOCATE_POOL               AllocatePool;
   EFI_FREE_POOL                   FreePool;

   //
   // Event & Timer Services
   //
   EFI_CREATE_EVENT                  CreateEvent;
   EFI_SET_TIMER                     SetTimer;
   EFI_WAIT_FOR_EVENT                WaitForEvent;
   EFI_SIGNAL_EVENT                  SignalEvent;
   EFI_CLOSE_EVENT                   CloseEvent;
   EFI_CHECK_EVENT                   CheckEvent;

   //
   // Protocol Handler Services
   //
   EFI_INSTALL_PROTOCOL_INTERFACE    InstallProtocolInterface;
   EFI_REINSTALL_PROTOCOL_INTERFACE  ReinstallProtocolInterface;
   EFI_UNINSTALL_PROTOCOL_INTERFACE  UninstallProtocolInterface;
   EFI_HANDLE_PROTOCOL               HandleProtocol;
   VOID                              *Reserved;
   EFI_REGISTER_PROTOCOL_NOTIFY      RegisterProtocolNotify;
   EFI_LOCATE_HANDLE                 LocateHandle;
   EFI_LOCATE_DEVICE_PATH            LocateDevicePath;
   EFI_INSTALL_CONFIGURATION_TABLE   InstallConfigurationTable;

   //
   // Image Services
   //
   EFI_IMAGE_LOAD                    LoadImage;
   EFI_IMAGE_START                   StartImage;
   EFI_EXIT                          Exit;
   EFI_IMAGE_UNLOAD                  UnloadImage;
   EFI_EXIT_BOOT_SERVICES            ExitBootServices;
   //
   // Miscellaneous Services
   //
   EFI_GET_NEXT_MONOTONIC_COUNT      GetNextMonotonicCount;
   EFI_STALL                         Stall;
   EFI_SET_WATCHDOG_TIMER            SetWatchdogTimer;

   //
   // DriverSupport Services
   //
   EFI_CONNECT_CONTROLLER            ConnectController;
   EFI_DISCONNECT_CONTROLLER         DisconnectController;

   //
   // Open and Close Protocol Services
   //
   EFI_OPEN_PROTOCOL                 OpenProtocol;
   EFI_CLOSE_PROTOCOL                CloseProtocol;
   EFI_OPEN_PROTOCOL_INFORMATION     OpenProtocolInformation;

   //
   // Library Services
   //
   EFI_PROTOCOLS_PER_HANDLE          ProtocolsPerHandle;
   EFI_LOCATE_HANDLE_BUFFER          LocateHandleBuffer;
   EFI_LOCATE_PROTOCOL               LocateProtocol;
   EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES    InstallMultipleProtocolInterfaces;
   EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES  UninstallMultipleProtocolInterfaces;

   //
   // 32-bit CRC Services
   //
   EFI_CALCULATE_CRC32               CalculateCrc32;

   //
   // Miscellaneous Services
   //
   EFI_COPY_MEM                      CopyMem;
   EFI_SET_MEM                       SetMem;
   EFI_CREATE_EVENT_EX               CreateEventEx;
 } EFI_BOOT_SERVICES;

从上面的注释可以看出它包含了如下的一些内容:

  • 表头
  • 任务优先级服务
  • 内存服务
  • Event&Timer服务
  • Protocol相关服务
  • Image服务
  • 驱动支持服务
  • Protocol打开和关闭服务
  • 库相关服务
  • 其他服务

默认的初始化变量定义在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c:

//
// DXE Core Module Variables
//
EFI_BOOT_SERVICES mBootServices = {
  {
    EFI_BOOT_SERVICES_SIGNATURE,                                                          // Signature
    EFI_BOOT_SERVICES_REVISION,                                                           // Revision
    sizeof (EFI_BOOT_SERVICES),                                                           // HeaderSize
    0,                                                                                    // CRC32
    0                                                                                     // Reserved
  },
  (EFI_RAISE_TPL)                               CoreRaiseTpl,                             // RaiseTPL
  (EFI_RESTORE_TPL)                             CoreRestoreTpl,                           // RestoreTPL
  (EFI_ALLOCATE_PAGES)                          CoreAllocatePages,                        // AllocatePages
  (EFI_FREE_PAGES)                              CoreFreePages,                            // FreePages
  (EFI_GET_MEMORY_MAP)                          CoreGetMemoryMap,                         // GetMemoryMap
  (EFI_ALLOCATE_POOL)                           CoreAllocatePool,                         // AllocatePool
  (EFI_FREE_POOL)                               CoreFreePool,                             // FreePool
  (EFI_CREATE_EVENT)                            CoreCreateEvent,                          // CreateEvent
  (EFI_SET_TIMER)                               CoreSetTimer,                             // SetTimer
  (EFI_WAIT_FOR_EVENT)                          CoreWaitForEvent,                         // WaitForEvent
  (EFI_SIGNAL_EVENT)                            CoreSignalEvent,                          // SignalEvent
  (EFI_CLOSE_EVENT)                             CoreCloseEvent,                           // CloseEvent
  (EFI_CHECK_EVENT)                             CoreCheckEvent,                           // CheckEvent
  (EFI_INSTALL_PROTOCOL_INTERFACE)              CoreInstallProtocolInterface,             // InstallProtocolInterface
  (EFI_REINSTALL_PROTOCOL_INTERFACE)            CoreReinstallProtocolInterface,           // ReinstallProtocolInterface
  (EFI_UNINSTALL_PROTOCOL_INTERFACE)            CoreUninstallProtocolInterface,           // UninstallProtocolInterface
  (EFI_HANDLE_PROTOCOL)                         CoreHandleProtocol,                       // HandleProtocol
  (VOID *)                                      NULL,                                     // Reserved
  (EFI_REGISTER_PROTOCOL_NOTIFY)                CoreRegisterProtocolNotify,               // RegisterProtocolNotify
  (EFI_LOCATE_HANDLE)                           CoreLocateHandle,                         // LocateHandle
  (EFI_LOCATE_DEVICE_PATH)                      CoreLocateDevicePath,                     // LocateDevicePath
  (EFI_INSTALL_CONFIGURATION_TABLE)             CoreInstallConfigurationTable,            // InstallConfigurationTable
  (EFI_IMAGE_LOAD)                              CoreLoadImage,                            // LoadImage
  (EFI_IMAGE_START)                             CoreStartImage,                           // StartImage
  (EFI_EXIT)                                    CoreExit,                                 // Exit
  (EFI_IMAGE_UNLOAD)                            CoreUnloadImage,                          // UnloadImage
  (EFI_EXIT_BOOT_SERVICES)                      CoreExitBootServices,                     // ExitBootServices
  (EFI_GET_NEXT_MONOTONIC_COUNT)                CoreEfiNotAvailableYetArg1,               // GetNextMonotonicCount
  (EFI_STALL)                                   CoreStall,                                // Stall
  (EFI_SET_WATCHDOG_TIMER)                      CoreSetWatchdogTimer,                     // SetWatchdogTimer
  (EFI_CONNECT_CONTROLLER)                      CoreConnectController,                    // ConnectController
  (EFI_DISCONNECT_CONTROLLER)                   CoreDisconnectController,                 // DisconnectController
  (EFI_OPEN_PROTOCOL)                           CoreOpenProtocol,                         // OpenProtocol
  (EFI_CLOSE_PROTOCOL)                          CoreCloseProtocol,                        // CloseProtocol
  (EFI_OPEN_PROTOCOL_INFORMATION)               CoreOpenProtocolInformation,              // OpenProtocolInformation
  (EFI_PROTOCOLS_PER_HANDLE)                    CoreProtocolsPerHandle,                   // ProtocolsPerHandle
  (EFI_LOCATE_HANDLE_BUFFER)                    CoreLocateHandleBuffer,                   // LocateHandleBuffer
  (EFI_LOCATE_PROTOCOL)                         CoreLocateProtocol,                       // LocateProtocol
  (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES)    CoreInstallMultipleProtocolInterfaces,    // InstallMultipleProtocolInterfaces
  (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES)  CoreUninstallMultipleProtocolInterfaces,  // UninstallMultipleProtocolInterfaces
  (EFI_CALCULATE_CRC32)                         CoreEfiNotAvailableYetArg3,               // CalculateCrc32
  (EFI_COPY_MEM)                                CopyMem,                                  // CopyMem
  (EFI_SET_MEM)                                 SetMem,                                   // SetMem
  (EFI_CREATE_EVENT_EX)                         CoreCreateEventEx                         // CreateEventEx
 };

这里初始化定义的mBootServices地址会被直接传递给SystemTable:

 EFI_SYSTEM_TABLE mEfiSystemTableTemplate = {
  ......
   &mBootServices,              // BootServices
  ......
 };

运行时服务(RunTime Services)

在ExitBootServices执行之后,Boot Service中的函数就不能在使用了,但是Runtime Service Table中的函数仍然可以使用,从DXE阶段开始,一直到操作系统的结束,Runtime Service是一直存在的,在OS中依然可以调用。

结构体也是定义在MdePkg/Include/Uefi/UefiSpec.h:

 ///
 /// EFI Runtime Services Table.
 ///
 typedef struct {
   ///
   /// The table header for the EFI Runtime Services Table.
   ///
   EFI_TABLE_HEADER                Hdr;

   //
   // Time Services
   //
   EFI_GET_TIME                    GetTime;
   EFI_SET_TIME                    SetTime;
   EFI_GET_WAKEUP_TIME             GetWakeupTime;
   EFI_SET_WAKEUP_TIME             SetWakeupTime;

   //
   // Virtual Memory Services
   //
   EFI_SET_VIRTUAL_ADDRESS_MAP     SetVirtualAddressMap;
   EFI_CONVERT_POINTER             ConvertPointer;

   //
   // Variable Services
   //
   EFI_GET_VARIABLE                GetVariable;
   EFI_GET_NEXT_VARIABLE_NAME      GetNextVariableName;
   EFI_SET_VARIABLE                SetVariable;

   //
   // Miscellaneous Services
   //
   EFI_GET_NEXT_HIGH_MONO_COUNT    GetNextHighMonotonicCount;
   EFI_RESET_SYSTEM                ResetSystem;

   //
   // UEFI 2.0 Capsule Services
   //
   EFI_UPDATE_CAPSULE              UpdateCapsule;
   EFI_QUERY_CAPSULE_CAPABILITIES  QueryCapsuleCapabilities;

   //
   // Miscellaneous UEFI 2.0 Service
   //
   EFI_QUERY_VARIABLE_INFO         QueryVariableInfo;
 } EFI_RUNTIME_SERVICES;

默认的初始化变量定义在MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c:

 EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate = {
   {
     EFI_RUNTIME_SERVICES_SIGNATURE,                               // Signature
     EFI_RUNTIME_SERVICES_REVISION,                                // Revision
     sizeof (EFI_RUNTIME_SERVICES),                                // HeaderSize
     0,                                                            // CRC32
     0                                                             // Reserved
   },
   (EFI_GET_TIME)                    CoreEfiNotAvailableYetArg2,   // GetTime
   (EFI_SET_TIME)                    CoreEfiNotAvailableYetArg1,   // SetTime
   (EFI_GET_WAKEUP_TIME)             CoreEfiNotAvailableYetArg3,   // GetWakeupTime
   (EFI_SET_WAKEUP_TIME)             CoreEfiNotAvailableYetArg2,   // SetWakeupTime
   (EFI_SET_VIRTUAL_ADDRESS_MAP)     CoreEfiNotAvailableYetArg4,   // SetVirtualAddressMap
   (EFI_CONVERT_POINTER)             CoreEfiNotAvailableYetArg2,   // ConvertPointer
   (EFI_GET_VARIABLE)                CoreEfiNotAvailableYetArg5,   // GetVariable
   (EFI_GET_NEXT_VARIABLE_NAME)      CoreEfiNotAvailableYetArg3,   // GetNextVariableName
   (EFI_SET_VARIABLE)                CoreEfiNotAvailableYetArg5,   // SetVariable
   (EFI_GET_NEXT_HIGH_MONO_COUNT)    CoreEfiNotAvailableYetArg1,   // GetNextHighMonotonicCount
   (EFI_RESET_SYSTEM)                CoreEfiNotAvailableYetArg4,   // ResetSystem
   (EFI_UPDATE_CAPSULE)              CoreEfiNotAvailableYetArg3,   // UpdateCapsule
   (EFI_QUERY_CAPSULE_CAPABILITIES)  CoreEfiNotAvailableYetArg4,   // QueryCapsuleCapabilities
   (EFI_QUERY_VARIABLE_INFO)         CoreEfiNotAvailableYetArg4    // QueryVariableInfo
 };

Runtime Services也是在DxeMain.c中被加入到System Table的:

 //
 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
 //
 gDxeCoreST = AllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE), &mEfiSystemTableTemplate);
 ASSERT (gDxeCoreST != NULL);

 gDxeCoreRT = AllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES), &mEfiRuntimeServicesTableTemplate);
 ASSERT (gDxeCoreRT != NULL);

 gDxeCoreST->RuntimeServices = gDxeCoreRT;

 //

上面的初始化定义中,很多回调函数被设置为了CoreEfiNotAvailableYet*,这说明此函数还不可用,需要在DXE运行阶段动态的添加进来的。

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值