菜单

kaoqi
kaoqi
发布于 2026-08-21 / 11 阅读
0
0

UEFI中的Boot Service表结构

写这个文章是因为BOOT Service这个表实在是太长了,没辙了只好单独开一篇文章来讲数据结构的事情。

BS的struct在GRUB2源代码中/include/grub/efi/api.h文件中存在定义,在UEFI协议原文中亦有定义,只不过前者还可以结合其他部分代码深入解析各部件的结构,文章最后是源代码。

BS表的结构分析

这是一个由上到下描述BS表的结构

指针计数

表项

含义

#

EFI_TABLE_HEADER Hdr;

struct grub_efi_table_header

{

grub_efi_uint64_t signature;

grub_efi_uint32_t revision;

grub_efi_uint32_t header_size;

grub_efi_uint32_t crc32;

grub_efi_uint32_t reserved;

};

这样子的一个结构

1

EFI_RAISE_TPL RaiseTPL;

指针;用于调节程序前后文优先级

2

EFI_RESTORE_TPL RestoreTPL;

指针;将当前任务的优先级恢复到之前保存的状态

3

EFI_ALLOCATE_PAGES AllocatePages;

指针;用于申请内存页

4

EFI_FREE_PAGES FreePages;

指针;用于释放页内存

5

EFI_GET_MEMORY_MAP GetMemoryMap;

指针;用于获取当前系统的完整内存分布图

6

EFI_ALLOCATE_POOL AllocatePool;

指针;以字节为单位从内存池中分配小块内存

7

EFI_FREE_POOL FreePool;

指针;释放由AllocatePool分配的内存块

8

EFI_CREATE_EVENT CreateEvent;

指针;创建一个新的事件对象

9

EFI_SET_TIMER SetTimer;

指针;为已创建的定时器事件设置触发时间

10

EFI_WAIT_FOR_EVENT WaitForEvent;

指针;阻塞当前执行流,直到指定的一组事件中至少有一个被触发

11

EFI_SIGNAL_EVENT SignalEvent;

指针;手动触发一个事件

12

EFI_CLOSE_EVENT CloseEvent;

指针;关闭并销毁一个事件对象

13

EFI_CHECK_EVENT CheckEvent;

指针;非阻塞地检查事件是否已被触发

14

EFI_INSTALL_PROTOCOL_INTERFACE

指针;将一个新的协议接口安装到指定的句柄上。

15

EFI_REINSTALL_PROTOCOL_INTERFACE

指针;替换指定句柄上已存在的某个协议接口

16

EFI_UNINSTALL_PROTOCOL_INTERFACE

指针;从指定句柄上移除一个协议接口

17

EFI_HANDLE_PROTOCOL

指针;查询指定句柄上是否安装了某个特定的GUID协议,返回其接口指针

18

VOID* Reserved;

指针;保留字段

19

EFI_REGISTER_PROTOCOL_NOTIFY

指针;用于注册一个事件

20

EFI_LOCATE_HANDLE

指针;在全局句柄数据库中搜索符合特定条件的句柄

21

EFI_LOCATE_DEVICE_PATH

指针;这是一个高级查找函数,接受一个设备路径,并在系统中查找与该路径最匹配的句柄

22

EFI_INSTALL_CONFIGURATION_TABLE

指针;在全局系统表的配置数组中安装或更新一个由GUID作为标识的配置表指针

23

EFI_IMAGE_UNLOAD

指针;加载EFI镜像到内存中,并创建一个对应的句柄

24

EFI_IMAGE_START

指针;执行上个函数加载来的efi文件

25

EFI_EXIT

指针;终止当前正在运行的镜像,并将控制权返回给调用者

26

EFI_IMAGE_UNLOAD

指针;从内存中卸载之前加载的镜像,并释放相关资源

27

EFI_EXIT_BOOT_SERVICES

指针;通知固件操作系统即将接管控制权

28

EFI_GET_NEXT_MONOTONIC_COUNT

指针;获取一个单调递增的64位计数器

29

EFI_STALL

指针;使当前执行现成暂停指定的微秒数

30

EFI_SET_WATCHDOG_TIMER

指针;设置或禁用看门狗定时器

31

EFI_CONNECT_CONTROLLER

指针;尝试将驱动程序绑定到指定的控制器句柄

32

EFI_DISCONNECT_CONTROLLER

指针;断开指定驱动与控制器的绑定

33

EFI_OPEN_PROTOCOL

指针;打开指定句柄上的协议接口并调用建立者与协议之间的关联

34

EFI_CLOSE_PROTOCOL

指针;关闭之前通过打开的接口

35

EFI_OPEN_PROTOCOL_INFORMATION

