系统虚拟化学习笔记——PCI设备

内容摘自《系统虚拟化:原理与实现》

PCI 总线架构

  PCI总线是典型的树结构。把北桥中host-PCI桥看做根,总线中其他PCI-PCI桥,PCI-ISA桥(ISA总线转PCI总线桥)等桥设备和

直接连PCI总线的设备看做节点,整个PCI架构可以概括成下图:

  通过桥,PCI可以很容易被扩展,并且与其他总线相互挂接,构成整个系统的总线网络。与HOST-PCI桥相连的总线称为总线0,

其他层次总线的编号,是在BIOS(或者操作系统)枚举设备时确定的。

设备标识符

  设备标识符可以看做设备在PCI总线上的地址,它的格式如下所示:

其中8位的bus字段代表设备所在的总线号,故系统中最多有256条总线。Device字段表示设备号,代表在bus所表示总线上的一个设备。

Function表示功能号,标识具体设备上的某个功能单元(逻辑设备)。举一个例子,一块PCI卡,它上面有两个独立的设备,这两个设备

共享一些电子线路,那么这两个设备就是这块PCI卡的两个功能单元。如Function字段长度暗示的,一个独立的PCI设备最多有8个功能

单元,Device和Function一般合起来用, 表示一条总线上一共最多能有256个设备。通常用设备标识符三个字段的缩写BDF来代表它。

PCI配置空间

对于程序员来说,不需要了解PCI设备电路上的实现细节,只需要了解它的接口即可。PCI配置空间就是这么一个接口,其结构如下图所示:

  PCI设备规范规定,设备的配置空间最多为256个字节,其中前64个字节的格式i和用途是统一的,对程序员来说最重要的是

Base Address Registers和Interrupt Pin,Interrupt Line。

(1) Base Address Registers: 基地址寄存器,也就是常说的PCI bar。它报告设备寄存器或者设备RAM在I/O端口地址空间

(或物理地址空间)的地址。地址是由软件(BIOS或操作系统)动态配置的。通常枚举PCI设备的软件(BIOS或操作系统)会在

获得平台所有PCI设备之后,根据设备数量,按照固定的算法为每个设备的PCI bar分配I/O端口(或物理地址)。设备的电子线路

负责把这些端口(或地址)映射到自身的寄存器上,这样,CPU就可以通过端口号(port I/O方式),物理地址(MMIO方式)访问

到设备了。使用哪种方式访问,由PCI bar的最后一个位表示,该位为1时,表示是I/O端口;该位是0时,表示是MMIO端口。

(2)Interrupt Pin: 中断针脚。 PCI中断线的标准设计是4条:INTA,INTB,INTC,INTD,分别对应值0~3。该寄存器的值表示

设备连接的是哪个中断针脚。

(3)Interrupt Line: 设备的中断线。该寄存器只起一个保护作用,BIOS和操作系统可以自由使用它。BIOS通常用它来保存设备所连

的PIC/IOAPIC的管脚号。

  x86架构把IO地址空间的0xCF8~0xCFF段预留给了PCI总线,用于访问设备的配置空间。其中前32位的寄存器为“地址寄存器”,后

32位为“值寄存器”。软件把设备的BDF和要访问的配置空间的字节偏移写入“地址寄存器”中,就可以通过“值寄存器”读写该配置空间了。

PCI设备枚举过程

  PCI设备的枚举过程一般是由BIOS或者操作系统完成的。

  从前面的PCI总线概要图知道,PCI设备和总线一起构成了树结构,其中PCI-PCI桥是子树的根节点,设备枚举的过程就是要在内存中

建立一颗和实际总线情况相符合的设备树。枚举过程中最重要的步骤是发现PCI-PCI桥。这个可以通过PCI配置空间的HeaderType字段判

断,该字段为1时表示桥设备。PCI-PCI桥主要有三个属性:

  • Primary bus: 表示该桥所属的根总线
  • Secondary bus: 表示以该桥为根节点的子总线
  • Subordinate bus: 表示该桥为根的子树中,最大的总线号

  下面以上图说明三者的关系。

  如上图所示,对于“PCI-PCI桥1”,其Primary bus为总线0,Secondary bus为总线1,而以它为根的总线中最大的总线

号为2,所以其Subordinate bus为总线2。

  设备枚举从根节点HOST-PCI桥开始,首先探测总线0上的各个设备。当探测到第一个桥设备时,为其分配Primary bus号和

Secondary bus号,其中Secondary bus号为1(即当前系统中最大总线号加1),Subordinate bus号暂时和Secondary bus

号相同,当在子树中发现新总线后会自动调整该值。接着以该桥为根节点,继续探测其下属总线,其过程与前面相同,发现第一个

