uefi
tiantao2012
这个作者很懒,什么都没留下…
展开
-
uefi对acpi的support
uefi-master\IntelFrameworkModulePkg\Universal\Acpi\AcpiSupportDxe从inf文件可以看出这是一个DXE_DRIVER,其入口函数是InstallAcpiSupport[Defines] MODULE_TYPE = DXE_DRIVER ENTRY_POINT原创 2016-12-17 21:09:08 · 3540 阅读 · 0 评论 -
UEFI Application
UEFI Application是一种EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION类型的EFI Image。os loader 是一种特殊的application,执行完成后不会return或者exit,相反会调用EFI boot service gBS->ExitBootServices()来将控制权从fireware 传递给os。下面是一个名为HelloWorld原创 2017-05-16 16:52:10 · 4880 阅读 · 0 评论 -
uefi 是如何找到grubaa64.efi的
我们使用的是intelframeworkmodule 这个包,因此bds的入口函数是在intelframeworkmodule/universal/bdsdxe/bsdentry.c其入口函数是BdsEntry在BdsEntry->BdsBootDeviceSelect->BdsLibBootViaBootOption 这个函数中下面这段code Handle = BdsLibG原创 2017-04-26 16:15:43 · 6480 阅读 · 0 评论 -
uefi driver
uefi drivers 是指在inf中将MODULE_TYPE指定为UEFI_DRIVER。例如inf的例子[Defines] INF_VERSION = 0x00010005 BASE_NAME = DiskIoDxe MODULE_UNI_FILE = Disk原创 2017-05-18 10:29:23 · 6204 阅读 · 0 评论 -
UEFI向SRAT 表中添加memory信息
从inf文件可以看到这是一个DXE_DRIVER,其入口函数是AcpiPlatformEntryPoint[Defines] INF_VERSION = 0x00010005 BASE_NAME = AcpiPlatform MODULE_UNI_FILE = Acp原创 2017-05-18 15:17:38 · 1728 阅读 · 0 评论 -
uefi中等待键盘事件
在armplatformpkg/bds/bds.c 中为我们展现了如何读取键盘值的方法EFI_STATUSStartDefaultBootOnTimeout ( VOID ){ UINTN Size; UINT16 Timeout; UINT16 *TimeoutPtr; EFI_EVEN原创 2017-09-05 16:46:58 · 3454 阅读 · 0 评论 -
bios 中reboot的实现
bios中reboot的flow 如下:可见是作为一个runtime service 提供给kernel的继续看看ResetSystemViaLib的源码Reset.c (embeddedpkg\resetruntimedxe): LibResetSystem (ResetType, ResetStatus, DataSize, ResetData);**/VOIDEFIA原创 2017-09-22 17:22:38 · 1563 阅读 · 0 评论 -
通过在uefi shell 命令行启动grub
正常情况下在uefi中可以看到debian的grub路径在\EFI\debian\grubaa64.efi进入uefi的shell 执行\EFI\debian\grubaa64.efi。如果有多个硬盘可以在前面加上fsx:\EFI\debian\grubaa64.efi。执行成功后就可以看到进入grub了原创 2017-11-21 14:26:38 · 22795 阅读 · 1 评论 -
不要使用_OS ,_OSI ,_REV来区分windows还是linux
再bios中经常有人通过下面的语句判断当前系统是linux _OSI("Linux") 还是window _OSI("Windows 2001") 目前这两个都是在BIOS中返回true有的bios还使用_REV 来区分window还是linux ,window 中_REV=2,但是在linux中 _REV也是等于2所以结论就是不用使用_OS ,_OSI ,_REV来区分windows还是li...原创 2018-03-16 18:58:29 · 1133 阅读 · 0 评论 -
_OSI("Windows 2001")在linux 平台上回返回2,不要用OSI 区分window和linux
当在bios中调用_OSI("Windows 2001") 来确实当前系统是否是window时,这个用法是错误的。但是linux中对OSI的实现函数如下:acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state){ /* Lookup the interface in the global _OSI l...原创 2018-03-16 19:22:34 · 675 阅读 · 1 评论 -
ueif的stall的实现
在uefi 中一般通过下面的code来delay 10us // SRST should assert for at least 5 us, we use 10 us for // better compatibility // gBS->Stall (10);其中gBs的stall是在mdemodulepkg/dxe/dxemain 中来赋值的EFI_BO原创 2017-05-05 10:48:16 · 2306 阅读 · 0 评论 -
pei和dxe之间通过hob传递参数
在PEI和DXE之间通过HOB 传递参数。例如从VOID EFIAPI DxeMain ( IN VOID *HobStart ) 的入口函数也可以看到输入参数只有一个,这个参数是在PEI阶段准备好的。拿到HOB 后就可以按照下面的code从HOB中拿到PEI传递过来的数据 VectorInfoList = NULL; GuidHob = GetNextGuidHob (&g原创 2017-03-13 10:18:38 · 2416 阅读 · 0 评论 -
uefi bds boot flow
BdsEntry.c 是BDS的入口函数所在的文件,其入口函数为BdsEntry。在BdsEntry 中会调用 // Check if we have the boot next option // mBootNext = BdsLibGetVariableAndSize ( L"BootNext", &gE原创 2017-01-14 15:06:48 · 2543 阅读 · 0 评论 -
bds 中的watchdog
在BdsLibBootViaBootOption 中在调用gBS->StartImage 之前会设置一个watchdog. gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL); // // Write boot to OS performance data for UEFI boot // PERF_CODE (原创 2017-01-14 15:24:44 · 1027 阅读 · 0 评论 -
uefi中使用watchdog
一般要在uefi中使用watchdog,会按照如下格式。 gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL); XXXXXXXXXXXX gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);即首先调用gBS->SetWatchdogTimer (5 * 60, 0原创 2017-01-16 15:31:46 · 2710 阅读 · 0 评论 -
uefi CoreTimerTick
CoreTimerTick 是ueif的timer中断的处理函数,也是uefi中唯一支持的中断。其路径在mdemodulepkg/core/dxe/eventCoreTimerTick ( IN UINT64 Duration ){ IEVENT *Event; CoreAcquireLock (&mEfiSystemTimeLock)原创 2017-01-22 14:38:29 · 1071 阅读 · 0 评论 -
uefi timer 中断
在在mdemodulepkg/core/dxe/dxemain/dexmainc中会调用CoreNotifyOnProtocolInstallation ();VOIDCoreNotifyOnProtocolInstallation ( VOID ){ CoreNotifyOnProtocolEntryTable (mArchProtocols); CoreNo原创 2017-01-22 16:29:17 · 1994 阅读 · 0 评论 -
uefi CoreRegisterProtocolNotify
一般通过下面的函数来将image copy到dram中 Status = gBS->LoadImage ( TRUE, gImageHandle, FullDevicePath, NULL,原创 2017-01-23 11:03:01 · 1732 阅读 · 0 评论 -
dxe communication 之protocol
dxe driver 之间可以通过三种方式来沟通第一种方式是用protocalprotocol 使用前需要先install,install protocol 主要有下面三个API InstallProtocolInterface() ReInstallProtocolInterface() InstallMultipleProtocolInterfaces()要使用pr原创 2017-03-03 11:08:21 · 1994 阅读 · 1 评论 -
dxe communication 之variable and pcd
dxe driver 之间也可以通过variable来通讯。EFI_STATUSReadAndWriteVariable (IN CHAR16*Name,IN EFI_GUID*VendorGuid,){EFI_STATUS Status;UINTNBufferSize;VOID*Buffer;Buffer = NULL;Buffer原创 2017-03-03 14:46:31 · 1301 阅读 · 0 评论 -
gTimer protocol的实现
在Omap35xxpkg中的TimerDxe 有实现gTimer。从inf中可以看到这个是一个DXE_DRIVER driver,其入口函数是TimerInitialize[Defines] INF_VERSION = 0x00010005 BASE_NAME = BeagleBoardTimerD原创 2017-03-10 16:53:32 · 985 阅读 · 0 评论 -
bios 为硬盘中的grub生成入口
bios有提供一个函数可以帮忙生成一个在os的启动项,通常情况下系统安装完成后会通过efibootmgr为这个os生成启动项,且这个启动项是存在flash中而非硬盘中。因此bios的shell中提供了一个BootFromFile的函数,可以scan 硬盘中的grubaa64.efi,从而为硬盘中已经存在的os生成新的启动项,这样做的好处是我把os装到一个硬盘里,这样我直接把这个硬盘拔下来插到另外一...原创 2018-04-09 09:41:11 · 1731 阅读 · 0 评论