UEFI的UEFI Driver

什么是UEFI Driver

 UEFI Driver是一种特殊类型的驱动程序,用于在计算机启动时加载和初始化硬件设备的软件组件,如显卡、网卡、声卡等。而Driver 是用于控制硬件设备的软件程序,它可以在操作系统中运行,并与操作系统进行交互,以便与硬件设备通信。简单来说,UEFI driver是在计算机启动时加载的,而Driver则是在操作系统中加载的。

UEFI Driver Model

 UEFI Driver的引入,更好的实现了模块化,模块化可以理解为这些UEFI Driver就是用来管理设备的,如果说Driver用来管理显卡,那么显卡的厂商就可以独立撰写一个UEFI Driver,这个Driver可以运行在所有的UEFI环境下面,而不必根据不同的环境进行调整。

 所以对于UEFI Driver的模块化,可以做bindary形式的发布,可以build in 到option rom里面去,对外的入口是非常清晰的。这就是为什么说UEFI Driver把整个firmware扩展了,提高了固件整体的扩展性,可能说之前的固件只能跑跑Application,现在还可以加载很多的Driver,第三方写的一些Device Driver,可能不需要build in到flash上,可以在shell阶段重新加载或在BDS阶段加载。

对于跨平台性,同样一个Driver按照二进制形式进行发布后,就可以在所有follow UEFI规范的平台跑起来,这样的方式大家可以并行开发,平台开发和设备开发分别进行,加快进程,最后协同到一起。(它的优势)

UEFI Driver的分类

在这里插入图片描述
UEFI Drivers可分为两大类:UEFI Driver Model Driver和UEFI Non Driver Model Driver.

Non Model Driver
1、对访问硬件没有要求
2、对是否提供Service没有要求
3、符合EFI Driver规范即可,比较随意

Driver Model Driver(有协议)
1、不直接硬件操作
2、不提供任何Services
3、支持加载卸载,符合Driver Binding Protocol规范


1>. Service Drivers

这种Driver会在一个或多个Service Handle上加载一个或多个Protocol,并在它的Entry Point里会返回EFI_SUCCESS。

2>. Initializing Drivers

这种Driver不会产生任何Handle,也不会增加任何Protocol到Handle Database,它只会进行一些初始化操作,并且返回错误代码。所以这种Driver执行完就会从系统内存中卸载。

3>. Root Bridge Drivers

这种Driver会产生一个或多个Control Handle,而且包含一个Device Path Protocol和一个对芯片跟总线提供的I/O资源软件方式抽象出来的Protocol。最常见的是为PCI Root Bridge产生handles的一个Driver,并且产生的Handle上面支持Device Path Protocol和PCI Root Bridge I/O Protocol.

4>. UEFI Driver Model Drivers

a. Bus Drivers

这种Driver会在Handle Database中产生一个或多个Driver Handle或Driver Image handle,并在Handle上安装一个或多个Driver Binding Protocol的实例。这种Driver在调用Driver Binding Protocol的Start()函数时会产生新的Child Handles,而且会在新的Child Handles上增加另外的I/O Protocol。

b. Device Drivers

与Bus Drivers的区别是不会产生新的Child Handles,只会在现有的Child Handle上增加另外的I/O Protocol。

c. Hybrid Drivers

同时具有Bus Drivers和Device Drivers的特征,既会在现有的Handle上增加I/O Protocol,也会产生新的Child Handles。

UEFI Driver的定义

在这里插入图片描述

 在DXE phase加载,加载的时候会去执行UEFI的entry point,执行完以后会去做driver的初始化,install这个driver的protocol,如果是UEFI Driver 那么install的就是Driver binding Protocol和component name Protocol,这样就算是执行完了所有的Driver初始化,entry point就退出了,退出再把控制权返回给UEFI Loader。

 Application是到上面的阶段就结束了,什么痕迹都不存在了,但是对于UEFI Driver来说还没有结束,它的Protocol都已经install完了,这些Protocol都已经在Handle database里面,整个UEFI系统已经开始管理了,虽然entry point已经执行完了,但是protocol还在,仍能被其他模块使用,所以Driver是一直常驻在内存中的,直到控制权由BIOS通过exitbootservice移交到OS Loader,才会被全部释放。或者在存在过程中人为将某个模块的Driver卸载掉。

在这里插入图片描述
 Handle Database 用于Protocol的管理,假设某UEFI Driver拥有两个protocol,分别有两个不同的名字,提供不同的Service,那么在entrypoint里面就会installprotocol ,install到handle database里面去,这个Protocol还有可能depend到其他的已经install好的Protocol,并不见得这个Protocol体现的就是从头到尾完整的实现,之所以将BIOS启动系统模块化,目的就是通过模块之间的配合加载完成启动。几乎DXE阶段所有的Driver都会调用protocol。上图表示的是,UEFI Driver在加载的时候depend到handle database里面已加载好的Protocol,随后成功install后又会被其他protocol调用,最终管理Device。
————————————————