指针;查询某个句柄上特定协议的打开状态信息

36

EFI_PROTOCOLS_PER_HANDLE

指针;查询指定句柄上安装了哪些协议

37

EFI_LOCATE_HANDLE_BUFFER

指针;搜索符合特定条件的句柄,并自动分配内存

38

EFI_LOCATE_PROTOCOL

指针;查找系统中第一个安装了指定GUID协议的句柄,并返回其接口指针

39

EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES

指针;在同一个句柄上一次性安装多个协议

40

EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES

指针;在同一个句柄上一次性卸载多个协议

41

EFI_CALCULATE_CRC32

指针;计算CRC校验值

42

EFI_COPY_MEM

指针;复制内存区域内容到另一块区域

43

EFI_SET_MEM

指针;将一块内存区域的所有字节设置为指定的值

44

EFI_CREATE_EVENT_EX

指针;在Grub2中甚至没有定义这个变量

GRUB2源代码

struct grub_efi_boot_services
{
  grub_efi_table_header_t hdr;

  grub_efi_tpl_t
  (__grub_efi_api *raise_tpl) (grub_efi_tpl_t new_tpl);

  void
  (__grub_efi_api *restore_tpl) (grub_efi_tpl_t old_tpl);

  grub_efi_status_t
  (__grub_efi_api *allocate_pages) (grub_efi_allocate_type_t type,
				    grub_efi_memory_type_t memory_type,
				    grub_efi_uintn_t pages,
				    grub_efi_physical_address_t *memory);

  grub_efi_status_t
  (__grub_efi_api *free_pages) (grub_efi_physical_address_t memory,
				grub_efi_uintn_t pages);

  grub_efi_status_t
  (__grub_efi_api *get_memory_map) (grub_efi_uintn_t *memory_map_size,
				    grub_efi_memory_descriptor_t *memory_map,
				    grub_efi_uintn_t *map_key,
				    grub_efi_uintn_t *descriptor_size,
				    grub_efi_uint32_t *descriptor_version);

  grub_efi_status_t
  (__grub_efi_api *allocate_pool) (grub_efi_memory_type_t pool_type,
				   grub_efi_uintn_t size,
				   void **buffer);

  grub_efi_status_t
  (__grub_efi_api *free_pool) (void *buffer);

  grub_efi_status_t
  (__grub_efi_api *create_event) (grub_efi_uint32_t type,
				  grub_efi_tpl_t notify_tpl,
				  void (__grub_efi_api *notify_function) (grub_efi_event_t,
									  void *context),
				  void *notify_context,
				  grub_efi_event_t *event);

  grub_efi_status_t
  (__grub_efi_api *set_timer) (grub_efi_event_t event,
			       grub_efi_timer_delay_t type,
			       grub_efi_uint64_t trigger_time);

  grub_efi_status_t
  (__grub_efi_api *wait_for_event) (grub_efi_uintn_t num_events,
				    grub_efi_event_t *event,
				    grub_efi_uintn_t *index);

  grub_efi_status_t
  (__grub_efi_api *signal_event) (grub_efi_event_t event);

  grub_efi_status_t
  (__grub_efi_api *close_event) (grub_efi_event_t event);

  grub_efi_status_t
  (__grub_efi_api *check_event) (grub_efi_event_t event);

  grub_efi_status_t
  (__grub_efi_api *install_protocol_interface) (grub_efi_handle_t *handle,
						grub_guid_t *protocol,
						grub_efi_interface_type_t protocol_interface_type,
						void *protocol_interface);

  grub_efi_status_t
  (__grub_efi_api *reinstall_protocol_interface) (grub_efi_handle_t handle,
						  grub_guid_t *protocol,
						  void *old_interface,
						  void *new_interface);

  grub_efi_status_t
  (__grub_efi_api *uninstall_protocol_interface) (grub_efi_handle_t handle,
						  grub_guid_t *protocol,
						  void *protocol_interface);

  grub_efi_status_t
  (__grub_efi_api *handle_protocol) (grub_efi_handle_t handle,
				     grub_guid_t *protocol,
				     void **protocol_interface);

  void *reserved;

  grub_efi_status_t
  (__grub_efi_api *register_protocol_notify) (grub_guid_t *protocol,
					      grub_efi_event_t event,
					      void **registration);

  grub_efi_status_t
  (__grub_efi_api *locate_handle) (grub_efi_locate_search_type_t search_type,
				   grub_guid_t *protocol,
				   void *search_key,
				   grub_efi_uintn_t *buffer_size,
				   grub_efi_handle_t *buffer);

