UEFI----EFI_DRIVER_BINDING_PROTOCOL
UEFI驱动模型的核心是通过EFI_DRIVER_BINDING_PROTOCOL管理驱动程序。UEFI驱动模型包含两个部分:Efi Driver Binding Protocol和驱动服务本身。
UEFI中所有符合UEFI Driver Model的驱动在模块的入口点,都会去安装EFI_DRIVER_BINDING_PROTOCOL;gBS->ConnectController()会去遍历系统中所有的EFI_DRIVER_BINDING_PROTOCOL,并调用其中的Support函数,来做判断,如果匹配成功,就接着调用Start函数来初始化硬件。而这个函数中就包含设备初始化所需要的代码。大概流程如下:
1. 当扫描的这个设备的时候(设备用Controller表示),先判断它是否安装了DevicePathProtocol,没有就表示这个设备还没有准备好(或者说不是设备),后面的xxxStart()不用执行;
2. 然后判断NetworkInterfaceIdentifierProtocol是否安装,这个是网卡驱动一定会装的Protocol,Snp驱动底层的操作需要依赖于它,所以一定要安装,如果没有就不会执行后面的操作;
3. 判断NetworkInterfaceIdentifierProtocol是否满足要求,如果不满足则不会执行xxxStart()函数。
如果以上条件都满足,就可以认为该设备是一个网卡,然后这个驱动就会被执行,而之前获取到的DevicePathProtocol和NetworkInterfaceIdentifierProtocol就会成为操作正确设备的基础。
当调用ConnectController的时候,代码首先会去执行EFI_DRIVER_BINDING_PROTOCOL中的XXXSupported函数,判断传入的Handle是否符合该Protocol执行的要求,如果符合就执行XXXStart函数,否则就直接退出;而DisconnectController会去执行Protocol中的XXXStop函数。
该类Protocol用在一种叫做UEFI Driver Model类型的驱动中,这种驱动在DXE阶段安装,但实际使用是在BDS阶段。
Supported函数用于检测一个设备是否支持该驱动。
Start用于将驱动安装到设备上并启动硬件设备。
Stop用于将驱动从设备上卸载并停止驱动。
这里的EFI_DRIVER_BINDING_PROTOCOL通常是不会通过HandleProtocol等函数去获取的,而是使用ConnectController、DisconnectController。
【UEFI实战】DXE驱动相关_jiangwei0512的博客-CSDN博客_dxe驱动
Eg: pci bus driver是什么? - 知乎
UEFI----EFI_DRIVER_BINDING_PROTOCOL相关推荐
- 【我所认知的BIOS】—gt; uEFI AHCI Driver(5) — 第一个protocol最终要開始安装了
[我所认知的BIOS]-> uEFI AHCI Driver(5) - 第一个protocol最终要開始安装了 LightSeed 4/28/2014 文章对EFI_DRIVER_BINDING ...
- UEFI Specification 第二章 概述
UEFI支持通过加载UEFI驱动和UEFI应用程序映象来扩展平台固件.当UEFI驱动程序和UEFI应用程序加载时,它们可以访问所有UEFI定义的运行时和引导服务. UEFI允许将OS加载程序和平台固件 ...
- 【UEFI基础】Protocol介绍
简要说明 Protocol是UEFI中的一个重要概念(事实上<UEFI SPEC>中有超过70%的内容都是在讲Protocol),下面简单说明下: 1. 首先,非常重要的一点,Protoc ...
- BIOS/UEFI基础——Protocol介绍
简要说明 Protocol是UEFI中的一个重要概念(事实上<UEFI SPEC>中有超过70%的内容都是在讲Protocol),下面简单说明下: 1. 首先,非常重要的一点,Protoc ...
- UEFI下的Gmac驱动实现
1.mac的分类: mac按照传输的速率可以分为 emac 和 gmac. mac: 它是一个controller,它的主要的作用有两个方面:帧发送: 接受来自协议层的数据,加上控制信息,然后以位数据 ...
- UEFI Console Splitter
之前在写UEFI程序的时候如果想在终端打印信息,或者接收用户输入的时候调用SystemTable下的ConIn/ConOut protocol就ok了. //向终端设备输出字符 Status = gS ...
- 【UEFI基础】EFI_HANDLE
EFI_HANDLE EFI_HANDLE其实就是一个指针: /// /// A collection of related interfaces. /// typedef VOID *EFI_HAN ...
- 【UEFI基础】UEFI网络框架之概述
概述 UEFI中的网络框架大致如下: 其中最底下部分并不在UEFI代码中,它实际上代表的是网卡的驱动.它提供的接口可以与SNP对接. 而SNP是UEFI下操作网络的基本接口. 另外关于安全启动部分,在 ...
- PCI Option ROM 在UEFI中加载流程
目录 一.UEFI Driver 是什么? 二.UEFI Driver 加载流程 1.EFI_DRIVER_BINDING_PROTOCOL 2. PCI扫描过程中是如何确定PCI设备是支持optio ...
- UEFI原理与编程实践--UEFI工程模块文件
标准应用程序工程模块 该模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块,标准应用程序工程模块,UefiMain就是这个模块的入口函数 EFI_STATUS EFIAPI U ...
最新文章
- VSEARCH操作实战-免费使用无内存限制的USEARCH!
- python模块 init py_Python模块包中__init__.py文件的作用
- mysql函数及解析,Mysql研究之MySQL常用内置函数完全解析
- ts watch路由 参数变化_vue watch 监听路由变化
- kali字典_kali黑客系统wpscan工具扫描wordpress漏洞入侵攻击测试教程
- Java学习之斐波那契数列实现
- CodeForces - 540D Bad Luck Island —— 求概率
- 【CF 600E】Lomsat gelral(树上启发式合并, dsu on tree, 静态链分治,模板题)
- ftp用的是tcp还是udp_TCP与UDP的区别究竟在哪
- Windows Server 2008通过计划任务定时执行bat文件
- python学习多久可以就业_南昌多长时间能学会python(Python能去从事的工作)
- Case when的用法
- 全球气象数据网站(大气、海洋数据应有尽有)
- Java项目源码下载S2SH基于java的保险业务管理系统
- 路由器与交换机的作用及区别
- linux samba文件共享,网络凭据总是出错解决方法
- 写给Krpano小白们的最最最入门级教程(一)
- 读 TiDB: A Raft-based HTAP Database
- 一、创建线程的三种方式
- VS用SSIS实现SQL Server数据库与Excel表格数据的相互导入