我正在设计定制的 PCI-Express 卡。
我正在尝试编写一个内核模块来对我的自定义卡进行 DMA。
现在,当我将卡插入 Linux 时,没有显示有效的 PCI 设备(我知道这意味着我这边可能有错误),但是,如果我在引导加载程序(uboot)启动时停止系统,我可以直接访问该卡,因为我知道在 uboot 中映射到我的设备的物理内存地址。
有没有办法可以在 Linux 上以类似的方式访问该卡?
答案1
您的卡是否返回设备或供应商 ID 的 FFFFFFFF?您可能仍然能够通过命令访问 U-Boot pci
,但由于这意味着设备扫描中没有设备,因此 Linux 不会拾取它。我可能错了(我假设这是一个 ARM 平台,因为您提到了 U-Boot - 也许它在不同的 CPU 架构上工作方式不同......)
Linux 可能错误地读取了 PCI 总线。除了您自定义的 PCI 设备之外,其他 PCI 设备是否也能正常工作?如果不行,请检查以确保您使用的内核适合您的主板,或者make menuconfig
在构建内核时可能需要更仔细地研究您的选项。
/dev/mem
让您直接访问未映射的内存地址。您可以使用诸如此类的工具dd
,尽管通过它对单个地址进行特定的读取和写入bash
并不是一件令人愉快或容易的事情。我不知道有哪个 Linux 工具可以充当“监视器”,直接读取和写入内存或设备(也许有,gdb
但它在用户空间中运行……)
答案2
可以通过 收集有关 PCI 卡的基本诊断信息lspci -vvv
。