uefi 是如何找到grubaa64.efi的
来源:互联网 发布:哪些论坛分享软件 编辑:程序博客网 时间:2024/06/06 17:29
我们使用的是intelframeworkmodule 这个包,因此bds的入口函数是在intelframeworkmodule/universal/bdsdxe/bsdentry.c其入口函数是BdsEntry
在BdsEntry->BdsBootDeviceSelect->BdsLibBootViaBootOption 这个函数中下面这段code
Handle = BdsLibGetBootableHandle(DevicePath);
if (Handle != NULL) {
//
// Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
// machinename is ia32, ia64, x64, ...
//
FilePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
if (FilePath != NULL) {
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
Status = gBS->LoadImage (
TRUE,
gImageHandle,
FilePath,
NULL,
0,
&ImageHandle
);
}
}
}
这里的filepath是通过EFI_REMOVABLE_MEDIA_FILE_NAME 这个变量来找到的
#define EFI_REMOVABLE_MEDIA_FILE_NAME_IA32 L"\\EFI\\BOOT\\BOOTIA32.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_IA64 L"\\EFI\\BOOT\\BOOTIA64.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_X64 L"\\EFI\\BOOT\\BOOTX64.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_ARM L"\\EFI\\BOOT\\BOOTARM.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64 L"\\EFI\\GRUB2\\grubaa64.efi"
#if defined (MDE_CPU_IA32)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_IA32
#elif defined (MDE_CPU_IPF)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_IA64
#elif defined (MDE_CPU_X64)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_X64
#elif defined (MDE_CPU_EBC)
#elif defined (MDE_CPU_ARM)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_ARM
#elif defined (MDE_CPU_AARCH64)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64
#else
#error Unknown Processor Type
#endif
由于我们是MDE_CPU_AARCH64,因此EFI_REMOVABLE_MEDIA_FILE_NAME 就等于L"\\EFI\\GRUB2\\grubaa64.efi"
因此在BdsLibBootViaBootOption 中通过gBS->LoadImage 来找到grubaa64.efi,最后还是在BdsLibBootViaBootOption 中通过下面的code Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);来跳转到grub的第一行代码。
在BdsEntry->BdsBootDeviceSelect->BdsLibBootViaBootOption 这个函数中下面这段code
Handle = BdsLibGetBootableHandle(DevicePath);
if (Handle != NULL) {
//
// Load the default boot file \EFI\BOOT\boot{machinename}.EFI from removable Media
// machinename is ia32, ia64, x64, ...
//
FilePath = FileDevicePath (Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
if (FilePath != NULL) {
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
Status = gBS->LoadImage (
TRUE,
gImageHandle,
FilePath,
NULL,
0,
&ImageHandle
);
}
}
}
这里的filepath是通过EFI_REMOVABLE_MEDIA_FILE_NAME 这个变量来找到的
#define EFI_REMOVABLE_MEDIA_FILE_NAME_IA32 L"\\EFI\\BOOT\\BOOTIA32.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_IA64 L"\\EFI\\BOOT\\BOOTIA64.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_X64 L"\\EFI\\BOOT\\BOOTX64.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_ARM L"\\EFI\\BOOT\\BOOTARM.EFI"
#define EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64 L"\\EFI\\GRUB2\\grubaa64.efi"
#if defined (MDE_CPU_IA32)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_IA32
#elif defined (MDE_CPU_IPF)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_IA64
#elif defined (MDE_CPU_X64)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_X64
#elif defined (MDE_CPU_EBC)
#elif defined (MDE_CPU_ARM)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_ARM
#elif defined (MDE_CPU_AARCH64)
#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64
#else
#error Unknown Processor Type
#endif
由于我们是MDE_CPU_AARCH64,因此EFI_REMOVABLE_MEDIA_FILE_NAME 就等于L"\\EFI\\GRUB2\\grubaa64.efi"
因此在BdsLibBootViaBootOption 中通过gBS->LoadImage 来找到grubaa64.efi,最后还是在BdsLibBootViaBootOption 中通过下面的code Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);来跳转到grub的第一行代码。
0 0
- uefi 是如何找到grubaa64.efi的
- EFI和UEFI的区别
- EFI、UEFI、MBR、GPT的区别
- biso efi uefi
- EFI,UEFI和操作系统
- UEFI 文件类型.efi
- UEFI 文件类型 .efi (二)
- EFI/UEFI BIOS 入门
- 对“传统BIOS”与“EFI/UEFI BIOS”的基本认识
- 对“传统BIOS”与“EFI/UEFI BIOS”的基本认识
- dell VOSTRO 5470 恢复efi启动方法(在uefi添加efi启动项的操作)
- 如何查看你的系统是legacy还是UEFI启动
- 如何使用efi toolkit搭建编译efi app的环境
- Spring MVC是如何找到控制器的
- [知其然不知其所以然-9] linux e820/efi memory map是如何初始化的
- SSD中没有efi分区的解决办法即固态硬盘不能设置uefi引导的解决办法
- EFI, UEFI和BIOS的区别,GPT分区和MBR分区的区别
- [系统]对EFI分区以及UEFI,GPT,BIOS,MBR启动的理解
- vue移动端错误信息弹出提示
- 日常bug
- 欢迎使用CSDN-markdown编辑器
- 关于Xcode提高读写速度遇到的问题和一些想法
- 大数据:Spark Shuffle(一)ShuffleWrite:Executor如何将Shuffle的结果进行归并写到数据文件中去
- uefi 是如何找到grubaa64.efi的
- Spring Cloud官方文档Dalston版本翻译(一)
- 安卓中各种数据类型之间的转换
- APUE笔记之系统数据文件
- java高级_工具类_数学类
- Spring动态代理之详细DEBUG日志模式
- Could Not Get the Value for Parameter compilerId for Plugin Execution
- 七大查找算法
- Laravel5.2.45初级系列教程(1)