news 2026/6/9 23:39:41

CPU 和 PCIe 设备 地址转化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CPU 和 PCIe 设备 地址转化

CPU 访问 PCIe 设备:CPU 物理地址(PA) → Root Port(ATU) → PCIe 总线地址

PCIe 设备 访问 CPU(DMA):PCIe 总线地址 → Root Port(ATU/IOMMU)→ CPU 物理地址(PA)

中间没有魔法,全部是地址映射 + 路由转发

3 种地址

  1. CPU 物理地址(CPU PA)
    • CPU 看到的地址
    • ECAM、BAR 都属于这类
  2. PCIe 总线地址(Bus Address)
    • PCIe 总线上传输的地址
    • 设备寄存器、DMA 都用这个
  3. 设备本地偏移(Device Offset)
    • 设备内部寄存器的偏移(如 0x00, 0x10)

CPU → 访问 PCIe 设备(读 / 写寄存器)

完整转化路径(硬件真实流程):

① 驱动发出虚拟地址

ioread32(virt_addr + 0x10);

② MMU 转为 CPU 物理地址(BAR 地址)

虚拟地址 → MMU → **CPU PA = 0x8010_0000**

③ 送到 PCIe Root Port

Root Port 查ATU(地址转换表)

CPU PA 0x8010_0000 → 映射为 PCIe 总线地址 0x0000_0010

④ Root Port 打包成 PCIe 报文

  • 地址:0x0000_0010
  • 路由:由BDF找到目标设备
  • 类型:Memory Write/Read

⑤ 设备收到报文

设备只认识PCIe 总线地址,不认识 CPU PA:

总线地址 0x0010 → 设备内部寄存器偏移 0x10

PCIe 设备 → 访问 CPU(DMA 写内存)

① 设备驱动告诉设备 DMA 地址

驱动写的是CPU PA,但设备不懂。

② Root Port 再次做转换

设备发:

PCIe 总线地址 = 0x8000_0000

Root Port 查表:

PCIe 总线地址 0x8000_0000 → CPU 物理地址 0x8000_0000

③ 发给内存控制器

最终写到 DRAM。

地址转化的两个硬件模块

Root Port 内部的 ATU

Address Translation Unit

  • 管:CPU PA ↔ PCIe 总线地址
  • 作用:让两边互不感知对方地址
  • 内核在枚举时配置好

IOMMU(可选,但服务器必开)

  • 管:PCIe 总线地址 → 最终内存地址
  • 作用:隔离、安全、虚拟化
  • 开启后:
    PCIe 地址 → IOMMU → 内存 PA

3 组关系

方向地址 A转化硬件地址 B用途
CPU→设备CPU 物理地址(BAR)Root Port ATUPCIe 总线地址寄存器读写
DMA←设备PCIe 总线地址Root Port / IOMMUCPU 物理地址DMA 访问内存
配置访问ECAM 物理地址Root Port 解析BDF 路由配置空间

BDF 路由表

每个 Bridge(Root Port / Switch Upstream / Switch Downstream)都有一张路由表,由三个寄存器构成:

  • Primary Bus Number(上游总线号)
  • Secondary Bus Number(本端口直连的下游总线)
  • Subordinate Bus Number(此端口下面所有子总线最大值)

这三个数,就是BDF 路由表

路由规则

当一个配置报文到达 Bridge:

目标 Bus = B 目标 Dev = D 目标 Func = F

Bridge 只看Bus 号 B

  1. B < Secondary Bus→ 报文是发给上游的 →往回发(Primary 方向)

  2. B == Secondary Bus→ 是直连设备 →从本端口发出去Dev/Func 由设备自己判断

  3. Secondary Bus < B ≤ Subordinate Bus→ 是我下面更深层的桥 →继续往下发(本端口)

  4. B > Subordinate Bus→ 不归我管 →不管,丢给上游

和 ATU 的区别

ATU 表:地址 → 地址(Mem 访问用)

BDF 路由表:Bus 号 → 哪个端口(Config 访问用)

  • 读 BAR、写 BAR、枚举设备 →走 BDF 路由
  • 读写寄存器、DMA →走地址(ATU)

