![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UEFI-BIOS
文章平均质量分 72
UEFI-BIOS
毛毛虫的爹
这个作者很懒,什么都没留下…
展开
-
UEFI开发探索13 – 访问PCI/PCI-E设备1
从实践中知道,PCI I/O Protocol可以访问改在在主板上的所有PCI设备,而PCI Root Bridge I/O Protocol不能访问PCI to PCI桥设备。UEFI Spec中有两个protocol可以访问PCI设备,PCI Root Bridge I/O Protocol和PCI I/O Protocol。配置空间包括一系列的PCI配置寄存器,其实现位置可以在PCI配置空间中,或者IO空间,也可以直接在申请的memory空间中实现。代码中以此函数,获取所有能找到的PCI设备。原创 2023-04-23 15:48:14 · 696 阅读 · 0 评论 -
Uefi编程 检查Pcie设备是否支持ASPM功能
WritePci.c (待完善,需要保持其他寄存器值不变)对pci设备某个寄存器实现写功能。WritePci.inf文件。Aspm.inf文件。原创 2023-04-23 12:39:03 · 720 阅读 · 1 评论 -
如何在飞腾平台上安装Ubuntu操作系统
注意: 若主板上配置的是NVME硬盘,在进行内核配置时,需要将内核的NEME驱动勾选上,否则移植内核时,无法找到文件系统,进不去操作系统。可以通过rufus软件将镜像做到U盘中,本次使用版本为Rufus 3.9.124 ,其他版本也可以。不要下载live版本的,没有准备网络环境,是一个头疼的事情,笔者暂时没有实现网络安装。将U盘接到主板usb口上,接上串口,显示器,,必需串口有打印才可以安装。可以通过dd命令,将iso安装到U盘。安装的是最小系统,缺少很多命令,需要联网更新,或则更换飞腾专用内核。原创 2023-04-23 09:24:22 · 1343 阅读 · 0 评论 -
读取飞腾套片X100内部温度和chipID
上面返回共16字节有效数值0x4b 0x50 0x41 0x30 0x34 0x39 0x30 0x31 0x33 0x32 0x31 0x39 0x30 0x30 0x30 0x30,转换成ASCII字符串,即“KPA0490132190000”。sudo i2ctransfer -f -y 1 w10@0x18 0x00 0x70 0x02 0x10 0x28 0x00 0x00 0x00 0x01 0x01 //低32bit。//读取chipID 高32-bit。//读取chipID。原创 2023-04-23 09:21:14 · 888 阅读 · 0 评论 -
coreboot & seabios
seabios现在是很多虚拟机的默认启动bios,这跟它的短小精干有很大关系,也跟它提供比较完备的legacy支持有关。按照以下步骤把seabios制作成coreboot的payload,最新的代码是seabios v1.7.3.1建议先试用seabios v1.7.2,因为下面提供的参考.config文件基于seabios v1.7.2。如果运行该命令时报错,一般可安装所需的library解决。原创 2023-04-17 09:59:51 · 963 阅读 · 0 评论 -
UEFI Device Path (1): 重新认识Device Path
每个variable的内容都包含1个Device Path,这个Device Path表示每次开机默认使用的用于该种用途(ConIn,ConOut, ErrOut)的Console Device,UEFI应用可以通过这个Device Path来确定对应的Console Device。Messaging Device Path IDE设备,USB设备,SATA设备,SAS设备,SCSI设备,UART设备,Vendor自定义对象,MAC地址,IPv4/IPv6地址,其他新兴设备。原创 2023-04-06 08:21:54 · 1029 阅读 · 0 评论 -
UEFI BootOption Variable存储字节流
可以看到Boot0000,Attribute 0x108, 是unactive的,FilePathSize 0x2c,描述就是,**** Setupo Utility。可以知道Attribute占4个字节,路径长度FilePathSize 2个字节。然后是设备描述,是Unicode字串串,以0x0,0x0结尾,然后跟着的就是FilePath.图中的Boot0000就是存储启动项Boot0000的属性变量名称,启动路径的数据。这个是BootOption结构体,但是实际上的存储并不是按照这个格式存储的。原创 2023-04-03 21:23:29 · 550 阅读 · 1 评论 -
Ipmi 之Boot Option
找到之后判断一下如果这个BootType和之前的不一样,那就调用通知的函数,也就是给bmc发送命令的函数IpmiSetBootFlags,如果发送成功,更新一下对应的variable。在bios启动过程中,到Bds阶段,会遍历所有的BootOption,并创建BootOrder variable,然后会根据BootOrder中的顺序,来获取第一启动项,并通过variable Boot000#(# 代码启动顺序的id,数值0-N),下面详细的看一下遍历系统启动项,已经注册Boot000#的过程。原创 2023-04-03 21:17:37 · 2411 阅读 · 2 评论 -
UEFI下BootOption
如果BootOption不是这种NVME,比方说,你想要设置一个硬盘里面的/test/test.efi作为一个启动项,你可以使用PciRoot(0x0)/Pci(0xF,0x0)/Pci(0x0,0x0)/NVMe(0x1,3E-12-30-80-44-A7-79-64)/HD(6,GPT,C75CD876-DC80-4DF8-B6A4-7B2111703BA6,0x16E7B000,0x3C78000)/\test\test.efi。其中OptionNumber就是0,1,2,3,4,5依次递增。原创 2023-04-03 21:10:34 · 1610 阅读 · 1 评论 -
UEFI shell - 脚本文件startup.nsh
edk2/ShellPkg/Application/Shell/Shell.c原创 2023-04-03 15:38:04 · 1721 阅读 · 0 评论 -
【UEFI基础】OVMF设置默认启动项为UEFI Shell
当然如果需要设置其他的启动项为默认项,只需要修改BootOptionPriority 中 StrCmp (BootOption->Description, L"EFI Internal Shell")为 StrCmp (BootOption->Description, L"XXXX")。之前由于NT32编译的虚拟环境一直卡在中途,无法进入Shell,一直使用的是OVMF. OVMF确实挺好用的,只是进入shell环境时网络启动一直优先,太费时间了,正好看到CSDN里面的博主有改了这块。原创 2023-04-03 11:55:49 · 440 阅读 · 0 评论 -
BIOS PEI Phase涉及模块函数一览
硬件相关初始化动作,大部分都是在Pei Phase、Dxe 前期Non EFI Driver Model的Driver, 初始化Processor、Chipset或Platform,当然有些也通过Oprom 或file in an EFI System Partition来进行初始化。主要功能是加载并连接驱动程序,管理并启动引导项。在引导操作系统之前会初始化设备(USB键盘鼠标,VGA设备等),然后通过Variable功能来控制启动顺序,根据启动策略加载对应的引导项,启动操作系统或应用程序。原创 2023-04-03 08:16:30 · 480 阅读 · 1 评论 -
BIOS的BDS阶段解析
硬件相关初始化动作,大部分都是在Pei Phase、Dxe 前期Non EFI Driver Model的Driver, 初始化Processor、Chipset或Platform,当然有些也通过Oprom 或file in an EFI System Partition来进行初始化。主要功能是加载并连接驱动程序,管理并启动引导项。在引导操作系统之前会初始化设备(USB键盘鼠标,VGA设备等),然后通过Variable功能来控制启动顺序,根据启动策略加载对应的引导项,启动操作系统或应用程序。原创 2023-04-03 08:16:19 · 875 阅读 · 0 评论 -
PEI阶段扩展——pei和dxe之间通过hob传递参数
传入的参数第一个为Hob的GUID,所有的UEFI元素都有自己的GUID,传入得到的返回结果就是HOBlist ,通过的是configration table去抓的(属于systemtable的成员),每个DXE Driver的entrypoint都有两个参数imaginehandle 和systemtable,故而可以通过systemtable可以访问整个系统的资源。在PEI和DXE之间通过HOB 传递参数。这里的既定顺序即Dependency顺序,就是inf文件里面的depx,只有满足条件才会执行。原创 2023-04-03 08:14:35 · 791 阅读 · 0 评论 -
UEFI启动过程与协议加载顺序
HOB在PEI到DXE传送信息的过程遵循one Producer to one Consumer的模式,即在PEI阶段,一个PEIM创建一个HOB,在DXE阶段,一个DXE Driver使用那个HOB并且把HOB相关的信息传送给其他的需要这些信息的DXE组件。其中一个队列存放当前已经满足依赖项,可以加载的驱动的指针,另一个则存放当前已经找到但还未满足加载条件的所有驱动的指针,调度器每循环一次都会完成第一个队列中一个驱动的加载,同时将第二个队列中的项目检查一遍,若已满足依赖项则移到第一个队列中。原创 2023-04-01 07:54:04 · 1238 阅读 · 1 评论 -
UEFI 基础教程 (十四) - 设置默认启动项为UEFI Shell
设置Shell为默认启动项后,BIOS启动会优先加载Shell(对于OVMD而言就不用等待前面的PXE、QEMU USB加载了, 可以节省时间)。当然如果需要设置其他的启动项为默认项,只需要修改BootOptionPriority 中 StrCmp (BootOption->Description, L"EFI Internal Shell")为 StrCmp (BootOption->Description, L"XXXX")。二、 编译生成EFI文件 & 运行。原创 2023-03-31 10:37:23 · 1512 阅读 · 1 评论 -
UEFI 基础教程 (三) - 运行第一个PEI Driver
一、 编写源代码编写C:\edkii\OvmfPkg\MyHelloWorldPEIMDriver\MyHelloWorldPEIMDriver.cEFI_STATUSEFIAPI编写C:\edkii\OvmfPkg\MyHelloWorldPEIMDriver\MyHelloWorldPEIMDriver.inf[Defines][Sources][Packages]BaseLibDebugLib。原创 2023-03-31 10:09:05 · 527 阅读 · 2 评论 -
SeaBIOS实现简单分析
当段寄存器被重新赋值的时候,就根据段选择子,从存储器中读取GDT中的项,然后将段基址以及其他的段描述符信息存储在这个段寄存器对应的段描述符高速缓冲寄存器中。笔者猜测这一一点的实现方式是通过段描述符高速缓冲寄存器实现的(实模式下也是通过查询这个寄存器来获得段基址的),开机的时候代码段的对应基址项被设置成0xFFFF0000。从代码的Read sector部分可以看出,boot_disk将读取使用bootdrv指定的磁盘驱动器上,0磁头,0柱面,1扇区为起始位置,扇区数为1(512字节)的一段数据。原创 2023-03-29 09:26:56 · 716 阅读 · 1 评论 -
【UEFI实战】HII之vfr文件
https://blog.csdn.net/jiangwei0512/article/details/122824342转载 2023-03-23 21:18:30 · 347 阅读 · 0 评论 -
UEFI--form之间的关系(驱动调用)
顶层AdvancedManager.c。原创 2023-03-22 22:29:42 · 120 阅读 · 0 评论 -
UEFI错误:Instance of library class [ShellCEntryLib] is not found
两处修改。原创 2023-03-22 21:07:28 · 887 阅读 · 0 评论 -
UEFI 基础教程 (十四) - Variable的使用
UEFI Varible 可以用作不同driver之间的通信, 是一种非常好的模块共享机制。Variable 的服务由BS,RT, SMM提供,在不同的phase应该使用对对应的服务。如在SMM handler下就应该使用。还可以通过Shell下的命令setvar,dmpstore ,来查看新建Variable的值。二、 编译生成EFI文件 & 运行 UEFI APP MyVariable.efi。PEI Phase 使用如下(注意PEI阶段没有setvariable 操作)原创 2023-03-20 22:47:29 · 867 阅读 · 1 评论 -
UEFI 基础教程 (十三) - VFR,HFR 简单使用 oneof btn
运行edksetup.bat && build -a X64 -p OvmfPkg\OvmfPkgX64.dsc -D DEBUG_ON_SERIAL_PORT -t VS2013x86编译整个OvmfPkg Package。添加字符串资源到 MdeModulePkg/Application/UiApp/FrontPageStrings.uni。在UEFI平台可以通过修改 VFR/HFR等相关文件来配置SETUP界面, 其中。UNI文件用来存放资源, C文件用作driver 用来动态更新配置值。原创 2023-03-20 22:43:34 · 857 阅读 · 0 评论 -
UEFI开发学习 - Variable Services
如果EFI_BOOT_SERVICES.ExitBootServices()已经被执行,没有设置EFI_VARIABLE_RUNTIME_ACCESS属性的变量将不可见,GetVariable()将会返回一个EFI_NOT_FOUND错误。有时是严重有限的容量。QueryVariableInfo()函数允许调用者获得关于可用于存储EFI变量的最大存储空间,可用于存储EFI变量的最大剩余存储空间的大小和每个EFI变量的最大空间,与指定的属性相关联。在DXE的运行过程中,会加载一个个的模块,来填满整个表。原创 2023-03-20 21:32:31 · 462 阅读 · 0 评论 -
【UEFI实战】HII之FrontPage
上述流程中最主要的是两个部分,”初始化Front Page“和”显示Front Page“,对应到两个函数InitializeFrontPage()和CallFrontPage(),它们可以连起来看,主要做的事情就是两个:一个是准备素材,这里的素材指的是uni文件、vfr文件等表示的HII数据;第三个参数是可选的,可以是NULL;对应的操作码可能是EFI_IFR_REF_OP、EFI_IFR_REF2_OP、EFI_IFR_REF3_OP和EFI_IFR_REF4_OP,这依赖于传入的参数值。原创 2023-03-18 16:57:35 · 764 阅读 · 1 评论 -
UEFI开发——调用一个自己编写的protocol
{0xee7ba45e, 0x9642, 0x4a97, {0x83, 0xc3, 0x30, 0xeb, 0xed, 0x3f, 0x9d, 0xd6}} //定义这个protocol的GUID。struct _EFI_COMPARE_PROTOCOL { //定义这个protocol的结构体,因为只实现比较大小,所以成员只有一个函数指针类型的成员。编写一个protocol并调用分三个部分,定义一个protocol,安装这个protocol,使用这个protocol。2.安装protocol。原创 2023-03-18 15:18:28 · 883 阅读 · 1 评论 -
UEFI开发学习6 - Protocol的创建
顾名思义,前者是只安装一个ProtocolInterface,后者可以安装一个或多个ProtocolInterface,此外,InstallMultipleProtocolInterfaces()比InstallProtocolInterface()执行更多的错误检查,因此规范建议使用InstallMultipleProtocolInterfaces()。Interface: 一个指向协议接口的指针。Handle: 指向要在上面安装新协议接口的句柄的指针,或者如果要分配新句柄,则指向NULL。原创 2023-03-18 11:08:25 · 823 阅读 · 1 评论 -
UEFI中的界面设计(一)
从底层来看,BDS也是这么做的,但它用了比较巧妙的方式——要知道,BIOS的主要功能是引导进GRUB(或者其他的),GRUB也是一个二进制文件。通过HII封装好的SetString可以修改UNI中对应TOKEN保存的内容,这样可以改变界面上显示的文字——所以我会用它显示固件信息,可以在初始化时调用函数获取,然后SetString,这样在引导进界面时,信息就会出现在屏幕上。这些都是这些交互类控件公用的,其他的根据自己的性质有不同,比如这里后面是oneof里面的选项,default说明这是默认选项。原创 2023-03-17 15:38:36 · 1032 阅读 · 1 评论 -
【UEFI实战】HII之常用函数---HiiAddPackages
QuestionId:其实是一个UINT16类型的数值,它是一个在当前驱动唯一的值,通过它回调函数(由EFI_HII_ACCESS_FORM_CALLBACK声明)就能够知道需要处理的数据具体是哪个;表示的是需要安装的资源。简单来说就是将资源(代码中用Package标识,这里将其翻译为资源似乎更好理解,它表示的可能是uni文件对应的字符串、vfr文件对应的Setup骨架、字体等等)安装HII数据库中,并返回数据库的Handle,后续要使用资源就要用到这个Handle。Position初始化为0。原创 2023-03-13 11:36:29 · 879 阅读 · 0 评论 -
【BIOS/UEFI】HII 基本框架及概述
一个 HII Handle 对应一个 Device Handle,通过 HII Handle 可以找到 Device Handle,相反的,通过 Device Hanlde 可以找到其对应的 Config Access Protocol。HII Database 是 HII 框架一个核心的公共模块,用于管理所有 HII 数据,包括 String、Forms、Keyboard、Images、Device Paths等。Font 通过点阵的方式显示,有宽字符和窄字符,汉字需要使用宽字符,英文使用窄字符。原创 2023-03-11 11:47:51 · 734 阅读 · 1 评论 -
UEFI实战--------HII之uni文件
uni文件HII的实现涉及到多种不同类型的文件,uni文件是其中最简单的一种,它用来存放各种语言的字符串以实现本地化。本节主要参考自《edk-ii-uni-specification.pdf》,后面简称为参考文档。原创 2023-03-11 11:45:29 · 1647 阅读 · 1 评论 -
UEFI开发探索101 – PCD探究(helloworld中的使用)
EFI System Table 里面有两个Services:Runtime Services和Boot Services,其中Runtime Services 是在UEFI 兼容系统上面几乎全时可用的Services,区别于Boot Services只能在EFI_BOOT_SERVICES.ExitBootServices()之前可用的特性。当然,根据平台或者其他原因的要求,也可以在后面用自己的instance去override VariableServiceInitialize里面的定义。原创 2023-03-09 15:52:19 · 525 阅读 · 1 评论 -
UEFI Common:UEFI 中的Runtime Services
EFI System Table 里面有两个Services:Runtime Services和Boot Services,其中Runtime Services 是在UEFI 兼容系统上面几乎全时可用的Services,区别于Boot Services只能在EFI_BOOT_SERVICES.ExitBootServices()之前可用的特性。当然,根据平台或者其他原因的要求,也可以在后面用自己的instance去override VariableServiceInitialize里面的定义。原创 2023-03-08 21:11:12 · 587 阅读 · 0 评论 -
UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件
Packages]#要链接的库UefiLib[Guids]#编译选项, = 表示选项附加到默认选项后面。== 表示仅使用所定义的选项,弃用默认选项。#MSFT:#MSFT:然后将 main.inf 添加到 Nt32Pkg.dsc 或UnixPkg.dsc 的[Components]部分, 例如添加下面一行(example目录在EDK2下)然后就可以使用BaseTools下的build进行编译了。Windows下执行Linux 执行。原创 2023-03-08 20:52:20 · 858 阅读 · 0 评论 -
UEFI启动流程
在RT阶段,OS Loader已经完全取得了系统的控制权,因此要清理和回收一些之前被UEFI占用的资源,runtime services随着操作系统的运行提供相应的运行时的服务,这个期间一旦出现错误和异常,将进入AL进行修复。在PEI阶段主要为DXE阶段准备执行环境,主要做CPU相关硬件初始化,最主要是对于内存的初始化,将DXE阶段需要的参数以HOB列表的形式进行封装,传递给DXE阶段。在BDS阶段,主要是初始化控制台设备,加载执行必要的设备驱动,根据用户的选择,执行相应的启动项。SEC阶段:(安全验证)原创 2023-03-08 20:45:45 · 777 阅读 · 0 评论 -
UEFI学习-Variable操作
【代码】UEFI学习-Variable操作。原创 2023-03-08 15:39:59 · 339 阅读 · 0 评论 -
UEFI学习——GetNextVariableName()
【代码】UEFI学习——GetNextVariableName()原创 2023-03-08 09:48:46 · 357 阅读 · 1 评论 -
UEFI 原理与编程 之 三种方式实现 HelloWorld
在工作区新建目录 infs/UefiMain添加文件: UefiMain.c, 内容如下:EFI_STATUSUefiMain (再添加一个文件: UefiMain.inf, 内容如下:[Defines][Sources]UefiMain.c[Packages]UefiLib[FixedPcd][PatchPcd]之后修改 Nt32Pkg\Nt32Pkg.dsc, 在 356 行添加一行之后编译, 运行模拟器。原创 2023-03-08 09:41:55 · 745 阅读 · 0 评论 -
UEFI学习——使用gRT->GetVariable读取Setup选项值
这里又有个近水楼台,在DriverSimple.c的SetVariable函数后面,有一个gBS->CreateEventEx(不了解的可以先去学习UEFI中的事件),我们可以在我们的.c文件中也创建一个gBS->CreateEventEx,将并且将这两个.c文件中的事件函数(即CreateEventEx的第三个参数)都挂在同一个Guid上。#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010 //写时需要验证身份。原创 2023-03-08 09:05:18 · 999 阅读 · 1 评论 -
UEFI开发与调试---edk2中的应用模块/库模块/驱动模块
应用模块应用模块包含标准应用程序模块,shell应用程序模块,以及main应用程序模块标准应用程序模块它是所有其他应用程序模块的基础,作为一个模块来说,同样由源文件和工程文件(.inf)组成。它的特征如下:(1) .inf中的ENTRY_POINT一般设置为UefiMain,这是一个约定俗称的名字,所以这个规则并不是一定的。(2) 指定的ENTRY_POINT入口函数必须要在模块源文件中有对应的实现。(3).inf中的MODULE_TYPE必须设置为UEFI_APPLICATION。原创 2023-03-08 08:47:40 · 618 阅读 · 1 评论