问题标签 [pci]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - 设备驱动程序:如何解决非分页池中的内存碎片?
我在 32 位 Windows 7 环境中遇到了 PCI Express 板的问题。该板是一个音频/视频捕获设备,可对 32 个独立的标清模拟视频通道执行实时 H.264 编码。它使用 DMA 将压缩帧传送到 Win7 主机驱动程序。
在系统启动时,板卡驱动程序使用 DmaAdapter 对象的 AllocateCommonBuffer 函数从非分页池中分配 DMA 缓冲区。缓冲区必须全部位于相同的 256MB 物理地址范围内才能映射到板。当 win7 主机系统启动时,这个分配总是成功的。
除了简单的引导加载程序外,该板没有任何常驻固件;它需要在应用程序运行时将固件映像(通过驱动程序)下载到板上。但是,作为此固件下载过程的一部分,Windows 应用程序必须通过驱动程序发出 BOARD_RESET ioctl 以使电路板进入已知状态。不幸的是,当板子收到重置命令时,它会短暂地从 win7 PnP 管理器的视图中“消失”,它认为发生了 SURPRISE_REMOVAL 事件。随后,板驱动程序被迫将其所有分配的 DMA 缓冲区释放回非分页池,并等待来自 PnP 管理器的 StartDevice 事件。
当接收到下一个 StartDevice 事件时,板卡驱动程序无法再完成 DMA 分配。由于碎片,它无法从非分页池中找到足够的缓冲区来映射到相同的物理地址范围。驱动程序使 StartDevice 事件失败,然后由 PnP 管理器从服务中删除。
我正在寻找针对这种情况的编程解决方法。是否可以在板重置期间以某种方式暂停设备节点,因此 PnP 管理器不会将其检测为移除?是否有可以覆盖设备移除检测的 PnP 配置?有什么办法可以挂在驱动程序第一次启动时成功获取的 DMA 缓冲区上?有没有办法在非分页池中保留页面范围供该驱动程序使用?DMA 缓冲区相当大:200 个缓冲区,每个 634880 字节,它们都必须来自相同的 256MB 范围(即,在 0x10000000 边界上)。我有板驱动程序的完整源代码,可以进行任何必要的修改;它是从供应商处购买的参考设计的一部分。这是我第一次接触 Windows 设备驱动程序。
c# - 与 PCI / PCI-X / PCI-E HBA 上的设备进行通信和管理的示例应用程序
我对此完全是新手。我被告知要开发一种“概念验证”类型的示例 C# .NET 应用程序,用于与 PCI / PCI-X / PCI-E HBA 上的设备进行通信和管理。我不了解这里涉及的通信协议。谷歌搜索没有多大帮助,或者我的搜索没有优化。凭借我过去的经验,我所熟悉的只有 C# - ADO.NET。是否有任何机构有关于我应该如何处理这个和任何参考链接的指针。任何已经存在的示例应用程序都可以提供巨大的帮助,我可以在此基础上将其复制到我们的业务需求中。
c++ - 内核执行期间的 CUDA 传输内存
我知道 CUDA 内核可以通过将它们放入单独的流中来“重叠”,但我想知道是否可以在内核执行期间传输内存。CUDA 内核毕竟是异步的
pci - PCIe 64 位不可预取空间
我一直在阅读 PCIe 规范的恐怖,但仍然无法解决以下问题对。
PCIe 是否允许将巨大的(比如 16GB)64 位不可预取内存空间映射到 4GB 边界以上?还是它们仍然绑定到 32 位时代的 1GB,并且没有办法调用大量不可预取的空间?
假设规范允许它(并且我的阅读确实如此),那么广泛可用的 BIOS 是否支持它?还是理论上允许但实践中不允许?
c - 将视频流式传输到 PCIE 插槽
我希望能够将视频从连接到我的计算机的相机直接传输到我通过 PCIE 连接到我的计算机的 FPGA。
我不介意使用 javascript 或 C# 之类的高级语言来执行此操作(因为我知道这些语言具有视频流功能),但我认识到为了达到该级别的硬件,我可能必须使用C(我很清楚)。
我只是想知道是否有某种路线我必须走才能完成此任务,例如安装 Linux(它是 Windows 7 计算机),或使用特定语言,或者是否有一个库已经这样做了.
谢谢!
caching - 如何为可缓存的 PCIe BAR 做 mmap
我正在尝试mmap()
为 PCIe BAR 编写具有自定义功能的驱动程序,目的是使此 BAR 可缓存在处理器缓存中。我知道这不是实现最高带宽的最佳方式,而且写入的顺序是不可预测的(在这种情况下也不是问题)。
这类似于如何防止 MMAP 缓存值?
处理器是 Sandy Bridge i7,PCIe 设备是 Altera Stratix IV dev。木板。
首先,我尝试在 CentOS 5 (2.6.18) 上进行。我更改了 MTRR 设置以确保 BAR 不在不可缓存的 MTRR 范围内,并且与io_remap_pfn_range()
清除位一起使用。读取按预期工作:读取返回正确的值,并且第二次读取到同一地址并不一定会导致读取转到 PCIe(在 FPGA 中检查了读取计数器)。但是,写入导致系统冻结,然后重新启动,而日志或屏幕上没有任何消息。_PAGE_PCD
_PAGE_PWT
其次,我尝试在支持 PAT 的 CentOS 6 (2.6.32) 上进行。结果是一样的:读取工作正常,写入导致系统冻结并重新启动。有趣的是,非临时/写入组合的完整高速缓存行写入(AVX/SSE)按预期工作,即它们总是转到 FPGA 并且 FPGA 观察到完整的高速缓存行写入,然后读取返回正确的值。但是,简单的 64 位写入仍然会导致系统冻结/重启。
我也试过ioremap_cache()
再iowrite32()
里面的驱动代码。结果是一样的。
我认为这是一个硬件问题,但如果有人可以分享任何关于正在发生的事情的想法,我将不胜感激。
编辑:我能够在 CentOS 6 上捕获 MCE 消息:机器检查异常:5 银行 5:be2000000003110a。
我还在 2-socket Sandy Bridge (Romley) 上尝试了相同的代码:读取和非临时写入行为是相同的,简单写入不会导致 MCE/崩溃但对系统状态没有影响,即内存中的值不会改变.
此外,我在较旧的 2-socket Nehalem 系统上尝试了相同的代码:简单写入也会导致 MCE,尽管代码不同。
windows - 访问设备配置空间——win内核PCI设备
我正在编写获取 pci 设备的方法,以编程方式给定供应商 ID、设备 ID(就像 Linux 内核中的 pci_get_device 一样)。
为此,我需要获取设备对象配置。我从这里读到同样的内容:http: //msdn.microsoft.com/en-us/library/windows/hardware/ff558707 (v=vs.85).aspx
现在为了测试这一点,我制作了假驱动程序 - 服务安装框架,它将安装我的 I/O 设备驱动程序,并且在 DriverEntry 中我可以测试这个 PCI 功能。
但是操作系统会因 irql_not_less_or_equal 崩溃,在
谁能告诉我这有什么问题,(我从驱动程序条目中调用它,并传递当前安装驱动程序的设备对象。)
dos - 通过即插即用 BIOS 分配资源
即插即用 BIOS 规范说,如果您有 PnP BIOS,它可以配置硬件。
这意味着您的 BIOS 读取所有设备的资源需求并配置它们(为它们分配总线资源)。
PnP 是否总是为嵌入/集成在主板上的设备分配资源(即分配 I/O 或内存地址和中断)?
PnP BIOS(即存在 $PnP 结构)是否总是将资源(I/O 和内存地址)分配给主板上存在的所有设备(即嵌入式/集成在主板上)以及PCI 扩展卡上。
虽然 BIOS 可能不知道如何“配置”非嵌入式设备(即未嵌入主板上的设备),并且只会配置嵌入式/集成在主板上的设备,但它“应该”分配地址(I/O 和内存)和 irq 以避免在使用像 DOS 这样的非 PnP 操作系统时发生冲突。
我的问题是:
PnP BIOS 是否必须在 POST 期间(即在加载和将控制权转移到 OS bootlader 之前)将 I/O、内存地址和 irq 分配给PCI 扩展卡设备?所有 PnP BIOS 都是这样吗?
假设 [Plug-and-Play OS] 选项设置为No。即我们告诉 BIOS 我们没有 PnP 操作系统,而是像 DOS 这样的非 PnP 操作系统。
某些 BIOS 没有此选项。他们是否总是将资源分配给所有设备(即嵌入式设备和扩展槽上的设备)?
2012-08-01 更新:
PnP BIOS 规范 v1a 标题为“系统 BIOS POST 要求”的第 2.1 节说:
(我只提到了与这篇文章相关的 3 点。(*)标记的信息是我对标准声明的解释。)
为了实现即插即用的目标,系统 BIOS POST负责实现下列要求:
系统 BIOS已知的所有“静态”设备的配置:
至少,这包括系统板设备。它“可以”还包括“即插即用 ISA 卡”和位于 EISA、ISA、PCI或任何其他可用静态总线架构上的设备。
*实际上,上述声明表明,设备“嵌入/集成”在系统板上的任何静态总线(例如,PCI、ISA 或 EISA)上。)“必须”由 BIOS 配置,因为 *BIOS 知道“所有嵌入在主板上的设备,作为设计部分。* 系统 BIOS 程序员必须结合规定将嵌入主板上的设备配置为系统设计部分。
这是否还包括“安装在 PCI/ISA/EISA 卡插槽中的卡”?
BIOS POST 资源仲裁:系统 BIOS 现在必须知道系统资源的使用情况。使用通过运行时服务提供的信息(将在后面的部分中描述)以及系统 BIOS 已知的资源信息,可以避免关键的资源冲突。“在禁用冲突设备的情况下加载操作系统比导致资源冲突和可能的系统故障要好。”
*这似乎适用于嵌入/集成在主板或 ISA/EISA 扩展卡插槽上的 ISA/EISA 设备。 由于 PCI 设备的资源在 I/O(或内存)地址分配方面不会发生冲突(因为 PCI 设备的地址不是硬连线的,因此在BIOS 的“手中”分配不冲突的地址。)和 irq 分配(因为 PCI 中断在设计上是可共享的。),因此这意味着“所有”PCI 设备(嵌入式或非嵌入式)将被初始化/分配内存或 I/O 地址和 irq 分配。
支持即插即用和非即插即用操作系统:即插即用系统 BIOS POST “必须”配置系统以“既”即插即用感知,“以及”非即插即用操作system.* 在非即插即用环境中,“要么”系统 BIOS ,“要么”适当的系统软件(设备驱动程序),“必须”配置“所有”设备(即插即用 ISA 卡、PCI 设备等)。这将允许所有环境“完全像在标准 PC 兼容系统上那样加载”。但是,在即插即用环境中,系统 BIOS 现在可以协助操作系统执行功能,例如系统板设备的运行时配置和系统板设备发生变化时的事件识别。
*规范中的所有这 3 条语句似乎都表明,如果要启动非 PnP 操作系统(例如 DOS),那么系统 BIOS 必须“必须”配置(或者,至少分配地址和 irq)“全部” PCI 设备,无论是否嵌入/集成在主板(主板)上。对于 ISA 和 EISA 设备,BIOS“不得”为那些 ISA/EISA 设备(无论是嵌入式还是非嵌入式)启用/分配资源,这将导致资源分配冲突。
我从规范的上述陈述中得出结论是否正确。那:“如果 BIOS 必须启动非 PnP 操作系统,它必须启用(即启用即分配资源)系统中的‘每个’PCI 设备(无论是嵌入在主板上还是在 PCI 扩展卡插槽上),以便它们可用供操作系统和应用程序使用”?
2012-08-04 更新:
查看Linux Device Drivers 3rd ed 的第 12 章。. 作者在很多地方明确指出,I/O 或内存地址和 IRQ 分配在 linux 内核开始执行时已经由 bios 完成,linux 内核可以根据需要定制分配。
可能是另一个提到我们想要达到的目标的参考。
windows - 在 Windows 中读取 PCI 设备内存寄存器
我需要读取位于系统 PCI 总线上的 AHCI 控制器的 HBA 内存寄存器。我有一个驱动程序,我可以使用它读取系统中所有 PCI 设备的配置空间(使用 ReadConfig 和 WriteConfig)。通过这个,我能够获得 ABAR 内容,它是 AHCI 设备配置空间中的最后一个 BAR。现在,我需要读取这些内存寄存器的值。有谁知道如何做到这一点?PCITree 能够做到这一点,所以我知道这是可能的。
我是驱动程序开发的新手,所以任何帮助将不胜感激...... :)
c# - 如何获取 PCI 设备的 Device ID?
我正在尝试从 C# 中的设备管理器获取系统设备 ID。我找到了一些代码来查找 USB 设备 ID,但我不知道如何将代码从 USB 设备更改为 PCI 设备。
这是我找到的代码: