- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据各种文章,为了访问 PCI 配置空间,使用 I/O 端口地址 0xCF8、0xCFC。
mov eax, dword 0x80000000
mov dx, word 0x0CF8
out dx, eax
mov dx, word 0x0CFC
in eax, dx
上述代码中eax的值为0x12378086
,这意味着供应商ID = 0x8086
和设备ID = 0x1237
。
问题来了
第一季度。我发现这种方法仅适用于 PCI 配置空间。那么,访问 PCIe 配置空间的另一种方法是什么?
“无法使用传统 PCI 方法(通过端口 0xCF8 和 0xCFC)访问此扩展配置空间”
https://wiki.osdev.org/PCI_Express
但其他一些文章称这种传统方法也与 PCIe 配置空间兼容。
这很令人困惑。
第二季度。如果旧版 0xCF8、0xCFC 也能与 PCIe 配置空间配合使用,那么详细的 NASM 汇编源代码(与 linux 无关)将得到真正的赞赏,因为我已经看过很多 ECAM(增强配置访问机制)文章,但它们都是关于概念内容。
硬件规范:
Motherboard : P775TM1
Processor : Intel i7 8700K
最佳答案
Q1. I've seen this method only works for PCI Configuration Space. Then, what is the other method to access PCIe Configuration Space?
对于 80x86 PC,实际上有 3 种机制来访问 PCI 配置空间。您提到的旧机制(使用 IO 端口 0x0CF8 和 0x0xCFC)是“机制 #1”。还有另一种遗留机制称为“机制#2”,它也使用 0x0CF8 和 0x0xCFC;但它并没有被许多芯片组使用,并且(对于现代计算机)可以被认为是过时的。
最初每个 PCI“功能”的 PCI 配置空间大小为 256 字节;对于这两种旧机制,您只能访问 256 字节。当他们发明 PCI-E 时,他们添加了第三种机制(内存映射 ECAM),并且还将每个 PCI-E“功能”的 PCI 配置空间大小增加到 4096 字节。传统的“机制#1”仍然有效,但仍然只能访问前 256 个字节(PCI-E“功能”可以具有的 4096 个字节)。幸运的是,硬件制造商足够聪明,可以确保旧操作系统需要访问的内容位于前 256 个字节内,因此不支持 PCI-E 的旧操作系统仍然可以工作(使用“机制#1”),其余 4096 字节(没有 ECAM 就无法访问)主要用于 PCI-E 扩展功能等。
注意:可以有一个“PCI-E 到 PCI 常规”桥接器,桥接器后面有 PCI 常规设备。在这种情况下,PCI 传统设备/功能将仅提供 256 字节的 PCI 配置空间,即使它仍然使用 ECAM。
使用ECAM;您需要使用 ACPI 的“表索引”(RSDT 或 XSDT)来查找名为“MCFG”的表。遗憾的是(除非自从我上次查看后它发生了变化)这个表在它所属的 ACPI 规范中没有描述;相反,它是在 PCI 规范中描述的,该规范被锁定在“恶意昂贵”的 PCI SIG 付费墙后面。希望您能在某处找到可靠的第三方描述。
一般情况下; MCFG 表由描述用于一系列总线编号的地址范围的条目组成;并且对于多个单独的总线编号范围可能存在多个不同的地址范围。这个想法是使用设备的总线号来查找正确区域的地址;然后组合“address_of_area + ((bus - first_bus_for_area) << 20) | (device << 15) | (function << 12)
”来查找函数的PCI配置空间的起始地址。一旦找到,您就可以读/写该物理页内的偏移量,以访问函数 PCI 配置空间中的相应偏移量。
关于assembly - 如何访问PCIe配置空间? (ECAM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57457283/
我正在编写一个支持多种设备的 Linux 设备驱动程序。我有一个 x8 PCIe 卡,上面有 4 个这样的设备。每个都通过一个 PCIe 交换机运行并获得 2 个 PCIe channel 。有没有办
有谁知道放在 PCIe 卡上的 COM,它有一些闪存、一些 RAM、JTAG 支持(或某种调试支持)、一些输入端口,如 USB,也许支持一些输出,如通过 VGA 或 LVDS,只是像这个板子:http
我是 PCIe 的新手,所以这可能是个愚蠢的问题。这似乎是询问有关 PCIe 接口(interface)的相当基本的信息,但我找不到答案,所以我猜我遗漏了一些使答案显而易见的信息。 我有一个系统,其中
为了实现NVMe SSD和其他PCIe设备之间的p2p通信,我想知道是否需要对Linux内核和NVMe驱动程序进行一些修改,或者其他什么?我应该做哪些修改?我已经搜索了几天,但是这方面的信息很少,我需
我一直在阅读令人恐惧的 PCIe 规范,但仍然无法对以下问题得到任何解决方案。 PCIe 是否允许将巨大(例如 16GB)64 位不可预取内存空间映射到 4GB 边界以上?或者它们仍然与 32 位时代
两个独立的设备(端点)可以在没有根复合体参与 PCIe 的情况下相互通信(根据 PCIe 规范是的,但是如何)? 在内存和 IO 事务的情况下,一个端点如何知道另一个端点的地址? 交换机如何在两个下游
对于另一个问题,我使用了与附件相同的情节。可以看到峰值带宽超过5.5GB/s。我正在使用来自代码示例的 NVidia 带宽测试程序来查找主机到设备之间的带宽,反之亦然。 该系统由两个插槽上的 12 个
过去几天开始,我尝试开发主机和端点之间的数据传输,但我无法实现该实现。我尝试了如何使用一些调用读取配置空间(pci_read_long),已成功读取vendor_id、device_id...等数据。
我正在 Linux 中为在 Xilinx UltrascaleMPSoC FPGA 部分上实现的 PCIe 端点编写一个设备驱动程序。我已经正确实现了删除功能。我使用适配器将设备连接到电脑,打开设备,
我正在为 openwrt 开发一个 PCIE 设备驱动程序,在尝试访问定时器中断中的 io 内存时遇到了数据总线错误,我在 last question 中提到过.经过大量研究,我想我可能找到了原因,但
我正在尝试使用流式 DMA 映射将 DMA 添加到我的 PCIe Linux 驱动程序。 FPGA(端点)为 DMA 配置了 BAR4,在我的设置函数中我做了(按顺序): pci_set_master
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我在这里发现了一些关于它的话题,但没有一个能解释我遇到的问题。我只是想通过将其映射到 Linux 中的用户内存空间来访问 PCIe 设备的内部状态寄存器。这是我的系统配置: # uname -a Li
例如,当我使用带有 CUDA C/C++ 和 GPUDirect 2.0 P2P 的多 GPU 系统时,我使用嵌套的 PCI-Express 开关,如图所示,那么我必须知道任意两个 GPU 之间有多少
我正在开发一个在启动时将大量数据推送到显卡的流媒体应用程序。在推送数据时,CPU 几乎没有做任何事情,它以接近零的使用率闲置。 我想监控哪些机器在推送初始数据时遇到困难,哪些机器可以应付,以便我可以为
我写了一个简单的 PCIe 驱动程序,我想测试它是否有效。例如,如果也可以写入和读取从设备使用的内存。 我该怎么做? 哪些东西也应该被证明? 最佳答案 例如,您需要找到设备的 sysfs 条目 /sy
我在我的 intel i7 PC 上使用 intel i210 1G NIC 卡,我想知道这个 NIC 如何与主机通信而无需开箱即用的任何配置。 什么 NIC 作为 PCIe 设备输出到主机,主机 p
我希望能够将视频从连接到我的计算机的摄像头直接流式传输到我通过 PCIE 连接到我的计算机的 FPGA。 我不介意使用 javascript 或 C# 等高级语言来执行此操作(因为这些是我知道的具有视
我已经编写了一个 PCIe 设备驱动程序,但读/写功能无法正常工作。该设备有 3 个内存区域,分别从 0x10800000、0x0c000000 和 0x80000000 开始。仅出于测试目的,我在驱
我正在为 Linux 编写一个 PCIe 驱动程序,目前没有 DMA,并且需要知道一旦从用户空间启用它后如何读取和写入 PCIe 设备。 在驱动程序中,我在 probe() 中执行基础操作: pci_
我是一名优秀的程序员,十分优秀!