PCIe 配置空间:Command 寄存器

本文详细介绍了PCIe规范中Command寄存器的功能和配置。包括各个位的作用,如控制I/O空间和Memory空间的访问、Bus Master能力、Parity错误响应等,并解释了这些配置如何影响设备的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 type 0 header 中,command 寄存器的位置如下图所示:
在这里插入图片描述

在 type 1 header 中,command 寄存器的位置如下图所示:
在这里插入图片描述

Command 寄存器的结构如下图:
在这里插入图片描述

对于 PCIe,只有 Bit 0/1/2/6/8/10 是有效的,其他必须配置为 0 。

  • IO Space Enable
    • 该位用于控制设别如何响应 I/O 空间的访问请求。
    • 该位为 0 时,设备不会响应 I/O 空间访问请求。
    • 该位为 1 时,设备正常响应 I/O 空间访问请求。
    • 复位后,默认为 0 。

  • Memory Space Enable
    • 该位用于控制设别如何响应 Memory 空间的访问请求。
    • 该位为 0 时,设备不会响应 Memory 空间访问请求。
    • 该位为 1 时,设备正常响应 Memory 空间访问请求。
    • 复位后,默认为 0 。

  • Bus Master Enable
    • Endpoint
      • 该位决定了设备能否发出 Memory 读写请求、I/O 读写请求。
      • 该位为 1 时,允许设备发出 Memory 读写请求、I/O 读写请求。
      • 该位为 0 时,不允许设备发出 Memory 读写请求、I/O 读写请求。
      • MSI/MSI-X 中断消息属于 Memory 写请求,因此该位为 0 时,设备无法产生 MSI 或 MSI-X 中断消息。
      • 除了 Memory 读写请求和 I/O 读写请求,其他类型的请求不受该位控制。
      • 默认值为 0。

    • Root Port & Switch
      • 该位决定了设备能否将 Memory 读写请求和 I/O 读写请求转发至上游方向(Upstream Direction)。
      • 该位为 0 时,Root Port 或者 Switch 的 Downsteam 端口收到 Memory 请求和 I/O 请求后,应该按照 Unsupported Requests(UR)处理。对于收到的 Non-Posted 请求,应该向 Requester 发送一个 UR Completion 状态位置位的 Completion。
      • 该位并不会影响 Completion 的转发。
      • 除了 Memory 读写请求和 I/O 读写请求,其他类型的请求不受该位控制。
      • 默认值为 0。

  • Parity Error Response
    • 该位决定了是否使用 status 寄存器的 Master Data Parity Error 位对 Poisoned TLP 进行记录。
    • 该位为 1时,如果有 Poisoned TLP,则将 status 寄存器的 Master Data Parity Error 位设置为 1。

  • SERR# Enable
    • 对于 Endpoint,该位为 1 时,设备可以向 Root Complex 发送 ERR_FATAL 和 ERR_NONFATAL 错误消息。
    • 对于 Switch,该位为 1 时,设备可以将 ERR_FATAL 和 ERR_NONFATAL 错误消息转发到上游总线。
    • ERR_COR 消息不受该位控制。

  • Interrupt Disable
    • 该位用于控制设备能否产生 INTx 中断。
    • 该位为 1 时,不允许设备产生 INTx 中断。
    • 默认值为 0。
### PCIe配置空间寄存器详解 #### 配置空间概述 PCI Express (PCIe) 的配置空间对于管理和配置 PCIe 设备至关重要。每个 PCIe 设备拥有一个固定大小为 256 字节的配置空间,该空间被划分为多个寄存器,用于保存设备的各种属性和状态信息[^1]。 #### 寄存器结构与功能 配置空间中的寄存器按照特定的方式组织,其中包含了多种不同用途的数据字段: - **Vendor ID 和 Device ID**: 这些字段位于偏移量0x0到0x3之间,分别占用了两个字节的位置。前者用来唯一标识制造商的身份;后者则表示具体的硬件产品型号。 - **Command Register (命令寄存器)**: 存储于偏移位置0x4至0x7处,允许软件设置或清除某些位来启用或禁用各种特性选项,比如内存映射I/O、总线主控能力等。 - **Class Code (类别码)**: 定义在偏移8~9, 描述了此装置所属的功能分类及其子类目,有助于操作系统识别并加载相应的驱动程序。 - **Header Type (头部类型)**: 占据第Eh个字节(即十进制14),指明当前设备所遵循的具体头文件格式版本号以及是否存在多条目的情况。 - **BIST (内置自检测试)**: 放置于Fh字节内,提供了一种简单的方法来进行基本功能性验证操作。 - **Base Address Registers (BARs, 基地址寄存器)**: BAR 是非常重要的部分之一,通常从偏移量0x10开始连续排列最多六个这样的区域描述符。这些寄存器主要用于指定设备可以访问哪些物理地址范围内的资源(如MMIO 或 I/O端口),并且支持可变长度编码方式以适应不同的寻址需求。当涉及到超过32位宽度的需求时,则会使用成对的形式共同表达更大的数值区间[^3]。 ```cpp // 示例:读取 Vendor ID 和 Device ID uint16_t vendor_id = pci_read_config_word(device_handle, PCI_VENDOR_ID); uint16_t device_id = pci_read_config_word(device_handle, PCI_DEVICE_ID); // 设置 Command Register 中的 Bus Mastering Enable bit pci_write_config_byte(device_handle, PCI_COMMAND_OFFSET + 1, pci_read_config_byte(device_handle, PCI_COMMAND_OFFSET + 1) | PCI_COMMAND_MASTER_ENABLE); ``` 上述代码片段展示了如何通过编程接口访问配置空间里的关键寄存器项,并执行一些常见的管理任务。 #### 特殊注意事项 值得注意的是,在实际应用过程中应当谨慎处理配置空间的操作,因为不当修改可能导致系统不稳定甚至崩溃。此外,尽管大多数现代操作系统都提供了安全可靠的API 来简化这一过程,但在开发低级驱动或其他底层组件时仍需深入了解其内部工作机制[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值