桥设备后则以其为根继续往下探测,如此反复知道所有的子树都探测完毕。

  当PCI-PCI桥收到写入0xCF8中的BDF后,会将Bus字段与自身的Secondary Bus相比,相符则在下属总线上搜索设备;如果

不相符,当Bus值落在Subordinate bus范围内,则将该地址传递给下属总线中各桥,否则不予理睬。

  通过这种方式,BIOS或者操作系统可以枚举出总线上所有设备并为之分配资源,一旦PCI配置空间设定好,软件就可以通过PCI

bar直接访问设备了。

  

时间: 2024-10-17 05:34:08

系统虚拟化学习笔记——PCI设备的相关文章

kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记

本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6.x系列操作系统下KVM优化的点,有很多都是默认支持开启了的,除了采用virtio方式的磁盘IO,与网络IO接口优化之外,其它真是无需太多优化. 1. CPU性能优化 (1) 服务器或宿主机主板BIOS中开启Intel Virtualization Technology(简称VT), 如果主板支持In

树莓派学习笔记——I2C设备载入和速率设置

原文:http://blog.csdn.net/xukai871105/article/details/18234075 1.载入设备 方法1——临时载入设备 sudo modprobe -r i2c_bcm2708  #卸载设备 -r代表remove sudo modprobe i2c_bcm2708     #重新载入设备 方法2——永久载入设备 打开配置文件,进行修改 sudo nano /etc/modules                # 使用nano打开文件 增加以下两行 i2c

虚拟化学习笔记之(2)虚拟化上线前准备

1.性能评估    企业一般在购买虚拟化软件前,通常要考虑对现有设备的利旧使用以及需要新购买多少的硬件设备.采购过多会导致性能过剩,过少会导致性能紧张.这时就要涉及到虚拟化上线前的一个性能评估. 性能评估通常是对现有业务系统对CPU.内存.硬盘等资源的占用情况进行评估,然后再购买对应级别的虚拟化基础硬件. 所用到的工具:windows自带的性能选项卡.PAL工具,linux的MRTG 2.合并率精算及TCO,ROI      provisioning:一台实体服务器能够承载多少个虚拟机 合并后的

linux系统构建学习笔记

嵌入式系统构架:(硬件+软件)应用软件层: Application GNU C Library(glibc)文件系统: 系统层: API(Systern Call Interface) OS Core + Power Mannager+ File Manager + GUI Mannager TCP/IP HTTP WAP DataBase Browser DDI(Device Drver Interface) 板级支持:BSP:Board Support Package       OEM A

KVM虚拟化学习笔记系列文章列表

kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795kvm虚拟化学习笔记(二)之linux kvm虚拟机安装 http://koumm.blog.51cto.com/703525/1289627kvm虚拟化学习笔记(三)之windows kvm虚拟机安装http://koumm.blog.51cto.com/703525/1290191kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置http://koumm.b

Windows phone 8 学习笔记(7) 设备(转)

本节主要涉及到 Windows phone 8 手机支持的各类设备,包括相机.设备状态,振动装置等.还有各类感应器,包括磁力计.加速度器和陀螺仪.通过设备状态可以获取内存.硬件.电源.键盘等状态:通过相机捕获照片和视频:各类感应器帮助我们获取设备的运动状态等. 快速导航:一.设备状态二.相机三.罗盘传感器四.加速度计五.陀螺仪六.如何振动手机 一.设备状态 通过DeviceStatus 类我们可以确定设备的相关状态信息,比如内存大小啊,固件版本啊,还有是否部署了物理键盘等信息,以及与电源的相关信

KVM虚拟化学习笔记系列文章列表(转)

Kernel-based Virtual Machine KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795kvm虚拟化学习笔记(二)之linuxkvm虚拟机安装http://koumm.blog.51cto.com/703525/1289627kvm虚拟化学习笔记(三)之windowskvm虚拟机安装h

【转】 树莓派学习笔记——I2C设备载入和速率设置

原文网址:http://blog.csdn.net/xukai871105/article/details/18234075 1.载入设备 方法1——临时载入设备 [plain] view plaincopy sudo modprobe -r i2c_bcm2708  #卸载设备 -r代表remove sudo modprobe i2c_bcm2708     #重新载入设备 方法2——永久载入设备 打开配置文件,进行修改 [plain] view plaincopy sudo nano /et

老广: KVM虚拟化学习笔记

前言: 虚拟化的理论知识我就不啰嗦了,可以参见http://bbs.linuxtone.org/thread-24347-1-1.html,kvm全称Kernel-based  Virtual Machine, 其实kvm只是一个内核模块,提供虚拟cpu和内存管理的模块,至于其它的设备是由qemu模拟的,如网卡,显卡,磁盘等.后来redhat联合IBM以及Linux社区创造了libvirt,模拟的设备性能要比qemu的好很多,并提供了一系列的管理工具和api,整个集成了kvm虚拟化的解决方案.L