BdsEntry.c 是BDS的入口函数所在的文件,其入口函数为BdsEntry。
在BdsEntry 中会调用
// Check if we have the boot next option
//
mBootNext = BdsLibGetVariableAndSize (
L"BootNext",
&gEfiGlobalVariableGuid,
&BootNextSize
);
得到当前boot menu中的选项,即决定从哪一项开始启动os,而这一项是由BootNext 来决定的.
之后调用
BdsBootDeviceSelect ()——>BdsLibBootViaBootOption
在BdsLibBootViaBootOption中会调用如下code来装载os Image.
// Report status code for OS Loader LoadImage.
//
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
Status = gBS->LoadImage (
TRUE,
gImageHandle,
DevicePath,
NULL,
0,
&ImageHandle
);
然后调用gBS->StartImage 来开始进入下下一阶段.
Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);
在BdsEntry 中会调用
// Check if we have the boot next option
//
mBootNext = BdsLibGetVariableAndSize (
L"BootNext",
&gEfiGlobalVariableGuid,
&BootNextSize
);
得到当前boot menu中的选项,即决定从哪一项开始启动os,而这一项是由BootNext 来决定的.
之后调用
BdsBootDeviceSelect ()——>BdsLibBootViaBootOption
在BdsLibBootViaBootOption中会调用如下code来装载os Image.
// Report status code for OS Loader LoadImage.
//
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
Status = gBS->LoadImage (
TRUE,
gImageHandle,
DevicePath,
NULL,
0,
&ImageHandle
);
然后调用gBS->StartImage 来开始进入下下一阶段.
Status = gBS->StartImage (ImageHandle, ExitDataSize, ExitData);