论坛首页 安全编程开发区 阅读主题

[原创] Qemu 源码分析(PCI篇)

193 浏览 9 回复
#1 楼主 2026-06-01 21:09:19
几个月前写的文章了,翻飞书翻到了。可能结构会有点乱,主要是了解一下 PCI,有错误的话请各位大佬指正一下PCI 设备通过 BAR(Base Address Register,基地址寄存器) 来定义自己的地址空间。一个标准的 PCI 设备最多可以有 6 个 BAR(BAR0-BAR5),每个 BAR 可以映射到两种不同类型的地址空间:BAR(BASE Address Registers)用来确定设备所需要使用的内存和 I/O 空间的大小,也可以用来存放设备寄存器的地址。设备可以申请两类的地址空间:想象 PCI 总线就像是计算机内部的"高速公路系统":内存和 I/O 设备共享同一个地址空间端口映射 I/O 通常使用一种特殊的 CPU 指令,专门执行 I/O 操作I/O 设备有一个与内存不同的地址空间,为了实现地址空间的隔离,要么在 CPU 物理接口上增加一个 I/O 引脚,要么增加一条专用的 I/O 总线。这里用 edu PCI设备来做解释EDU = Educational Device(教育用设备)这是QEMU官方提供的一个虚拟PCI设备,专门用于教学目的,帮助学生和开发者学习如何编写设备驱动程序。FlatView的作用:我们知道传入的参数为所以access_fn间接调用memory_region_write_accessor跳过阶段七(就是正常执行注册的函数)在后面会仔细解释其含义和实现一般 Device 与 Function 一起成为 deviceFn正向和反向运算deviceFn 为 PCIBus 设备数组的索引直接查询源代码代码即可常用的快速查询表 然后通过 lspci 获取 pci 设备信息config文件 : PCI 配置空间(原始数据) 256 字节 (标准 PCI) 4096 字节 (PCIe)BAR0 解析解析每行三个字段:起始地址 结束地址 标志位(最后一位表示类型:偶数=MMIO,奇数=PMIO)这里可以看见仅仅是用了 BAR0标识位解析Bit 0:Region Type,总是为 0,用于区分此类型为 MemoryBits 2-1:Locatable,为 0 时表示采用 32 位地址,为 2 时表示采用 64 位地址,为 1 时表示区间大小小于 1MBBit 3:Prefetchable,为 0 时表示关闭预取,为 1 时表示开启预取Bits 31-4:Base Address,以 16 字节对齐基址┌─────────────────────────────────────────────────────────────────┐

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289981.htm
#2 2026-06-01 21:09:19
感谢分享
#3 2026-06-01 21:09:19
tql
#4 2026-06-01 21:09:19
年底干货文章很多呀。 火钳刘明
#5 2026-06-01 21:09:19
感谢大佬分享
#6 2026-06-01 21:09:19
感谢分享,如果再补充讲解一下seabios如何为各个pci设备设置mmio映射区域和edu pci设备代码就更好了
#7 2026-06-01 21:09:19
大佬!!!
#8 2026-06-01 21:09:19
飞翔的猫咪


感谢分享,如果再补充讲解一下seabios如何为各个pci设备设置mmio映射区域和edu pci设备代码就更好了[em_014]

好的好的
#9 2026-06-01 21:09:19
文章的结束,思考的起点...
#10 2026-06-01 21:09:19
大佬您好,感谢您的分享,不知道有没有机会可以跟您进一步深入探讨一下?

请登录后参与讨论

立即登录 注册账号