揭秘PCI总线上电与内存分配全过程

背景:回顾以前学习的PCI总线,就了解一下他的协议,至于他的配置空间,他的上电过程如果,以及CPU那边如何给他分配资源,往往一知半解。这里就开源PCI总线的仿真过程学习一下PCI设备上电的过程。

参考文档:PCI Local Bus Specification Revision 3.0 February 3, 2004

工具:modelsim10.6d

什么是PCI总线协议?

PCI是一种并行总线标准,用于连接计算机主板上的硬件设备。如显卡,声卡,网卡等。因为其即插即用,传输速度快的特征。在FPGA中,往往会用PCI设备作为采集卡,控制卡等等。其协议特点包括:

  • 并行传输:32位或64位数据总线,时钟频率33MHz或66MHz。
  • 配置空间:每个PCI设备包含256字节的配置空间,存储设备ID、中断引脚、BAR(Base Address Register)等信息。
  • 枚举机制:系统启动时通过遍历总线号、设备号、并分配内存IO空间。

PCI设备有三个空间——内存地址空间、IO地址空间和配置空间。由于PCI支持即插即用,所以PCI设备不是占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定其映射的基址。操作系统根据当前硬件资源的占用情况,通过修改设备配置空间中BAR寄存器,动态的分配并映射内存或者IO地址。这就是配置空间的作用。

PCI配置空间

PCI的配置空间寄存器比较多,详细的可以看PCI总线规范。这里说明几个主要的寄存器。

DEVICE ID和VENDER ID供应商ID和设备ID

命令寄存器:

Bit15-10:保留。

Bit9:Fast Back-to-Back Enable。

Bit8:SERR使能。

Bit7:保留。

Bit6:奇偶校验使能。

Bit5:VGA Palette Snoop。

Bit4:内存写入和失效使能。

Bit3:Special Cycle control。

Bit2:总线主控使能。

Bit1:内存空间使能。

Bit0:I/O空间使能。

状态寄存器:

Bit15:检测到奇偶校验错误。

Bit14:信号系统错误。

Bit13:接收主机终止。

Bit12:接收目标终止。

Bit11:信号目标终止。

Bit10-9:Devsel timing。指示设备在所有访问中断言devsel信号的最慢时间。00,快速。01,中等。10,慢速。11,保留。

Bit8:主数据奇偶校验错误。表示主设备在事务期间检测到奇偶校验错误。1表示发生了奇偶校验错误。

Bit7:Fast Back-to-Back Capable。

Bit6:保留。

Bit5:66MHZ capable。指示设备能以66MHZ运行。如果设备支持66MHZ,该位置为1。

Bit4:Capabilities List。

Bit3-0:保留。

基地址寄存器:

PCI支持最多六个基地址寄存器(BAR)。BAR用于保存PCI的基地址,并指向系统内存映射中PCI的起始地址。根据它们是在内存空间还是I/O空间映射,BAR的配置方式不同。

当映射为内存空间时。

Bit31-4: 用于保存内存地址,并由 BAR0-BAR5 参数初始化。

Bit3:预取使能,只读位,指示内存空间是否可以预取。

Bit2-1:基地址类型用于确定 BAR 是映射到 32 位地址空间还是 64 位地址空间。这些位具有以下含义:00:32位地址空间,01:保留。10:位于64 位地址空间。11:保留。

Bit0:内存和I/O空间指示符用于指示基地址是映射到I/O还是内存空间。值为0表示映射到内存空间。该位的值由BAR0-BAR5参数的位0设置。

当映射为IO空间时。

Bit31-2: 用于保存内存地址,并由 BAR0-BAR5 参数初始化。

Bit1:默认为0。

Bit0:内存和I/O空间指示符用于指示基地址是映射到I/O还是内存空间。值为0表示映射到内存空间。该位的值由BAR0-BAR5参数的位0设置。

I/O地址与memory地址的区别

在计算机系统中,地址空间是一个重要的概念。除了我们熟悉的memory address,包括逻辑地址、虚拟地址和CPU地址,还有I/O address。I/O address是专门为访问I/O设备(特别是设备中的寄存器)而设立的。在大多数体系结构中,memory address和I/O address是分别编址的,使用不同的寻址指令,从而形成了两套独立的地址空间。然而,也有一些体系结构,如ARM,将memory address和I/O address统一编址。

这是计算机上的一个PCI设备,他的bar0被分配为IO空间。bar2和bar4被分配为mem空间。

PCI总线上电过程和内存分配

本次仿真实验模拟PCI总线上电的过程,模拟操作系统对PCI设备的发现和内存IO分配。

第一步,读取配置空间地址00H。

获取设备ID。

PCI总线发起配置读,pci_cbe命令为1010配置读。读取供应商ID和设备ID。

第二步,读取配置空间04H状态和命令寄存器。

获取当前PCI总线的状态。

第三步,向配置空间04H状态和命令寄存器写入。

0x00000003,打开IO和MEM空间使能。

第四步,读取配置空间04H状态和命令寄存器。

判断上述步骤是否配置成功。这里成功读取到了0x04000003,表示已经写入成功。

第五步,读取配置空间08H,获取当前PCI总线的分类代码和版本ID。

关于class code分类说明

第六步,读取配置寄存器0CH。

第七步,向基地址寄存器10H,14H等写入全F。

第八步,从基地址寄存器(10H,14H)回读。

根据回读值判断bar空间大小,分配类型是IO还是MEM空间。

这里回读10Hbar0值为0xFFFFF001,表示需求大小为4KB,需要映射为IO空间。

这里回读14Hbar1值为0xFFFFF000,表示需求大小为4KB,需要映射为MEM空间。

第九步,空间分配。

操作系统查询到当前内存或IO上空闲的地址段为0x10000000和0x20000000。

这里写入10Hbar0值为0x10000000,表示分配的IO空间地址为0x10000000。

这里写入14Hbar1值为0x20000000,表示分配的MEM空间地址为0x20000000。地址分配完成后,操作系统中对该段内存的访问就会转换为对PCI设备的访问。

第十步,读取Subsystem ID。

第十一步,读取拓展基地址。

30H。

第十二步,读写3CH,配置中断相关信息。

第十三步,正常访问bar0和bar1。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i_qyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值