PCI设备BAR寄存器和PCI桥Base、Limit寄存器的初始化

news2024/9/23 6:29:16

初始化PCI设备的BAR(Base Address Register)寄存器和PCI桥的Base、Limit寄存器是配置PCI总线地址空间的关键步骤,这些寄存器的设置影响了系统中PCI设备和桥接器对地址空间的使用和访问。下面详细解释它们的初始化过程:

PCI设备的BAR寄存器初始化

  1. BAR寄存器概述

    • PCI设备的BAR寄存器用于指定该设备在PCI总线地址空间中所需的基地址和大小。
    • 每个PCI设备最多有6个BAR寄存器,编号从0到5。
    • BAR寄存器的值分为两部分:地址和控制位。地址部分指示PCI设备在PCI总线地址空间中的基地址,控制位则指定地址空间的类型(内存空间、I/O空间等)和大小。
  2. BAR寄存器初始化步骤

    • 确定地址空间类型:首先需要确定每个BAR寄存器所描述的地址空间类型,如内存空间还是I/O空间。
    • 分配地址空间:系统软件根据PCI设备的需求和系统中可用的PCI总线地址空间,为每个BAR寄存器分配合适的基地址。
    • 设置BAR寄存器值:将计算得到的基地址和控制位写入到相应的BAR寄存器中。

PCI桥的Base和Limit寄存器初始化

  1. Base和Limit寄存器概述

    • PCI桥的Base寄存器指定其下所有PCI设备在PCI总线地址空间中的基地址。
    • PCI桥的Limit寄存器指定其下所有PCI设备在PCI总线地址空间中可以使用的地址范围的大小。
  2. Base和Limit寄存器初始化步骤

    • 计算PCI总线地址空间需求:系统软件根据其下所有PCI设备的BAR寄存器需求,计算出需要分配的基地址和地址空间大小。
    • 分配基地址:为PCI桥的Base寄存器分配一个合适的基地址,通常是相对于整个PCI总线树的起始地址。
    • 设置Limit寄存器:根据计算得到的地址空间大小,将其写入到PCI桥的Limit寄存器中,限定其下所有PCI设备可以使用的地址范围。

具体操作示例

假设在一个PCI总线树中,按照DFS算法遍历并初始化各个PCI设备和PCI桥的BAR寄存器、Base和Limit寄存器的过程如下:

  • PCI设备的BAR寄存器初始化

    • 确定每个PCI设备的地址空间类型(内存空间或I/O空间)。
    • 根据系统分配的PCI总线地址空间,为每个PCI设备的BAR寄存器分配基地址。
    • 将计算得到的基地址和控制位写入到各个BAR寄存器中。
  • PCI桥的Base和Limit寄存器初始化

    • 确定PCI桥所在的PCI总线地址空间范围。
    • 根据其下所有PCI设备的BAR寄存器需求,计算出合适的基地址和地址空间大小。
    • 将计算得到的基地址写入到PCI桥的Base寄存器中。
    • 将计算得到的地址空间大小写入到PCI桥的Limit寄存器中。

这样,通过初始化BAR寄存器和Base、Limit寄存器,系统确保了每个PCI设备和PCI桥能够正确地访问PCI总线地址空间,避免了地址冲突和资源竞争问题,保证了整个PCI系统的稳定性和可靠性。

PCI桥的Base、Limit寄存器保存“该桥所管理的PCI子树”的存储器或者I/O空间的基地址和长度。值得注意的是,PCI桥也是PCI总线上的一个设备,在其配置空间中也有BAR寄存器,本节不对PCI桥BAR寄存器进行说明,因为在多数情况下透明桥并不使用其内部的BAR寄存器。下文以图3 2所示的处理器系统为例说明上述寄存器的初始化过程,该处理器系统使用的存储器域与PCI总线域的映射关系如图3 1所示。

在这里插入图片描述

