1.前言
在PCIe标准中,Class Code是一个用于标识连接到PCIe总线上设备的类型的字段。它由三个部分组成:Base Class、Sub Class和Programming Interface。
1.1 Base Class(基本类别)
这是最高级别的分类,用于指示设备的一般类别(比如显示控制器、网络控制器等)。
1.1.1 部分Base Class 说明
00h: Device was built before Class Code definitions were finalized
这表示设备是在PCI Class Codes被最终确定之前制造的,因此不会有特定的类别信息。
01h: Mass storage controller
大容量存储控制器,包括硬盘控制器、固态硬盘控制器、光盘驱动控制器、RAID控制器等。
02h: Network controller
网络控制器,如以太网卡、无线网卡、蓝牙适配器等。
03h: Display controller
显示控制器,包括图形处理单元(GPU)、视频适配器等。
04h: Multimedia device
多媒体设备,例如声卡、视频采集卡等。
05h: Memory controller
内存控制器,负责管理系统内存(RAM)的设备。
06h: Bridge device
桥接设备,用于连接不同的计算机总线或数据总线。例如,北桥和南桥芯片、PCI到PCI桥、PCI到PCIe桥等。
07h: Simple communication controllers
简单通信控制器,包括串行和并行端口、多媒体卡等。
1.2 Sub Class(子类别)
在Base Class的基础上提供更具体的设备类型信息。它进一步细分了设备属于基本类别中的哪一种具体类型。
1.3 Programming Interface(编程接口):这是最具体的分类层级,它提供关于设备支持哪种接口或有哪些特定功能的信息。
Class Code通常以16进制的形式表示,分成三个字节。每个字节对应一个以上提到的部分:
第一个字节(最低位字节):Programming Interface
第二个字节:Sub Class
第三个字节(最高位字节):Base Class
例如,如果一个PCIe设备的完整Class Code为0x030200,可以分解如下:
Base Class: 0x03,表示这是一个显示控制器(Display Controller)。
Sub Class: 0x02,表示这是一个3D加速器(通常是指图形处理单元或GPU)。
Programming Interface: 0x00,表示采用的是标准的编程接口。
Base Class和Sub Class的组合通常就足够识别设备的主要类型和功能。Programming Interface提供更详细的信息,特别是当有多种编程模式或操作模式可供选择时。
操作系统和驱动程序使用Class Code来确定如何与PCIe设备进行交互,例如,它可以帮助操作系统找到和加载合适的驱动程序。
1.4 例如当前系统下的SSD设备,我们可以通过setpci来读取这个设备的class code,在pcie协议规范里class code register 偏移是0x9,并且是占3个字节。
读取的class code 为010802,对应协议里就是Base Class=01, Sub-Class=08, Programming Interface=02,所以根据class code这个设备就是一个NVME设备。
PCI-SIG(PCI Special Interest Group,负责制定PCI标准的行业组织)提供了一个详细的Class Code列表,用于标准化设备类型的识别。开发人员和制造商通常会根据这个列表来设置他们的设备Class Code,以确保与操作系统和其他硬件的兼容性,有需要class code对照表的自取。
通过百度网盘分享的文件:PCI_Code…pdf
链接:https://pan.baidu.com/s/1RCEFCM3JcBVU6szRYV-fIg
提取码:Pcie