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

前面描述中断的时候,我们曾经多次体积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.mzph.cn/diannao/13169.shtml

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

相关文章

Pytorch入门实战 P10-使用pytorch实现车牌识别

目录 前言 一、MyDataset文件 二、完整代码: 三、结果展示: 四、添加accuracy值 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 本周的学习内容是&#xff0…

国网698.45报文解析工具

本文分享一个698.45协议的报文解析工具,此报文解析工具功能强大,可以解析多种国网数据协议。 下载链接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取码: y1de 主要界面如下: 本工具内置698.45数据协议, 即可调用word…

win编写bat脚本启动java服务

新建txt,编写,前台启动,出现cmd黑窗口 echo off start java -jar zhoao1.jar start java -jar zhoao2.jar pause完成后,重命名.bat 1、后台启动,不出现cmd黑窗口,app是窗口名称 echo off start "名…

美团小程序mtgsig1.2逆向

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章未…

VMware虚拟机没有网,无法设置网络为桥接状态

今天需要使用Ubuntu18但现有虚拟机是Ubuntu20,由于硬盘空间不够大,所以删除了原来的虚拟机并重新搭建Ubuntu18的环境,然后发现虚拟机没有网络,而我之前的虚拟机这一切都是正常的。 在网络设置里勾选的是桥接模式但无法联网&#x…

Cow Exhibition G的来龙去脉

[USACO03FALL] Cow Exhibition G - 洛谷 曲折经过 爆搜 一开始没什么好的想法&#xff0c;就针对每头奶牛去or不去进行了爆搜。 #include <cstdio> #include <algorithm> using namespace std;#define maxn 405 int iq[maxn], eq[maxn]; int ans; int n;void d…

留学资讯 | 2024英国学生签证申请需要满足哪些条件?

英国移民局于2020年9月10日发布了《移民规则变更声明: HC 707》&#xff0c;对学生签证制度进行了全面改革。该法案于2020年10月5日正式生效。根据此法案&#xff0c;新的学生签证——The Student and Child Student Routes学生和儿童学生路线&#xff0c;将替代原先的Tier 4学…

短视频赛道有哪些:成都鼎茂宏升文化传媒公司

短视频赛道有哪些&#xff1a;探索多元化的内容领域 随着科技的飞速发展和人们生活节奏的加快&#xff0c;短视频已成为现代人生活中不可或缺的一部分。它以其简短、直观、易于分享的特点&#xff0c;迅速占领了各个年龄层和社会群体的心智。然而&#xff0c;短视频的赛道并非…

层次式体系结构概述

1.软件体系结构 软件体系结构可定义为&#xff1a;软件体系结构为软件系统提供了结构、行为和属性的高级抽象&#xff0c;由构成系统的元素描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。软件体系结构不仅指定了系统的组织结构和拓扑结构&#xff0c;并…

小程序框架是智能融媒体平台构建的最佳线路

过去5年&#xff0c;媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下&#xff1a; 新闻终端的端侧内容矩阵建设&#xff0c;如App新闻端&#xff0c;社交平台上的官方媒体等新闻本地生活双旗舰客户端&#xff0c;兼顾主流媒体核心宣传…

TopOn 正式聚合Kwai 旗下程序化广告平台——Kwai Network

**我们非常高兴的宣布&#xff0c;TopOn SDK 近日已正式聚合Kwai Network。**作为Kwai 旗下的程序化广告平台&#xff0c;Kwai Network 通过优质的变现能力及产品能力&#xff0c;为广大开发者提供高效及时的服务。 TopOn 聚合平台与Kwai Network 正式完成接入后&#xff0c;开…

实战+代码!Selenium + Phantom JS爬取天天基金数据

功能&#xff1a; 通过程序实现从基金列表页&#xff0c;获取指定页数内所有基金的近一周收益率以及每支基金的详情页链接。再进入每支基金的详情页获取其余的基金信息&#xff0c;将所有获取到的基金详细信息按近6月收益率倒序排列写入一个Excel表格。 思路&#xff1a; 1.…

vm 虚拟机 Debian12 开启 root、ssh 登录功能

前言&#xff0c;安装的时候语言就选中文就好了。选择中文&#xff0c;在安装的时候就可以选择国内 163 的源。 开启 ssh 功能 先提权&#xff0c;用 root 账户 su安装 ssh 安装 ssh-server apt install openssh-server启动 ssh systemctl start ssh查看 ssh 状态 systemctl st…

u3d的ab文件注意事项

//----------------LoadAllAB.cs--------------------- using System.Collections;using UnityEngine;namespace System.IO{public class LoadAllAB : MonoBehaviour{ //读取本地string path "Assets/Actors/lznh/ab/animation/t_bl/";// Use this for initiali…

Keil手动安装编译器V5版本

V5编译器下载&#xff1a;免积分下载 新版的keil不会自动帮你安装V5版本的编译器&#xff0c;但是很多教程很多比赛所用单片机都是V5的编译器&#xff0c;所以用来开以前的或者开源的很多东西编译直接一大堆报错。 吐槽说完了接下来教你怎么解决 打开installer&#xff08;在…

搞大事!法国邀请芬兰公司建量子工厂

法国当地时间5月13日&#xff0c;法国总统马克龙宣布启动2024年度“选择法国”&#xff08;Choose France&#xff09;商业峰会。今年峰会召开前&#xff0c;法国赢得了创纪录的150亿欧元外国投资承诺&#xff0c;覆盖从人工智能到制药和能源等领域。 而涉及到量子领域最重磅的…

el-select下拉框 添加 el-checkbox 多选框,支持全选、取消全选

el-select下拉框 添加 el-checkbox 多选框&#xff0c;支持全选、取消全选 前言一、实现思路二、实现代码1.模板代码2. css 样式3.js 代码 DEMO 演示总结 前言 实现效果预览 提示&#xff1a;本内容基于element-ui 组件实现&#xff0c;如果使用其他组件库、可参考下面实现方…

关于GitHub仓库建立及提交问题

文章目录 前言GitHub仓库创建token令牌的获取GitHub克隆到本地GitHub上传文件 前言 为了整一个GitHub仓库然后上传文件&#xff0c;笔者看了不下100篇博客&#xff0c;20段教程&#xff0c;最后在两位大佬的帮助下&#xff0c;才整明白了&#x1f62d; 先提前说一嘴从 2021年8月…

网络爬虫安全:90后小伙,用软件非法搬运他人原创视频被判刑

目录 违法视频搬运软件是网络爬虫 如何发现偷盗视频的爬虫&#xff1f; 拦截违法网络爬虫 央视《今日说法》栏目近日报道了一名程序员开发非法视频搬运软件获利超700多万&#xff0c;最终获刑的案例。 国内某知名短视频平台报警称&#xff0c;有人在网络上售卖一款视频搬运…

刘邦的创业团队是沛县人,朱元璋的则是凤阳;要创业,一个县人才就够了

当人们回顾刘邦和朱元璋的创业经历时&#xff0c;总是会感慨他们起于微末&#xff0c;都创下了偌大王朝&#xff0c;成就无上荣誉。 尤其是我们查阅史书时&#xff0c;发现这二人的崛起班底都是各自的家乡人&#xff0c;例如刘邦的班底就是沛县人&#xff0c;朱元璋的班底是凤…