  grub_efi_status_t
  (__grub_efi_api *locate_device_path) (grub_guid_t *protocol,
					grub_efi_device_path_t **device_path,
					grub_efi_handle_t *device);

  grub_efi_status_t
  (__grub_efi_api *install_configuration_table) (grub_guid_t *guid,
						 void *table);

  grub_efi_status_t
  (__grub_efi_api *load_image) (grub_efi_boolean_t boot_policy,
				grub_efi_handle_t parent_image_handle,
				grub_efi_device_path_t *file_path,
				void *source_buffer,
				grub_efi_uintn_t source_size,
				grub_efi_handle_t *image_handle);

  grub_efi_status_t
  (__grub_efi_api *start_image) (grub_efi_handle_t image_handle,
				 grub_efi_uintn_t *exit_data_size,
				 grub_efi_char16_t **exit_data);

  grub_efi_status_t
  (__grub_efi_api *exit) (grub_efi_handle_t image_handle,
			  grub_efi_status_t exit_status,
			  grub_efi_uintn_t exit_data_size,
			  grub_efi_char16_t *exit_data);

  grub_efi_status_t
  (__grub_efi_api *unload_image) (grub_efi_handle_t image_handle);

  grub_efi_status_t
  (__grub_efi_api *exit_boot_services) (grub_efi_handle_t image_handle,
					grub_efi_uintn_t map_key);

  grub_efi_status_t
  (__grub_efi_api *get_next_monotonic_count) (grub_efi_uint64_t *count);

  grub_efi_status_t
  (__grub_efi_api *stall) (grub_efi_uintn_t microseconds);

  grub_efi_status_t
  (__grub_efi_api *set_watchdog_timer) (grub_efi_uintn_t timeout,
					grub_efi_uint64_t watchdog_code,
					grub_efi_uintn_t data_size,
					grub_efi_char16_t *watchdog_data);

  grub_efi_status_t
  (__grub_efi_api *connect_controller) (grub_efi_handle_t controller_handle,
					grub_efi_handle_t *driver_image_handle,
					grub_efi_device_path_protocol_t *remaining_device_path,
					grub_efi_boolean_t recursive);

  grub_efi_status_t
  (__grub_efi_api *disconnect_controller) (grub_efi_handle_t controller_handle,
					   grub_efi_handle_t driver_image_handle,
					   grub_efi_handle_t child_handle);

  grub_efi_status_t
  (__grub_efi_api *open_protocol) (grub_efi_handle_t handle,
				   grub_guid_t *protocol,
				   void **protocol_interface,
				   grub_efi_handle_t agent_handle,
				   grub_efi_handle_t controller_handle,
				   grub_efi_uint32_t attributes);

  grub_efi_status_t
  (__grub_efi_api *close_protocol) (grub_efi_handle_t handle,
				    grub_guid_t *protocol,
				    grub_efi_handle_t agent_handle,
				    grub_efi_handle_t controller_handle);

  grub_efi_status_t
  (__grub_efi_api *open_protocol_information) (grub_efi_handle_t handle,
					       grub_guid_t *protocol,
					       grub_efi_open_protocol_information_entry_t **entry_buffer,
					       grub_efi_uintn_t *entry_count);

  grub_efi_status_t
  (__grub_efi_api *protocols_per_handle) (grub_efi_handle_t handle,
					  grub_packed_guid_t ***protocol_buffer,
					  grub_efi_uintn_t *protocol_buffer_count);

  grub_efi_status_t
  (__grub_efi_api *locate_handle_buffer) (grub_efi_locate_search_type_t search_type,
					  grub_guid_t *protocol,
					  void *search_key,
					  grub_efi_uintn_t *no_handles,
					  grub_efi_handle_t **buffer);

  grub_efi_status_t
  (__grub_efi_api *locate_protocol) (grub_guid_t *protocol,
				     void *registration,
				     void **protocol_interface);

  grub_efi_status_t
  (__grub_efi_api *install_multiple_protocol_interfaces) (grub_efi_handle_t *handle, ...);

  grub_efi_status_t
  (__grub_efi_api *uninstall_multiple_protocol_interfaces) (grub_efi_handle_t handle, ...);

  grub_efi_status_t
  (__grub_efi_api *calculate_crc32) (void *data,
				     grub_efi_uintn_t data_size,
				     grub_efi_uint32_t *crc32);

  void
  (__grub_efi_api *copy_mem) (void *destination, void *source, grub_efi_uintn_t length);

  void
  (__grub_efi_api *set_mem) (void *buffer, grub_efi_uintn_t size, grub_efi_uint8_t value);
};
typedef struct grub_efi_boot_services grub_efi_boot_services_t;


评论