我需要如下所列的硬件信息,这些信息是在 linux 中使用 lshw 生成的。我需要一个没有 GUI 的 Windows 等价物,更喜欢代码或 dll,可用于提取同一树状结构中的信息。请注意 Wmi 不是一个合适的选项,因为它不会给我空插槽,而 lshw 会。
test-pc3
description: Desktop Computer
version: System Version
width: 32 bits
capabilities: smbios-2.5 dmi-2.5 smp-1.4 smp
configuration: boot=normal chassis=desktop cpus=2 family=To Be Filled By O.E.M. sku=To Be Filled By O.E.M. uuid=C0EFA9AB-8DFE-D511-9075-BCAEC5B65DA4
*-core
description: Motherboard
product: M4N68T-M-LE-V2
vendor: ASUSTeK Computer INC.
physical id: 0
version: Rev X.0x
serial: MT700CK35903797
slot: To Be Filled By O.E.M.
*-firmware
description: BIOS
vendor: American Megatrends Inc.
physical id: 0
version: 0402
date: …Run Code Online (Sandbox Code Playgroud) 我正在评估将我几年前编写的设备驱动程序从 32 位移植到 64 位。物理设备是 32 位 PCI 卡。也就是说,设备是 32 位的,但我需要从 Win7x64 访问它。该设备向 Windows 世界提供一些寄存器,然后将大量总线主数据传输到驱动程序分配的内存块中。
我在 Microsoft 文档中读到过,您可以表明驱动程序是否支持 64 位 DMA。如果不是,则 DMA 是双缓冲的。但是,我不确定是否是这种情况。我的驱动程序将/可能是一个完整的 64 位驱动程序,因此它可以支持处理器地址空间中的 64 位地址,但实际的物理设备不会支持它。实际上,设备 BAR 必须映射到 4 GB 以下,并且设备必须获得 PC RAM 地址才能执行 4 GB 以下的总线主控。这是否意味着我的驱动程序将始终通过双缓冲?这是一个对性能非常敏感的过程,双缓冲可能会阻止整个系统工作。
当然,设计新的 64 位 PCI(或 PCI-E)板是没有问题的。
任何人都可以为我提供此过程的一些资源(除了 MS 页面)?
非常感谢!
我正在为Linux中的PCIe卡编写设备驱动程序.我试图在我的驱动程序中使用中断.
读取PCI配置寄存器的"IRQ线"部分(偏移量0x3C)报告设备的分配IRQ线为11.lspci -b -vv还报告我的设备的中断号码是11.
继续它变得奇怪... cat /sys/bus/pci/devices/<my_device>/irq报告中断号是19.lspci -vv还报告中断号为19.
在我的驱动程序中请求11不起作用.如果我在驱动程序中请求19,我就可以很好地捕获中断.
是什么赋予了?
谢谢!!!
我知道 PCI 和 PCIe 设备可以由 CPU(通过 BIOS 或 OS 中的代码)配置为通过写入设备配置空间的特定区域来响应某些物理内存地址。
事实上,考虑到设备的许多要求(内存对齐、DMA 功能等),Linux 内核有相当复杂的算法来执行此操作。
看到那个软件似乎可以控制这个内存是否、何时以及在哪里映射,我的问题是:一个软件如何控制物理内存的映射?
在这种配置之后,PCI 设备将知道响应给定的地址范围,但是 CPU 如何知道它应该在 PCI 总线上为那些刚刚动态决定的特定地址?
以下是一些细节.
当一个进程调用时ibv_post_send(),在HCA的PCI接口上会发生什么?WQE是否封装在PCIe门铃内并通过Programmed IO写入?或者WQE是否由HCA单独读取?
当进程调用时会发生什么ibv_poll_cq()?HCA如何将CQE推送到系统内存?或者,如果它是基于拉力的,那么CPU如何在HCA中检测新的CQE?
是否可以通过使用Windows c / c ++ API(例如PnP Configuration Manager API)来获取设备的PCI坐标(总线/插槽/功能编号)?我已经知道如何在内核模式下执行此操作,我需要一个用户模式解决方案。我的目标系统是Windows XP-32位。
在Windows上,有一个名为pcitree的程序,该程序可用于设置和读取内存,而无需编写设备驱动程序。是否有Linux替代pcitree,可以让我读取pcie卡第0块的内存?
一个简单的用例是,我使用驱动程序代码在pci-e卡的块零中的第一个内存地址上写入32位整数。然后,我使用pcitree替代方法读取块零的第一个内存地址中的值,并查看我的整数。
谢谢
我这里有 Linux 4.4(我曾经在一个旧的内核上工作,它以同样的方式失败),带有一个 PCIe 连接的 FPGA 设备和一个驱动程序,它们都是我自己设计的。这些在正常条件下工作得很好,但现在我尝试让它们在热插拔条件下工作。这不是真正的硬件热插拔,我一直在尝试的是echo 1 >remove设备的 sysfs 目录及echo 1 >/sys/bus/pci/rescan之后的常规操作。
设备重新出现后,我的驱动程序的初始化调用pci_enable_device()在记录时失败:
otscan 0000:02:00.0: can't enable device: BAR 0 [mem 0xf7e01000-0xf7e013ff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 1 [mem 0xf7e00000-0xf7e00fff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 2 [mem 0xf0200000-0xf020ffff 64bit pref] not claimed
Run Code Online (Sandbox Code Playgroud)
(通常它会在第一个无人认领的资源之后停止,但我已将其修改为继续并确认实际上所有 BAR 均无人认领。)
这里的“未声明”意味着该对象struct resource存在但没有父对象,据我所知,这是由于request_resource()从未被调用而造成的。我不认为这是一个驱动程序问题,因为初始化例程在由于无法启用设备而中止之前没有做很多事情。
这留下了 FPGA(具有硬 IP PCIe 内核的 Altera Cyclone V)以及我可能在那里做错的事情,例如以某种方式错误处理总线重置。通过 sysfs 重新插入该计算机中的其他 PCIe 设备即可工作。
我已经研究了一段时间,但仍然没有弄清楚为什么我的设备被 Linux 区别对待。我的设备的哪些可能属性可能会让 Linux …
我试图了解PCI段(域)如何与多个主机桥相关联?
有人说多个PCI域对应多个主机桥,但有人说它意味着在一个主机桥下有多个根桥.我很困惑,我在PCI SIG基本规范中找不到太多有用的信息.
我想知道
(1)假设我在MCFG中设置了3个PCI域,我是否有3个主机桥连接3个CPU和总线,或者我有3个根桥支持3倍总线但是在一个CPU中共享一个公共主机桥?
(2)如果我有多个主桥(或根桥),这些桥是否共用一个共同的南桥(例如,ICH9),或者它们是分开的?
我是初学者,谷歌并没有解决我的问题.如果有人能给我一些线索,我将不胜感激.
英特尔手册称本地APIC寄存器的存储器映射到4KB区域,默认地址为FEE00000H.可以使用IA32_APIC_BASE MSR 修改此地址.
引用SDM第3卷,第10.4.5节
Pentium 4,Intel Xeon和P6系列处理器允许通过修改IA32_APIC_BASE MSR的24位基址字段中的值,将APIC寄存器的起始地址从FEE00000H重定位到另一个物理地址.提供APIC架构的这种扩展以帮助解决与现有系统的存储器映射的冲突,并允许MP系统中的各个处理器将其APIC寄存器映射到物理存储器中的不同位置.
是否有可能同一台机器上的不同CPU可以为本地APIC提供不同的基址?比如说,CPU 0决定保持在FEE00000H,但CPU1移动到FEF00000H
如果满足以上条件,PCI MSI中断如何工作?如果不同的CPU可以具有不同的本地APIC地址,则MSI消息地址对于不同的CPU意味着不同.