在PCI设备的BAR寄存器中,包含该设备使用的PCI总线域的地址范围。在PCI设备的配置空间**有6个BAR寄存器,因此一个PCI设备最多可以使用6组32位的PCI总线地址空间,或者3组64位的PCI总线地址空间。这些BAR空间可以保存PCI总线域的存储器地址空间或者I/O地址空间,目前多数PCI设备仅使用存储器地址空间。而在通常情况下,一个PCI设备使用2到3个BAR寄存器就足够了。
为简化起见,我们首先假定在图3 2中所示的PCI总线树中,所有PCI Agent设备只使用了BAR0寄存器,其申请的数据空间大小为16M字节(即0x1000000字节)而且不可预读,而且PCI桥不占用PCI总线地址空间,即PCI桥不含有BAR空间。并且假定当前HOST主桥已经完成了对PCI总线树的编号。
根据以上假设,系统软件该PCI总线树的遍历过程如下所示。
(1) 系统软件根据DFS算法,系统软件率先寻找到第一组PCI设备,分别为PCI设备31和PCI设备32[1],并根据这两个PCI设备需要的PCI空间大小,从PCI总线地址空间中(0x7000-0000~0x77FF-FFFF)为这两个PCI设备的BAR0寄存器分配基地址,分别为0x7000-0000和0x7100-0000。
(2) 当系统软件完成PCI总线3下所有设备的BAR空间的分配后,将初始化PCI桥3的配置空间。这个桥片的Memory Base寄存器保存其下所有PCI设备使用的“PCI总线域地址空间的基地址”,而Memory Limit寄存器保存其下PCI设备使用的“PCI总线域地址空间的大小”。系统软件将Memory Base寄存器赋值为0x7000-0000,而将Memory Limit寄存器赋值为0x200-0000。
(3) 系统软件回朔到PCI总线2,并找到PCI总线2上的PCI设备21,并将PCI设备21的BAR0寄存器赋值为0x7200-0000。
(4) 完成PCI总线2的遍历后,系统软件初始化PCI桥2的配置寄存器,将Memory Base寄存器赋值为0x7000-0000,Memory Limit寄存器赋值为0x300-0000。
(5) 系统软件回朔到PCI总线1,并找到PCI设备11,并将这个设备的BAR0寄存器赋值为0x7300-0000。并将PCI桥1的Memory Base寄存器赋值为0x7000-0000,Memory Limit寄存器赋值为0x400-0000。
(6) 系统软件回朔到PCI总线0,并在这条总线上发现另外一个PCI桥,即PCI桥4。并使用DFS算法继续遍历PCI桥4。首先系统软件将遍历PCI总线4,并发现PCI设备41和PCI设备42,并将这两个PCI设备的BAR0寄存器分别赋值为0x7400-0000和0x7500-0000。
(7) 系统软件初始化PCI桥4的配置寄存器,将Memory Base寄存器赋值为0x7400-0000,Memory Limit寄存器赋值为0x200-0000。系统软件再次回到PCI总线0,这一次系统软件没有发现新的PCI桥,于是将初始化这条总线上的所有PCI设备。
(8) PCI总线0上只有一个PCI设备,PCI设备01。系统软件将这个设备的BAR0寄存器赋值为0x7600-0000,并结束整个DFS遍历过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1942843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL进阶之路 | 高级篇】ER模型

1. 概述 数据库设计是牵一发而动全身的。那么有没有什么办法可以提前看到数据库的全貌呢?比如需要哪些数据表,数据表中应该有哪些字段,通过什么字段进行连接等等。这样我们才能进行整体的梳理和设计。 其实,ER模型就是一个这样的…

Linux cd 和 pwd 命令

目录 1. 更改工作目录 cd 2. 查看当前工作目录 pwd 1. 更改工作目录 cd 打开虚拟机终端的时候,以用户的家目录为默认工作目录; 更多时候需要更改当前的工作目录(Change Directory), 语法:cd 【Linux路径】 没有参数…

宏信超市净利率微薄:门店过于集中一地收入承压,近年来多次被罚

《港湾商业观察》廖紫雯 日前,江苏宏信超市连锁股份有限公司(以下简称:宏信超市)递表港交所,保荐机构为绰耀资本。 宏信超市为一家总部设于扬州的超市及便利店连锁运营商,以“宏信龙”品牌经营零售业务及…

短视频矩阵新选择,一键智能成片,效率翻倍!

在数字时代浪潮的推动下,短视频已成为人们生活中不可或缺的一部分。从社交娱乐到营销推广,短视频的身影无处不在,其影响力日益扩大。然而,对于内容创作者而言,如何在海量视频中脱颖而出,如何高效、高质量地…

SD 换脸局部重绘 + ipadapter

图生图,局部重绘 2. 配置ipadapter 3. 可以配置ADetailer 最后生成出来 真实丑哭了,完全不像

【保姆级讲解Docker容器 ! ! !】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

文档解析效果全维度测评标准

