BIOS实战之PCI设备枚举二

2024-06-07 05:18
文章标签 实战 设备 枚举 pci bios

本文主要是介绍BIOS实战之PCI设备枚举二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上次说到了除了IO枚举PCI设备,还有另一种方式枚举PCI设备,那就是通过pciio,这也是UEFI代码中的常规操作(当然还有MMIO,不过不写了)

UEFI BIOS 提供了两个主要的模块来支持PCI 总线,一个是PCI Host Bridge 控制器驱动,另一个是PCI 总线驱动。

PCI Host Bridge 控制器驱动是跟特定的平台硬件绑定的,根据系统实际IO 空间和memory map, 为PCI设备指定I/O 空间和Memory 空间的范围,并且产生PCI Host Bridge Resource Allocation 协议(protocol)供PCI 总线驱动使用。该驱动还对HostBridge控制器下所有RootBridge 设备产生句柄(Handle), 该句柄上安装了PciRootBridgeProtocol。PCI 总线驱动则利用PciRootBridgeIo Protocol 枚举系统中所有PCI 设备,发现并获得PCI 设备的Option Rom, 并且调用PCI Host Bridge Resource Allocation protocol 分配PCI设备资源,PCI RootBridge设备又产生了PCI Local Bus。PCI 设备驱动不会使用PCI Root Bridge I/O protocol访问PCI 设备,而是会使用PCI总线驱动为PCI 设备产生的PCI IO Protocol 来访问PCI IO/MEMORY 空间和配置空间。

看完上面的话,咱们就开始直接进入主题:

EFI_STATUS
EFIAPI
ShellAppMain (IN UINTN Argc,IN CHAR16 **Argv)
{EFI_STATUS                  Status = EFI_SUCCESS;EFI_HANDLE                  *HandleBuffer;UINTN                       PciController_Count, Seg, BufferSize=0;UINTN                       NumHandles, i;EFI_PCI_IO_PROTOCOL         *PciIoProtocol;UINT8                       ListDevice = 0, SaveOpRom=0;UINT8                       IndexOfSavedDevice=0;PCI_CONTROLLER_INFO         PciController_Info[50];UINT32                      VenderDevId;CHAR16                      SaveFileName[100];       Print(L"===============================================\n");PciController_Count = 0;if(Argc >= 2){if(StrCmp(Argv[1], L"-L")==0){ListDevice = 1;}else if(StrCmp(Argv[1], L"-S")==0){if(Argc!=3){Status = EFI_INVALID_PARAMETER;Print(L"Please Specify Index of Device when save OpRom\n");goto ProcExit;}else{IndexOfSavedDevice = StrDecimalToUint64(Argv[2]);SaveOpRom = 1;}}}else{Print(L"Too few parameters\n");Status = EFI_INVALID_PARAMETER;goto ProcExit;    }Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiPciIoProtocolGuid, NULL, &NumHandles, &HandleBuffer);for(i=0; i< NumHandles; i++){Status = gBS->HandleProtocol(HandleBuffer[i], &gEfiPciIoProtocolGuid, (void**)&PciIoProtocol);if(!EFI_ERROR(Status)){if(PciIoProtocol->RomSize>0){VenderDevId = 0xFFFFFFFF;PciIoProtocol->Pci.Read(PciIoProtocol, EfiPciIoWidthFillUint32, 0, 1, &VenderDevId);Seg = 0;PciIoProtocol->GetLocation(PciIoProtocol,&Seg,&PciController_Info[PciController_Count].Bus,&PciController_Info[PciController_Count].Device,&PciController_Info[PciController_Count].Func);PciController_Info[PciController_Count].Handle =   HandleBuffer[i];PciController_Info[PciController_Count].PciIo = PciIoProtocol;PciController_Info[PciController_Count].VidDid = VenderDevId;PciController_Count +=1;    }}}if(ListDevice){Print(L"Controller With OpRom Number: %d \n",PciController_Count);for(i=0;i<PciController_Count;i++){Print(L"Controller ID: %d  VidDid: %08x  Bus: %x  Dev: %x Func: %x  Size: 0x%x\n",i,PciController_Info[i].VidDid ,PciController_Info[i].Bus,PciController_Info[i].Device,PciController_Info[i].Func,PciController_Info[i].PciIo->RomSize);}
....

代码贴出了一部分,不过已经足够了,完全可以通过上述的代码自己写一个app,代码非常好理解
 

这篇关于BIOS实战之PCI设备枚举二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038263

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d