写这个文章是因为BOOT Service这个表实在是太长了,没辙了只好单独开一篇文章来讲数据结构的事情。
BS的struct在GRUB2源代码中/include/grub/efi/api.h文件中存在定义,在UEFI协议原文中亦有定义,只不过前者还可以结合其他部分代码深入解析各部件的结构,文章最后是源代码。
BS表的结构分析
这是一个由上到下描述BS表的结构
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;