TextIn文档解析测评工具,全面评测文档解析产品能力 关注TechLead,复旦AI博士,分享AI领域全维度知识与研究。拥有10年AI领域研究经验、复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文…

【AI-10】PPO算法

强化学习中的PPO(Proximal Policy Optimization)是一种流行的策略优化算法,旨在改进和稳定策略梯度方法。PPO由OpenAI提出,因其简单性和良好的性能,在许多强化学习任务中被广泛应用。 PPO框架简介 PPO是一种基于策略…

【算法专题】链表算法题

1. 链表常用操作 相信大家在学习数据结构的过程中已经接触过许多链表相关的题目了,在正式开始刷题之前,我想让大家先回顾一下过去处理链表相关问题时的一些常见操作。 首先肯定就是创建新节点了,如果使用C语言编写代码,我…

MySQL第一阶段:表关系

表关系 表关系分为一对多、多对多、一对一 表关系之一对一 一对一比如用户和用户的详细内容 一对一关系多用于表拆分,将一个实体中经常要用的字段放在一张表,不经常使用的字段放到另一张表,用于提升查询性能。 实现方式:在任…

你了解你的GD32 MCU系统主频是多少吗 ?

系统时钟是GD32 MCU的时基,可以理解为系统的心跳,片上所有的外设以及CPU最原始的时钟都来自于系统时钟,因而明确当前系统时钟是多少非常重要,只有明确了系统时钟,才能够实现准确的定时、准确的采样间隔以及准确的通信速…

【Git】(基础篇七)—— IntelliJIDEA集成Git

InteliJ IDEA集成Git 现在有很多的集成工具帮助我们写代码,使用这些工具可以帮助我们加速写代码,很多工具也可以集成git,使用图形工具管理git,相信了解了底层运行逻辑的你能够很快地上手使用这些工具,本文以InteliJ I…

嘉立创 | 将所有元件属性中间放置

单击元件属性,按鼠标右键,点击查找 点击查找全部,便选中了所有元件属性 点击布局--属性位置 便可以将属性位置改为中间

销量不振,却逆风提价,出尔反尔的宝马在作茧自缚吗?

撰稿|行星 来源|贝多财经 传统豪华汽车品牌宝马,宣布主动退出价格战。 近日,社交平台上有关宝马涨价的传闻不胫而走,引发众多网友关注。相关报道称,有业内人士在社交平台透露,因价格战导致门店亏损严重,…

Python怎样读取URL生成PDF

1. 安装依赖的exe 需要在这个网址,安装一个exe包,地址:https://wkhtmltopdf.org/ 进入网址后,点这个位置: 选择一个你的操作系统的下载链接: 安装后的exe文件: C:\Program Files\wkhtmltopdf…

C++ 栈( stack )学习

目录 1.栈 2.模拟栈 1.1.入栈( push ) 1.2.出栈( pop ) 1.3.获取栈顶元素( top ) 3.直接使用栈( stack ) 3.1.导入头文件并创建栈 3.2.栈的操作 3.2.1.入栈( push ) 3.2.2.出栈( pop ) 3.2.3.获取栈顶元素( top ) 3.2.4.获取栈中元素个数( size ) 3.2.5.判断栈是否…

【第9章】Spring Cloud之Nacos服务配置

文章目录 前言一、改造前二、服务配置1. 添加依赖2. bootstrap.properties3. Data Id 发布配置4. 项目启动 三、改造后四、更多配置项总结 前言 一、改造前 这是我们之前服务注册和发现时使用的两个服务,在application.yml定义了服务注册的一些配置信息 二、服务…

系统架构设计师①:计算机组成与体系结构

系统架构设计师①:计算机组成与体系结构 计算机结构 计算机的组成结构可以概括为以下几个主要部分:中央处理器(CPU)、存储器(包括主存和外存)、输入设备、输出设备,以及控制器、运算器、总线和…

STM32智能机器人控制系统教程

目录 引言环境准备智能机器人控制系统基础代码实现:实现智能机器人控制系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与导航系统实现 4.4 用户界面与数据可视化应用场景:机器人控制与优化问题解决方案与优化收尾与总结 1. 引言 智能机器人控…

js中的“?“/“??“以及“||“的详解(值得收藏)

前言 在JavaScript中,问号(?)通常用于三元运算符,而两个问号(??)则是空值合并运算符,用于在左侧操作数为null或undefined时,返回右侧的操作数。 1、?. (可选链运算符…