UEFI
文章平均质量分 57
个人笔记
潇洒Anthony
日积硅步,以致千里。
展开
-
整理一些常用的代码示例
在使用时,首先使用EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL来初始化和配置PCI总线上的根桥,然后使用EFI_PCI_IO_PROTOCOL来与具体设备进行通信和控制。功能:EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL提供了访问PCI总线上的根桥所需的各种功能和方法,包括内存读写、I/O读写、配置空间读写等。EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL提供了用于访问配置空间的方法,可以用于获取和修改设备的配置信息。原创 2023-05-17 19:59:42 · 972 阅读 · 0 评论 -
UEFI 界面实例解析
如果不加判断,直接不可选,那么可以这么写 grayoutif TRUE;INTERACTIVE,意味人机交互,也就是可以动作的,通过这个key去进行操作,这种形式选中后按Enter就是执行操作,先理解三个函数,ExtractConfig,导出配置,RouteConfig,存储配置,CallBack,操作Hii数据。, C文件中保留重要的函数就行,仿照其他第三方驱动,这些驱动以Library形式在DSC文件中被包入,这样就新增了一个页面,在DeviceManager页面,还有一种驱动,这种是独立的驱动。原创 2023-05-15 00:11:32 · 2159 阅读 · 0 评论 -
DXE driver
前文说过,DXE阶段运行的驱动有两种类型,一种是符合UEFI驱动模型的,另一种就是不符合的普通DXE driver,普通的DXE driver一般在驱动运行的时候就直接完成了,符合UEFI驱动模型的需要先注册驱动,然后在BDS阶段通过调用系统服务来完成。在显卡的驱动模型中,已经说明了符合UEFI驱动模型的driver运行方式,这篇短文主要是记录一下driver是怎么加载运行的。对于符合UEFI驱动模型的,实现BootServices 的ConnectController接口,该函数将尝试连接一个或多原创 2022-02-16 10:11:38 · 1093 阅读 · 2 评论 -
UiApp的生命周期
当一台机器按某一个快捷键进setup界面的时候,如F2/F8/ESC,UiApp的生命周期就正式开始了。UiApp,顾名思义,它就是一个app,只不过,这是一个特殊的app,我们进入setup的界面就是这个app的具体表现原创 2022-02-11 14:20:54 · 1824 阅读 · 0 评论 -
UEFI原理与编程实践--EFI System Table中的输入输出
这一节UEFI原理与编程的书籍里面貌似没有提到,不过在我上次使用飞腾源代码增加功能的过程中发现logo界面的左上角有个光标,后来发现源代码也有,这就让有强迫症的人非常不爽啦,这个光标怎么来的呢,我找了几个地方,都不对,后来懒得找了,既然在logo出现前就有这个光标了,那我直接在logo显示前清屏不就ok了么,然后把这个问题顺利解决。输入输出在UEFI中使用非常广泛,随便举个栗子,大家经常使用的Print打印输出在屏幕上:UINTNInternalPrint ( IN CONST CHAR1原创 2022-01-13 15:06:59 · 1693 阅读 · 1 评论 -
UEFI原理与编程实践--添加标准C库
标准C库有个好处,那就是通用性,比如工作中,要做一个EC的更新工具,要求厂商给一份源代码,拿过来发现,他们是用的标准C写的,也是,不做UEFI的,谁会使用UEFI标准定义的函数去写他们自己的代码呢。那么问题来了,拿到这份代码应该怎么做,第一种,UEFI代码中加入C标准库,第二种,标准库中的函数使用UEFI标准中的函数进行替换,之前我添加C标准库,发现整个固件的size需要重新调整,也就是要重新调整FV的大小,因为针对FV,是做了一些功能的,不能随意调整,所以,只能用UEFI标准函数替换了。不过C标准原创 2022-01-13 13:10:57 · 683 阅读 · 1 评论 -
UEFI原理与编程实践---字体
在BIOS setup界面,通常有一个选项,那就是语言选择,EDKII源代码默认是没有中文支持的,所以,即使你在dsc文件中将gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLang的值设置为"zh-Hans",界面也不会有任何的反应。UEFI将资源组织在HII包中,新增新的字符串资源,我们需要在程序中通过HiiAddPackages注册字符串资源,然后通过字符串标识符使用对应的字符串。每一种语言都有自己的编码区间,通过编码匹配Unico原创 2022-01-13 11:37:46 · 888 阅读 · 0 评论 -
UEFI原理与编程实践--UEFI驱动模型之显卡(UEFI方向)驱动分析
拆开一台国产电脑,会发现,很多重要芯片,其实已经国产化了,CPU、GPU、电源管理芯片等等,刚做了一下GOP的笔记,回头想想,之前包入厂商的显卡驱动一直没怎么关注他们的运行逻辑是什么,那么,这篇文章就来探讨深入一下,这个显卡驱动是怎么做的国产显卡,属于前列的当属景嘉微显卡,那么这次就来分析一下JM7200的驱动是怎么做的。UEFI驱动模型驱动总的分为两种,一种是符合驱动模型的,一种就是不符合的了,UEFI驱动模型的核心是通过EFI Driver Binding Protocol管理驱动程序。.原创 2022-01-12 11:52:52 · 3572 阅读 · 0 评论 -
UEFI原理与编程实践--图像显示GRAPHICS_OUTPUT_PROTOCOL
GOP,也就是GRAPHICS_OUTPUT_PROTOCOL的简称,GOP包含三个成员函数和一个成员变量:Status = gBS->LocateProtocol ( &gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&GraphicsOutput );struct _EFI_GRAP原创 2022-01-12 10:24:21 · 2764 阅读 · 0 评论 -
EDK II 源码剖析---USB协议之EHCI(例子)二
上一节主要讲了USB主控制器驱动的一般流程,接下来主要讲一下USB 总线驱动和USB 设备驱动USB总线驱动同样的,从下面的函数开始说起:EFI_STATUSEFIAPIUsbBusControllerDriverStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingD原创 2022-01-06 10:34:49 · 3116 阅读 · 0 评论 -
EDK II 源码剖析---USB协议之EHCI(例子)一
基础1. OHCI(Open Host Controller Interface)是支持USB1.1的标准,但它不仅仅是针对USB,还支持其他的一些接口,比如它还支持Apple的火线(Firewire,IEEE 1394)接口。与UHCI相比,OHCI的硬件复杂,硬件做的事情更多,所以实现对应的软件驱动的任务,就相对较简单。主要用于非x86的USB,如扩展卡、嵌入式开发板的USB主控。2. UHCI(Universal Host Controller Interface),是Intel主导的对USB1.原创 2022-01-05 14:33:25 · 2309 阅读 · 0 评论 -
UEFI原理与编程实践--编译环境搭建
有一段时间没写了,主要是windows的环境搭建下班后一直没弄好,在编译的时候总是出现一个cl.exe的致命错误,百度了很多也没解决,索性我放弃了,直接搭建Linux编译环境得了。因为我用的是官网最新的edk(吐槽一下,edk里面有些文件都没有,被删掉了,不知道这个代码管理者是怎么管控的),所以不晓得到底是代码有问题呢还是搭建的环境有问题,我也不想去思考了,毕竟搭建Linux环境我觉得简单多了,还不占用C盘过多的空间,对于个人来说,简直完美。废话不多说,下面直接开始搭建。第一步:安装VMware原创 2021-12-06 13:20:07 · 991 阅读 · 1 评论 -
UEFI原理与编程实践--硬盘相关的Protocol:BlockIo/DiskIo/DiskInfo/PassThrough
硬盘是一种块设备,所以每个硬盘设备控制器都安装有一个BlockIo实例、一个BlockIo2实例,然后还安装了一个DiskIo实例、一个DiskIo2实例,这两者的区别就是BlockIo只能按块读写设备,而DiskIo可以从任意便宜出读写磁盘,并且可以读取任意字节数,BlockIo是EFI_BLOCK_IO_PROTOCOL的缩写,DiskIo是EFI_DISK_IO_PROTOCOL的缩写。虽然BlockIo和DiskIo极大的方便了我们操作磁盘,但是其功能十分有限,通过BlockIo和Dis...原创 2021-11-30 16:42:45 · 2238 阅读 · 0 评论 -
UEFI原理与编程实践--GUI之Setup界面分析一
formset &endformset表单集,Setup设置界面的一个页面,该页面内的内容都需要放在表单集内Example: formset guid = MAIN_FORM_SET_GUID, title = STRING_TOKEN(STR_MAIN), help = STRING_TOKEN(STR_MAIN_HELP), class = MAIN_FORM_SET_CLASS, subclass = 0,原创 2021-11-29 13:47:53 · 5509 阅读 · 1 评论 -
UEFI原理与编程实践--文件操作
文件操作主要挑一些重点的讲UEFI内置了EFI_SIMPLE_FILE_SYSTEM_PROTOCOL用于操作FAT文件系统,通过该protocol中的OpenVolume,我们就可以获得FAT文件系统上的根目录句柄,目录句柄(FEI_FILE_PROTOCOL)包含了操作该目录里文件的文件操作接口使用EFI_SIMPLE_FILE_SYSTEM_PROTOCOLEFI_STATUS Status;EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSy原创 2021-11-29 13:45:14 · 2124 阅读 · 2 评论 -
UEFI原理与编程实践--Device Path
系统中的每个设备都有一个唯一的路径。例如,每次进入shell时,都会打印出系统中的硬盘设备以及设备路径。针对硬盘和文件系统,将在BIOS学习实战中通过获取U盘路径,读取BIOS文件,然后进行更新的具体操作,本文主要说的是一些基础的内容原创 2021-11-29 13:43:55 · 1849 阅读 · 1 评论 -
UEFI原理与编程实践--事件的实际使用
看代码有一种现象,叫排斥性,就是我看一些新的代码,看个大概,感觉懂了,又感觉没懂,想动手实践呢又懒得去动,于是似懂非懂的搁置在那了在UEFI原理与编程的第6章中,主要讲到了有关事件的知识,那么什么是事件呢?UEFI不支持中断,而是用事件代替,既然是代替,那是不是和中断的作用效果一样呢?这个事件就跟水库泄洪原理一样,水位超过某个水位了,那么就必须泄洪,也就是说达到某个条件了,哎,这个事件就要run了。创建事件创建事件有两种方法,第一种:CreateEvent,第二种:CreateEv..原创 2021-11-25 15:33:13 · 877 阅读 · 0 评论 -
UEFI原理与编程实践--UEFI系统的启动过程
安全验证阶段,这个阶段,需要用Assembly做一些 C 无法处理的工作,C语言无法处理CPU的特殊寄存器。让CPU进入Protected Mode(Flat Mode)的环境,会使用到CPU内部的临时ram,其实也就是缓存,这个阶段主要还是使用的汇编,也就是说为后面的阶段建立一个C语言和硬件通信的编译环境,最后将控制权交给PEI Phase。原创 2021-11-24 14:59:36 · 3296 阅读 · 0 评论 -
UEFI原理与编程实践--FDF文件
实际书籍中并没有讲这一块的,不过这块还是挺重要的,因为很多人一看fdf文件就很懵,不知道细节的可以说完全看不懂,FDF文件是什么,说的直白一点,就是盖房子的设计图,fdf说编译器来,你给我输出一个这样层次的FD文件,这个FD文件就是大家经常烧录的BIOS固件。FD:固件设备,可以转化为BIN文件,熟悉的OVMF.FD就是典型代表FV:固件卷,说固件卷很难懂的话,直接说固件块总行吧,就是FD被切割成了一块一块的,这一块一块的就是固件卷目前先主要说FV吧,FD知道概念就行FV啥是FV啊,FV原创 2021-11-24 14:25:51 · 2472 阅读 · 0 评论 -
UEFI原理与编程实践--PCD的使用
PCD说白了就是个全局变量,就看你怎么去调用了,先看一下它的定义用法:然后再看一下通过编译后有AutoGen生成的一个定义:PCD的类型有很多种,但是经常使用的也就是静态PCD与动态PCD静态PCD(干货)顾名思义,就是一个静态全局变量,这种变量有个特点,一旦赋值了,是不能改动的,而且只能get不能set,这应该容易理解。典型代表:PcdsFixedAtBuild.common,这种需要说明一下,如果你在dec文件中定义了,然后又在dsc文件中定义,编译器只会选择dsc文件中..原创 2021-11-24 11:27:42 · 2868 阅读 · 1 评论 -
UEFI原理与编程实践--Variable的使用
基础知识在书中本章主要说明了系统表,启动服务,运行时服务。挑简单明了的:系统表(gST)的使用方法:SystemTable->BootServes指向系统的启动服务表,ConIn/ConOut启动服务(gBS),在上一节中protocol的安装与使用就使用了gBS,启动服务主要运用在事件管理,内存管理,protocol有关的服务,驱动管理服务,image管理服务,以及ExitBootServes。启动服务的生存周期在DxeMain到ExitBootServes期间。运行时服务(原创 2021-11-24 10:07:48 · 2031 阅读 · 0 评论 -
UEFI原理与编程实践--UEFI工程模块文件
标准应用程序工程模块该模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块,标准应用程序工程模块,UefiMain就是这个模块的入口函数EFI_STATUSEFIAPIUefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ){ UINT32 Index; Index = 0; // // Three PCD type (FeatureF原创 2021-11-23 17:01:00 · 1120 阅读 · 0 评论 -
UEFI原理与编程实践-PROTOCOL
搭建EDK编译环境由于家里头的电脑罢工,只能贴代码,实践的话可自行实践什么是protocol不想说的那么复杂,什么是protocol,它就是个结构体,只是这个结构体中的成员有的比较复杂而已,看一个:瞅一下,EFI_BLOCK_IO_PROTOCOL就是个结构体,看一下这一句:看我函数指针的笔记就能清楚理解,EFI_BLOCK_IO_PROTOCOL结构体中什么EFI_BLOCK_RESET/READ这些就是函数指针,它的函数第一参数必须是指向Protocol的指针,用来模拟...原创 2021-11-23 16:49:35 · 1950 阅读 · 4 评论