极简总结

  1. BDF 路由表 = Primary / Secondary / Subordinate
  2. 只根据 Bus 号路由,不看 Dev/Func
  3. 每个桥都有一张
  4. 专门给配置事务(ECAM、config)用
  5. 内核扫描时自动配置
  6. 和 ATU 完全两回事:
    • ATU = 地址翻译
    • BDF 路由 = 配置报文转发路径

内核配置 ATU & BDF,扫描 PCIe 时:

  1. 通过ECAM找到设备BDF
  2. 读取BAR,知道需要多大地址窗口
  3. 分配一段CPU 物理地址
  4. CPU PA → PCIe 地址写入ATU
  5. 记住这个ATU 表项 对应 这个 BDF 设备

之后每次访问该 CPU PA:

  • Root Port 自动用ATU 翻译地址
  • 自动用BDF 路由到设备

关键总结

  1. CPU 不直接跟设备说话,靠 Root Port 翻译。
  2. CPU 用物理地址 PA设备用总线地址
  3. ATU 是翻译官
    • CPU 访问设备:PA → 总线地址
    • DMA 写内存:总线地址 → PA
  4. BAR 地址 = CPU 端的门牌号总线地址 = 设备端的门牌号Root Port 就是门牌翻译器
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 19:51:22

5步掌握Qwen-Image-Edit-F2P:AI图像生成与编辑快速入门

5步掌握Qwen-Image-Edit-F2P&#xff1a;AI图像生成与编辑快速入门 你有没有过这样的经历&#xff1a;想给一张人像照片换个背景&#xff0c;却卡在PS图层蒙版上反复调试&#xff1b;想让朋友的证件照更自然些&#xff0c;结果调色过度变成“蜡像脸”&#xff1b;或者临时要一…

作者头像 李华
网站建设 2026/6/9 20:57:08

EagleEye 视觉分析系统:本地化部署与数据隐私保护

EagleEye 视觉分析系统&#xff1a;本地化部署与数据隐私保护 1. 为什么需要一个“不上传”的视觉分析系统&#xff1f; 你有没有遇到过这样的场景&#xff1a;工厂质检员想用AI识别产线上的缺陷&#xff0c;但公司IT政策明令禁止图像外传&#xff1b;学校老师想用目标检测分…

作者头像 李华
网站建设 2026/6/9 21:02:10

阿里图片旋转判断模型:社交媒体图片优化利器

阿里图片旋转判断模型&#xff1a;社交媒体图片优化利器 你有没有遇到过这样的尴尬&#xff1f;在社交媒体上分享了一张精心拍摄的照片&#xff0c;结果因为手机传感器或上传过程中的问题&#xff0c;图片莫名其妙地旋转了90度或180度。用户看到的是一张需要歪着头才能看的图片…

作者头像 李华
网站建设 2026/6/9 19:48:39

一键部署:实时手机检测-通用模型快速上手教程

一键部署&#xff1a;实时手机检测-通用模型快速上手教程 1. 引言&#xff1a;为什么你需要这个手机检测模型&#xff1f; 想象一下&#xff0c;你正在开发一个智能监控系统&#xff0c;需要自动识别画面中是否有人在使用手机。或者&#xff0c;你正在做一个驾驶行为分析项目…

作者头像 李华
网站建设 2026/6/7 6:36:52

阿里达摩院SeqGPT-560M:开箱即用的中文NLP利器

阿里达摩院SeqGPT-560M&#xff1a;开箱即用的中文NLP利器 你是否遇到过这样的场景&#xff1a; 刚拿到一批新闻稿&#xff0c;需要快速打上“财经/体育/科技”标签&#xff1b; 客户发来一段产品描述&#xff0c;要立刻抽取出“型号、价格、上市时间”三个字段&#xff1b; 项…

作者头像 李华
网站建设 2026/6/9 19:43:44

MAI-UI-8B应用案例:购物比价+行程规划全自动

MAI-UI-8B应用案例&#xff1a;购物比价行程规划全自动 朋友&#xff0c;可以转载&#xff0c;但请注明出处&#xff0c;谢谢&#xff01; http://blog.csdn.net/jiangjunshow 你有没有过这样的时刻&#xff1a; 刷小红书看到一款心动的咖啡机&#xff0c;想比价却要手动截图…

作者头像 李华