UEFI Driver Binding Protocol

 UEFI Driver Binding Protocol是UEFI规范中的一部分,它用于在UEFI框架中匹配到Device Handle后,触发Start()接口将对应的IO Protocol协议绑定到Device Handle上。
 install Driver Binding Protocol,是UEFI spec定义好的Protocol,里面包含三个API:Supported()、Start()、Stop()。
————————————————
Supported():Check DeviceID 和Vendor ID 来辨别某个Device是否由这个Driver管理,如果是则会启动UEFI的Start(),轮询执行很多次,会影响资源占用和启动时间所以除了check并没有其他安排。

Start():由Supported()确定后被启动,在硬件的controller上install一些子的handle,然后在handle上安装一些所提供的服务(Protocol)和Device path,以供给其他人使用。

Stop():通常情况下不会去调用,因为同样花费时间和空间,但从UEFI架构考虑到在某种情况下,设备不需要再使用时,想要释放Driver,调用Stop()后会将所有install的Protocol进行uninstall,这个设备就不会再被管理同时allocate的资源也会被free。但是,Driver以及安装好的Driver Binding Protocol还在,下次仍然可以重新管理使用。

提示:BDS阶段有时会通过connect/Disconnect serverce来调用设备(Supported/Start/Stop),虽然设备再DXE阶段已经存在或已Load准备好了
在这里插入图片描述

以ScsiDisk驱动为例,当ScsiDisk驱动被加载时,它会首先去安装一个BLOCK_IO_PROTOCOL和另外一个SCSI_DRIVER_BINDING_PROTOCOL。当系统在UEFI框架中匹配到这个ScsiDisk驱动时,就会去调用这个SCSI_DRIVER_BINDING_PROTOCOL的Support函数。如果这个驱动符合要求,就会执行Start函数,并将这个驱动和这个设备的BlockIO协议绑定在一起,这样就可以在应用或服务中使用这个设备的BlockIoProtocol的接口来读写这个设备了。

DiskIoDxe Driver 实例

链接: UEFI_DRIVER

### UEFI概述 UEFI(Unified Extensible Firmware Interface),即统一可扩展固件接口,是一种替代传统BIOS的新一代固件标准。它的设计目标是提供一种更加灵活、高效和安全的方式来管理和控制计算机硬件与操作系统之间的交互过程[^1]。 UEFI的主要功能包括但不限于以下几个方面: - **硬件初始化**:负责在系统启动过程中完成必要的硬件检测和初始化工作。 - **引导加载程序的选择和支持**:通过查找特定路径下的`.efi`文件来决定操作系统的启动顺序。 - **安全性增强**:支持Secure Boot等功能,能够有效防止恶意软件篡改系统核心组件[^2]。 --- ### 配置UEFI的方法 要正确配置UEFI环境以实现最佳性能及兼容性,通常需要进入主板设置界面调整若干参数: #### 进入UEFI设置界面 大多数现代PC允许用户按下指定按键(如F2、Del键或其他组合键)快速访问UEFI Setup Utility,在这里可以修改各种高级选项。 #### 基本配置项说明 - **Boot Mode**: 切换Legacy Support状态至关闭模式仅保留纯正的UEFI boot path;这一步骤对于确保完全利用UEFI特性至关重要[^3]。 - **Secure Boot State**: 开启此功能有助于验证所有执行代码的真实性并阻止未签名镜像运行。 - **File System Compatibility**: 如果计划安装某些特殊版本Linux发行版,则可能还需要确认是否启用额外的支持服务比如XHCI Pre-Enumeration等。 以下是具体的操作指南示例代码片段用于展示如何编程化地查询当前平台所处的状态以及切换到推荐的安全引导形式之一——Microsoft Windows认证链路下运作: ```powershell # PowerShell脚本检查当前系统的引导模式 $firmwareType = (Get-CimInstance Win32_ComputerSystem).PCSystemType if ($firmwareType -eq 2){ Write-Host "The system is currently running under UEFI mode." } else { Write-Warning "This script requires the computer to be booted into UEFI mode!" } # 设置 Secure Boot 参数 Set-Variable -Name 'secureboot' -Value $true -Scope Global ``` 上述PowerShell命令可以帮助管理员轻松识别设备目前采用的是哪种类型的引导机制,并且提供了简单的手段去激活或者停用Secure Boot技术。 --- ### UEFI引导原理详解 当一台基于UEFI架构构建起来的个人计算装置通电之后,整个引导流程大致遵循如下几个阶段展开: 1. **POST Phase**: Power-On Self Test完成后立即转入下一环节之前先经历一次初步检验周期用来评估基本外围连接状况良好与否。 2. **Driver Initialization Sequence**: 加载驱动程序以便后续步骤得以顺利实施,期间会涉及到众多芯片组特性的适配处理作业。 3. **Locating OS Loader Image**: 寻找存储介质上的合法EFI应用程序实例作为下一步动作依据所在位置通常是专门划分出来的ESP区域内部署好的相应目录结构之下. 4. **Handoff Control To Operating Systems**: 将主导权正式移交给已选定的目标操作系统继续接管剩余部分直至最终呈现完整的图形桌面给终端使用者看到为止. 值得注意的地方在于每一个单独构成要素之间都存在着紧密联系相互依赖关系从而构成了一个完整有序的整体链条效应现象发生作用当中. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值