- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对让 CPU 将值写入 PCIe 卡的内存所涉及的确切 系列步骤感到非常困惑。很难理解您在 Internet 上阅读的内容的精确含义,因此我希望有人能阅读我对正在发生的事情的理论并指出任何错误。
假设我有一个带有一些内存的 PCIe 卡。为了便于讨论,假设以下具体设置:
让我们再谈谈术语:
pci_dev
结构在启动时,Linux 开始探测不同的地址以查看那里是否有任何内容。
pci_dev
结构0x55500000
到 0x5550FFFF
。
0x55500000
(为什么要麻烦?)0x55500000
和 0x5550FFFF
之间的系统总线上的后续写入被根复合体“捕获”,并发布到 PCIe 卡
0xDEADBEEF
写入系统总线上的地址 0x55501230
,并且根复合体将数据包发送到 PCIe 卡,卡接收数据包并将 0xDEADBEEF
写入其本地 4 MB 内存中的 0x01230
那么:这其中哪些部分是正确的,哪些部分是错误的?
最佳答案
我的经验是使用英特尔处理器,因此下面的一些细节可能特定于英特尔处理器,但大部分都是通用的。此外,我不知道 Linux 如何识别要为每个设备加载的驱动程序的详细信息,所以我跳过了这个问题。
现代 CPU 没有系统总线(除非隐藏在 CPU 本身内)。它们具有内存 channel 、PCIe 根端口和连接到芯片组的 DMI 端口(也称为外围 Controller 集线器或 PCH)。 PCH 包含额外的设备并且可能有额外的根端口。根复合体包括集成到 CPU 和 PCH 中的电路。 (一些 CPU SoC 没有 DMI 或 PCH,所有根复合体电路都在 CPU SoC 中。)
即使您的卡是整个系统中唯一的 PCIe 卡,也有其他 PCIe 设备集成到根复合体中(称为 RCIEP 或根复合体集成端点)。这些可能在 CPU 中或在 PCH 中。
连接到 PCIe 根端口的设备将被配置为某个非零总线编号上的设备 0。总线编号取决于设备连接到的 PCIe 根端口(即插槽)以及 BIOS 配置 PCIe 总线的方式。 (同一个插槽通常会有相同的总线号,但也可能不同,这取决于连接到其他 PCIe 根端口的是什么。)
您的其他假设和术语都很好。
软件通过对 I/O 端口 0xcf8 和 0xcfc 使用输入/输出指令,或使用内存映射配置空间来访问 PCI 配置空间。 PCI配置空间的内存地址范围由BIOS设置。软件通过查看 ACPI 表找出地址。将这些 I/O 或内存访问转换为 PCIe 信号的机制完全在根复合体硬件中。
PCI 配置空间地址范围内的偏移量控制正在访问的设备/寄存器软件。例如,访问 MMCFG + 0 会访问设备 0:0.0 的寄存器偏移量 0。访问 MMCFG + 0x1000 访问设备 0:0.1 的寄存器偏移量 0,访问 MMCFG + 0x102000 访问设备 1:0.2 的寄存器偏移量 0。
软件读取每个设备地址偏移量 3:0 处的供应商 ID/设备 ID 寄存器,以检测该设备地址是否存在设备。如果没有设备存在,PCI Controller 返回 0xffffffff。如果存在设备,则该设备返回供应商 ID 和设备 ID,从而允许软件确定设备的类型。
每个设备都有 6 个 BAR 寄存器,偏移量为 0x10、0x14、... 0x24。如果设备支持 64 位 BAR,则两个相邻的 BAR 寄存器用于配置单个区域。通常,BIOS 会配置每个设备的 BAR,还会配置根复合体中的其他(隐藏)寄存器,以使其能够将内存访问路由到正确的设备。软件通常只写入 BAR 寄存器以检测区域大小,然后恢复由 BIOS 设置的值。根据根联合体硬件,软件可能会或可能不会更改 BAR 值,并且仍然可以正常访问。
关于linux - 从 CPU 向 PCIe 地址空间写入一个字节的精确细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58443506/
前言 本文主要介绍了关于MySQL主键为0与主键自排约束的关系,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 开始不设置主键表的设计如下: 如果id的位置有好几个0
我已经阅读了一些关于将消息从一个线程冒泡到所有其他线程以正常退出的正确方法的来源(每个线程都执行它自己的退出例程)。其中,我喜欢全局原子 bool 值的想法,它可以从任何线程进行标记,所有其他线程检查
本文深入探讨Go语言中的流程控制语法,包括基本的 if-else 条件分支、 for 循环、 switch-case 多条件分支,以及与特定数据类型相关的流程控制,如 for-r
我是 MVC 和 XCode 的新手,在将我对 MVC 的概念理解转化为设计和实现具体类时遇到了困难。我希望就如何构建 Controller 和 View 以获得预期的 UI 获得一些建议。这是针对
如果我尝试在 View 中打开 DeatilFragement,我的应用程序崩溃并收到以下错误: Caused by: java.lang.IllegalStateException: Require
我正在尝试构建我的 iOS 应用程序的界面。一遍又一遍地开始新项目我仍然遇到细节 View 控件的问题(见图)。 在这里我得到了截图: 详细 View 显示当用户触摸 UITableView 行时。您
我在与我正在处理的项目的类(class)中遇到问题。该类是一个接受标签和值的 GUI 组件。这里的想法是,用户可以指定一个标签,然后从任何地方链接一个值(更具体地说,该值的 ToString 方法),
嗯.. 我在我的应用程序中设置了表格 View - 详细 View 。 主视图使用常规代码将数据传递给详细 View - (void)tableView:(UITableView *)tableVie
我有 celery 任务,队列中有 100 个输入数据,需要使用 5 个 worker 来执行。 如何获取哪个工作人员正在执行哪个输入? 每个 worker 执行了多少输入及其状态? 如果任何任务失败
我有一个 .net github 项目,它基本上是一个 Web API 的包装器。在测试项目中,我使用 API key 调用 API。我需要将此 key 保密,如何在 Visual Studio 项目
我遇到一个问题,从 Ag-Grid 导出网格只会导出主网格的详细信息,而不会导出子网格。这是一个显示问题的 plunkr: https://next.plnkr.co/edit/jVcvWDJ1NKP
我在详细 View 中有一个不会消失的额外空间。该 View 来自 NavigationLink,但我已经尝试过使用或不使用 NavigationView。我试图包装它用 NavigationView
几天来,我一直在关注猫效应和 IO。我觉得我对这种效果有一些误解,或者只是我错过了它的重点。 首先——如果IO可以替代Scala的Future,我们如何创建异步IO任务?使用 IO.shift ?使用
如何将标高添加到主视图/详细 View 的详细信息 Pane 中,以在其下方提供阴影,同时定位为部分覆盖工具栏(如下面的底部图片)?我尝试使用 android:elevation="4dp" 但这对我
我试图在我的 UISplitViewController 的细节 View 上设置一个阴影,我希望在 iOS 6 中的主 View 上可见。 在我的细节 View Controller 中: sel
我正在阅读 std::basic_string::reserve(size_type res_arg=0) 上的标准.它是这样说的: void reserve(size_type res_arg=0)
Boost 文档说 Starting with Boost release 1.53, shared_ptr can be used to hold a pointer to a dynamicall
我用 OpenGL 编写了一个简单的 24 位位图加载器。我打开一个位图文件并读取它的像素,然后从中创建一个 RGB 像素数据数组,然后将其传递给 glDrawPixels()。 问题:我需要使图像的
for x in ...循环 就是把每个元素代入变量x,然后执行缩进块的语句。 range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。 比如我们想计算1-10的整数
场景 我有一个 DevExpress XtraGrid。 显示的数据采用主/详细信息格式,点击行开头的“+”可展开该主行的详细信息。 我通过将网格数据源绑定(bind)到包含自己的字典属性(以保存详细
我是一名优秀的程序员,十分优秀!