lspci -vv -s 00:00
我在运行 Linux 的单板计算机上运行时得到以下输出。
07:05.0 RAID bus controller: Adaptec AAC-RAID (Rocket) (rev 03)
Subsystem: Adaptec ASR-2230S + ASR-2230SLP PCI-X (Lancer)
Control: I/O- Mem+ BusMaster+ SpecCycle+ MemWINV+ VGASnoop-
ParErr- Stepping- SERR+ FastB2B-
Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR-
Latency: 64 (250ns min, 250ns max), Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 74
Region 0: Memory at f7a00000 (64-bit, non-prefetchable) [size=2M]
Region 2: Memory at f79ff000 (64-bit, non-prefetchable)
[Remaining output truncated]
上面只是示例输出,并不完全是我得到的,但它包含感兴趣的项目。
我理解 lspci 命令的大部分输出,但我希望有人向我解释以地区...我在这里查看的是由 Region 行指定的什么类型的内存?我如何访问它?带着这个要求,我试图完成通过 PCI 总线连接的两台单板计算机之间的通信。我应该可以直接说话。总线上只有一个 PCI 仲裁器。这就是我到目前为止所取得的成就......
我为出站 PCI 流量创建了一个 Linux 内核模块。基本上,它使用驱动程序 mmap 实现从用户空间(使用用户空间应用程序)一路向下映射。我写入 mmap 返回的位置,实际上我用总线分析器看到了流量!现在,在另一台单板计算机上,我尝试读取 PCI 设备的 sysfs 资源,但只看到所有 FF,没有任何更改。
任何关于如何发生所有这些内存映射(涉及 PCI)的建议或解释将不胜感激。
答案1
lspci显示有关 PCI 设备的信息(取决于选项),您可以查看手册页以获取更多信息。
关于地区在输出的标头中,这些行详细说明了用于该组件的寄存器的分配位置。它与内存映射以及每个组件如何使用内存有关。
Region 0: Memory at f7a00000 (64-bit, non-prefetchable) [size=2M]
Region 2: Memory at f79ff000 (64-bit, non-prefetchable)
这些行指定了所使用的寄存器地址、大小和地址大小(64 位指向寄存器)。
如果您想深入了解该地址的使用方式,请查找有关计算机体系结构的更多信息。