windows驱动开发-PCI讨论(一)

news2024/12/24 2:57:35

前面描述中断的时候,我们曾经多次体积PCI,甚至提供了一些PCI的相关知识,但是整个PCI是一个很大的体系,专门记录这个体系超出了这个系列的范畴,有兴趣的可以到PCI官网了解详细的情况。

但是还是会花费一些时间讨论PCI技术,接下来我们从WDM的角度讨论PCI协议。

先正式的介绍一下PCIe:
PCI Express (PCIe) 是一种 I/O 总线技术,旨在 PCI、PCI-X 和加速图形端口 (AGP) 取代外围组件互连。 通过提供高级功能和增加的带宽,PCIe 解决了 PCI、PCI-X 和 AGP 的许多缺点。 PCIe 保留了与 PCI 本地总线规范 2.3 的完整软件兼容性,并将 PCI 和 PCI-X 的并行多滴总线体系结构替换为串行的点到点连接总线体系结构。

两个 PCIe 设备通过一个链路连接,每个链路由一个或多个通道组成。 每条车道由两个低电压、差分信号对组成,可向相反方向传送 2.5 Gbps 的流量。 一对用于传输,另一对用于接收。 若要进一步增加链路的带宽,可以在两个 PCIe 设备之间) (x1、x2、x4、x8、x12、x16 或 x32 通道并行放置多个通道,以聚合每个通道的带宽。

PCIe 硬件与 Microsoft Windows 2000 和 Microsoft Windows XP 操作系统上的 PCI 软件向后兼容。 高级 PCIe 功能仅在 Windows Vista 和更高版本的 Windows 中受本机支持。

设备驱动程序和 PCI 电源管理

通常,设备驱动程序的责任如下:

总线驱动程序:总线驱动程序负责枚举、配置和控制设备。 对于 PCI-PM,PCI 驱动程序负责读取 PCI-PM 寄存器以确定硬件的功能。 当 POWER IRP 请求电源状态更改时,PCI 驱动程序会写入 PCI 电源管理寄存器,以将硬件设置为不同的 Dx 状态。

当设备启用唤醒时,PCI 驱动程序会写入 PCI-PM 寄存器,使设备能够触发 PME 。 最后,当 ACPI 确定 PCI 总线正在唤醒系统时,PCI 驱动程序会扫描 PCI 配置空间,查找哪个设备正在断言 PME,在该设备中禁用 PME,并通知驱动程序该设备。

设备驱动程序:设备的特定驱动程序负责保存和还原设备上下文,以及以设备策略所有者的身份请求电源状态更改。 当设备驱动程序收到要求更改较低设备电源状态的 POWER IRP 时,设备驱动程序负责保存以后打开设备所需的任何专有设备上下文。 在某些情况下,可能没有任何可保存内容。

PCI-PM 寄存器严格是 PCI 驱动程序的域 -- IHV 的设备驱动程序不需要访问这些寄存器中的任何一个,这样做会导致系统无法可靠地工作, 设备驱动程序的责任是仅执行专有操作。

看上面的信息会感觉非常吃力,我们可以看看实际的配置,实际上,有两个配置,分别是PMC和PMCSR寄存器:

当然上面的表述也确实没有错,PMC是一个只读寄存器, PMCSR则是可以配置的

注意: 我们只需要关注这个寄存器三个设置项即可:


15-PME状态
触发函数独立于PME_En位的状态来断言PME#信号的能力。注意:当辅助电源可用时,消耗辅助电源的设备功能必须保留此粘性寄存器的值。在这种功能中,此寄存器值不会被常规复位或FLR修改。
预定义值:
0b:没有效果。
1b:该字段将被清除,功能将s8-PME启用(RW)


8-触发函数断言PME:注意:当辅助电源可用时,消耗辅助电源的设备功能必须保留此粘性寄存器的值。在这种功能中,此寄存器值不会被常规复位或FLR修改。


预定义值:
0b:断言已禁用
1b:断言是在断言PME#信号之前启用的(如果启用)。


0~1:电源状态该2位字段既用于确定函数的当前功率状态,也用于将函数设置为新的功率状态。字段值的定义如下所示。如果软件试图将不受支持的可选状态写入该字段,则写入操作必须在总线上正常完成;然而,数据被丢弃并且不发生状态改变。


预定义值:
00b:D0
01b:D1
10b:D2
11b:D3hot

集成 ACPI 和 PCI PM

某些设备(尤其是便携式中的主板视频设备)可能需要 PCI 电源管理和 ACPI 源语言汇编程序 (ASL) 才能完全为设备供电。 PCI 电源管理寄存器将控制设备的内部状态,例如内部时钟和电源平面。 ASL 将控制外部状态,如外部时钟和电源平面,或者对于视频控制器,ASL 将控制视频背光。 请注意,ASL 和 PCI-PM 只能在主板设备上组合使用。

OnNow 体系结构是一种分层体系结构,可以自然地处理设备驱动程序、PCI 驱动程序和 ACPI 驱动程序 ( ASL) 集成。 以下方案显示了调用驱动程序以处理这些设备的顺序。

注意: 要使上述方案正常工作,WDM 驱动程序必须按照当前版本的 Microsoft Windows DDK 中所述正确转发 POWER IRP。

方案 1:关闭设备

  • 设备驱动程序:保存专有设备状态;
  • PCI 驱动程序:保存即插即用配置,禁用设备 (中断和 BAR) ,并使用 PCI-PM 寄存器将设备置于 D3 中;
  • ACPI 驱动程序:运行 ASL 代码 (_PS3 和 _OFF) 以便不再使用电源资源来控制芯片外部的状态;

方案 2:PCI 电源管理和设备驱动程序

  • ACPI 驱动程序:运行 ASL 代码 (_PS0 并_ON任何 OnNow 所需的电源资源) ,控制芯片外部的状态;
  • PCI 驱动程序:使用 PCI-PM 寄存器将设备置于 D0 中,并还原即插即用配置 (中断和 BAR) 这些可能与设备以前不同;
  • 设备驱动程序:还原设备中的专有上下文;

方案 3:启用唤醒

  • 设备驱动程序:在芯片中设置专有寄存器以启用唤醒。 例如,在模式匹配网络唤醒中,这是将模式编程到适配器中的时间;
  • PCI 驱动程序:设置 PCI PM 寄存器中的唤醒启用位,以允许设备断言 PME;
  • ACPI 驱动程序:在与 PME 关联的芯片集中启用 GPE,如根 PCI 总线下列出的 _PRW 对象所述;

方案 4:唤醒

  • ACPI 驱动程序:唤醒并扫描 GPE 状态位以查找唤醒事件,禁用设置 GPE 状态位的 GPE,并运行与设置的 GPE 位关联的任何_Lxx或_Exx方法。 为了响应 PCI 总线上的唤醒通知,ACPI 驱动程序将完成 PCI 驱动程序的WAIT_WAKE IRP,以通知 PCI 驱动程序正在唤醒系统;
  • PCI 驱动程序:扫描配置空间,查找具有设置 PME 状态位的任何设备。 对于每个设备,它会禁用 PME 并完成该设备的WAIT_WAKE IRP,以通知驱动程序它正在断言唤醒。 当 PCI 驱动程序通过所有 PCI 设备完成未找到任何断言 PME 且 PME 停止断言时,它将停止扫描唤醒设备;
  • 设备驱动程序:请求将设备放入 D0 (请参阅方案 2) 并在芯片中设置处理唤醒事件所需的任何专有寄存器;
访问 PCI 设备配置空间

外围组件互连PCI设备上的某些操作保留给设备的功能驱动程序。 例如,此类操作包括访问总线的设备特定配置空间,以及DMA控制器对直接内存访问进行编程。 Microsoft 通过两种方法为访问 PCI 设备的配置空间提供系统支持:

  • BUS_INTERFACE_STANDARD总线接口
  • 配置 I/O 请求数据包 (IRP) 、 IRP_MN_READ_CONFIG 和 IRP_MN_WRITE_CONFIG

从 Windows 10 版本 2004 开始,如果设备具有安全设备 (SDEV) ACPI 表且启用了基于虚拟化的安全性,则会对不受支持的 PCI 设备配置空间访问方法施加限制。 如果驱动程序或进程尝试使用上面未列出的方法读取或操作 PCI 设备配置空间,则访问将被阻止,并导致系统 bug 检查。

根据 PCI 本地总线 规范的定义,Windows XP 和 Windows Server 2003 及更高版本的操作系统对配置空间标头以及功能链接列表中的所有功能具有独占控制权。 驱动程序不得尝试修改这些寄存器。

但是,驱动程序可以使用 IRP_MN_WRITE_CONFIG 请求或 BUS_INTERFACE_STANDARD 的 SetBusData 方法写入不属于供应商定义的标头或功能列表的配置空间。 驱动程序还可以使用 BUS_INTERFACE_STANDARD 的 IRP_MN_READ_CONFIG 请求或 GetBusData 方法读取设备的功能。 若要使用IRP_MN_READ_CONFIG或IRP_MN_WRITE_CONFIG,驱动程序必须在PASSIVE_LEVEL运行。 

驱动程序可以从扩展 PCI 设备配置空间读取,即使用 IRP_MN_READ_CONFIG 请求或 getBusData BUS_INTERFACE_STANDARD 方法超过 256 字节的配置数据。 同样,驱动程序可以使用 IRP_MN_WRITE_CONFIG 请求或 BUS_INTERFACE_STANDARD 的 SetBusData 方法写入扩展的 PCI 设备配置空间。 如果设备没有扩展配置空间,或者平台未定义设备上扩展配置空间的路径,则读取请求将返回0xFFFF,写入请求将不起作用。 若要确定操作是否成功,驱动程序可以检查读取或写入的字节数。

PCI Express 和 PCI-X 模式 2 支持大于 256 字节的扩展 PCI 设备配置空间。 驱动程序可以读取和写入此配置空间,但只能使用适当的硬件和 BIOS 支持。 在 ACPI BIOS 中,根总线的 PNP ID 必须为 PNP0A08 或 PNP0A03。 对于 PNP ID 为 PNP0A03 的根总线,具有函数 4 的 _DSM 方法应指示当前模式为 PCI-X 模式 2。 所有网桥和设备都应为 PCI express 或在 PCI-X 模式 2 中运行。

此外,系统应支持内存映射配置空间访问。 这是通过在系统 BIOS/固件中定义 MCFG 表。 Windows Vista 和 Windows Server 2008 及更高版本的操作系统自动支持内存映射配置空间访问。

HalGetBusDataByOffset 和 HalSetBusDataByOffset 是为向后兼容而提供的,但仅当无法使用上述两种方法时才应使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI办公自动化:用kimi批量把word转换成txt文本

在Kimichat中输入提示词: 你是一个Python编程专家,要完成一个Python脚本编写的任务,具体步骤如下: 打开文件夹:F:\aword 读取里面docx格式的word文档, 提取word文档中的第一行文字作为txt文本文档的标题…

写后端项目时上传文件接口使用阿里云oss-规范写法

文章目录 开通对象存储服务密钥管理点击头像点击密钥管理创建新密钥AccessKey 写在yml配置文件中相关配置1.pom依赖2.全局配置类3.AliOssUtil 工具类3.AliOssProperties类,用于读取yml文件中写入的密钥4.controller层,用于写传输文件的接口 开通对象存储…

线程同步--互斥锁,读写锁

线程同步 基本概念 线程的能力在于能够方便地通过全局变量或共享内存来交换信息,但这也带来了并发控制的复杂性,主要表现在如何安全地管理多个线程对共享资源的访问。这里涉及到几个关键的概念和技术: 临界区(Critical Section…

【C语言】指针(二)

目录 一、传值调用和传址调用 二、数组名的理解 三、通过指针访问数组 四、一维数组传参的本质 五、指针数组 六、指针数组模拟实现二维数组 一、传值调用和传址调用 指针可以用在哪里呢&#xff1f;我们看下面一段代码&#xff1a; #include <stdio.h>void Swap(i…

【Week Y9】yolo-v8网络结构的主要模块学习

文章目录 一、...\ultralytics-main\ultralytics\nn\modules\conv.py&#xff1a;&#xff08;1&#xff09;__all__说明&#xff1a;&#xff08;2&#xff09;autopad()说明&#xff1a;&#xff08;3&#xff09;conv()说明&#xff1a;&#xff08;4&#xff09;Focus()说明…

ue引擎游戏开发笔记(40)——行为树的建立:丰富ai行动

1.需求分析&#xff1a; 敌人的ai行为随着开发的不断更新&#xff0c;会不断增加&#xff0c;如果每次都进入c中编写会很不方便&#xff0c;也无法凸显ue引擎中行为树的优势作用&#xff0c;因此有必要将敌人的ai行为&#xff0c;全部转到行为树中实现。 2.操作实现&#xff1…

R实验 基础(二)

实验目的&#xff1a; 掌握向量的几种类型&#xff1a;数值向量、逻辑向量、字符向量、复数向量&#xff1b;掌握生成向量几个的函数使用和向量的下标运算&#xff1b;掌握因子的定义和相关函数的使用。 实验内容&#xff1a; R语言中&#xff0c;数值向量用得非常多。生成数…

深入解析Wireshark1:从捕获到分析,一网打尽数据包之旅

目录 1 认识 Wireshark 1.1 选择网卡界面 1.2 捕获数据包界面 1.3 常用按钮功能介绍 1.4 数据包列表信息 1.5 数据包详细信息 2 数据包案例分析 Frame: 物理层的数据帧概况 Ethernet II: 数据链路层以太网帧头部信息 Internet Protocol Version 4 (IPv4): 互联网层IP…

【Python】图形用户界面设计

1、设计并编写一个窗口程序,该窗口只有一个按钮,当用户单击时可在后台输出hello world. import tkinter as tk def on_button_click():print("hello world") # 创建主窗口 root tk.Tk() root.title("Hello World Button") # 设置窗口大小 root.geometry…

2005-2022年全国及各省绿色信贷水平测算数据(含原始数据+计算过程+计算结果)

2005-2022年全国及各省绿色信贷水平测算数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;工业统计年鉴、统计年鉴、其中2017年采用插值法填补 3、范围&#xff1a;31省 4、方法说明&#xff1a;选取各省六大高…

每日一题13:Pandas:方法链

一、每日一题 &#xff1b;&#xff1a;&#xff1a; 解答&#xff1a; import pandas as pddef findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:heavy_animals animals[animals[weight] > 100].sort_values(byweight, ascendingFalse)result heavy_anim…

代码随想录--链表--反转链表

题目 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 如果再定义一个新的链表&#xff0c;实现链表元素的反转&#xff0c;其实这是对内存空间的浪费。 其实只需要改变链表的next指针的…

Java项目:基于ssm框架实现的家政服务网站管理系统分前后台(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的家政服务网站管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 二、技术实现 jdk版本&#xff1a;1.…

Qt+C++串口调试工具

程序示例精选 QtC串口调试工具 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《QtC串口调试工具》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。 …

JWT生成token工具类实现

JWT简介 JWT定义 JWT全称为Json web token&#xff0c;也就是 Json 格式的 web token JWT数据结构 1.JWT由三段字符串组成&#xff0c;中间用.分隔 Project_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzE2MzcwMTM0LCJpYXQiOjE3MTU3NjUzMzQsImp0aSI6IjllO…

关于DOCKER启动后如何添加新的端口映射

前段时间在用docker部署服务的时候发现&#xff0c;容器已经启动&#xff0c;但是需要新的端口映射&#xff08;即容器在启动的时候只进行了部分的端口映射&#xff09;&#xff0c;经过查询资料后发现现在网上有2种方法&#xff0c;一中是修改json文件。另一种是将已经运行的容…

QT:QML中读取文件(QDesktopServices和QFile)

目录 一.介绍 二.QDesktopServices: 1.添加头文件 2.声明函数 3.操作 4.注册 5.qml调用 三.QFile&#xff1a; 1.添加头文件 2.声明函数 3.读取指定文件名的文件内容 4.注册 5.qml中调用 四.效果展示&#xff1a; 1.QDesktopServices&#xff1a;上方按钮点击打开…

纯血鸿蒙APP实战开发——Web获取相机拍照图片案例

介绍 本示例介绍如何在HTML页面中拉起原生相机进行拍照&#xff0c;并获取返回的图片。 效果预览图 使用说明 点击HTML页面中的选择文件按钮&#xff0c;拉起原生相机进行拍照。完成拍照后&#xff0c;将图片在HTML的img标签中显示。 实现思路 添加Web组件&#xff0c;设置…

一看就会的AOP事务

文章目录 AOPAOP简介AOP简介和作用AOP的应用场景为什么要学习AOP AOP入门案例思路分析代码实现AOP中的核心概念 AOP工作流程AOP工作流程AOP核心概念在测试类中验证代理对象 AOP切入点表达式语法格式通配符书写技巧 AOP通知类型AOP通知分类AOP通知详解 AOP案例案例-测量业务层接…

太极图形学——高级数据结构——稠密

太极是一个面向数据的编程语言 在并行计算的框架下&#xff0c;在计算上花费的时间反而是少数&#xff0c;大量的时间都花在了数据获取&#xff08;也就是访问内存&#xff09;上面&#xff0c;这一点在之前的games103课程上也有简单的提及 cpu的计算能力非常强大&#xff0c…