0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCI总线地址空间与系统地址空间的关系

FPGA设计论坛 来源:未知 2023-01-06 08:30 次阅读

1、PCI地址空间

PCI总线具有32位数据/地址复用总线,所以其存储地址空间为2的32次方=4GB。也就是PCI上的所有设备共同映射到这4GB上,每个PCI设备占用唯一的一段PCI地址,以便于PCI总线统一寻址。每个PCI设备通过PCI寄存器中的基地址寄存器来指定映射的首地址。PCI地址空间对应于计算机系统结构中的PCI总线。

3f58cd06-8d59-11ed-bfe3-dac502259ad0.png

2、系统地址空间

如果处理器具有32位的地址总线,其理论可寻址空间为2的32次方=4GB。但这并不意味着内存就可以4GB大小,其实XP系统最大内存大约为2GB,这与CPU访问系统中其它设备的存储器方式有关(比如CPU访问PCI总线上的存储器)。

计算机系统中在不同的物理位置上存在着不同设备,不同的设备又各自具有存储器,那么CPU如何访问这些存储器呢?CPU把系统中各个设备的存储空间映射到一个统一的存储空间上,称为系统存储空间共4GB,这样CPU就可以访问到所有的存储器。比如PCI存储器映射到从0xFFF80000开始的地址空间,显卡映射到0XFFF00000,再加上操作系统会占用一些空间,就只剩下不到2G能真正分配给物理内存了。(具体数值是为解释需要取的任意值,不代表真实情况)

系统地址空间对应于计算机系统结构中的前端总线(FSB)。

3f5e88ea-8d59-11ed-bfe3-dac502259ad0.png3、PCI总线地址与系统存储空间转换映射

我们假设在一个32位处理器中,其存储器域的0xF000-0000~0xF7FF-FFFF(128MB)这段物理地址空间与PCI总线的地址空间存在映射关系。

当处理器访问这段存储器地址空间时,HOST主桥将会认领这个存储器访问,并将这个存储器访问使用的物理地址空间转换为PCI总线地址空间,并与0x7000-0000~0x77FF-FFFF这段PCI总线地址空间对应。

为简化起见,我们假定在存储器域中只映射了PCI设备的存储器地址空间,而不映射PCI设备的I/O地址空间。而PCI设备的BAR空间使用0x7000-0000~0x77FF-FFFF这段PCI总线域的存储器地址空间。

3f6e0e1e-8d59-11ed-bfe3-dac502259ad0.png

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

3f8071b2-8d59-11ed-bfe3-dac502259ad0.png

注意观察上图中PCI设备的BAR0寄存器值,如果PCI设备向下级联了(相当于PCI桥),BAR0是不变的,而且LIMIT寄存器受PCI未继续级联(而是直接接了PCI设备)的BAR0影响。

PCI设备的BAR寄存器中,包含该设备使用的PCI总线域的地址范围。在PCI设备的配置空间中共有6BAR寄存器,因此一个PCI设备最多可以使用632位的PCI总线地址空间,或者364位的PCI总线地址空间。这些BAR空间可以保存PCI总线域的存储器地址空间或者I/O地址空间,目前多数PCI设备仅使用存储器地址空间。而在通常情况下,一个PCI设备使用23BAR寄存器就足够了。

为简化起见,我们首先假定在图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遍历过程。

3f947338-8d59-11ed-bfe3-dac502259ad0.jpg

精彩推荐 至芯科技12年不忘初心、再度起航12月17日北京中心FPGA工程师就业班开课、线上线下多维教学、欢迎咨询! 至芯科技精品寒假班来袭,1月7号线上授课,欢迎广大学子,电子爱好者前来学习! FPGA学习-IO延迟的约束方法 关于数字信号处理中的降采样扫码加微信邀请您加入FPGA学习交流群

3f9a7490-8d59-11ed-bfe3-dac502259ad0.jpg3fa1d74e-8d59-11ed-bfe3-dac502259ad0.png

欢迎加入至芯科技FPGA微信学习交流群,这里有一群优秀的FPGA工程师、学生、老师、这里FPGA技术交流学习氛围浓厚、相互分享、相互帮助、叫上小伙伴一起加入吧!

点个在看你最好看


原文标题:PCI总线地址空间与系统地址空间的关系

文章出处:【微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593201

原文标题:PCI总线地址空间与系统地址空间的关系

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MMU虚拟地址空间布局

    当然虚拟地址空间划分不只是如此。因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址,实际支持情况如下。 (1)-虚拟地址位宽 虚拟
    的头像 发表于 11-26 16:35 575次阅读

    DMA传输不经过CPU处理的地址空间复制解决方案

    DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
    发表于 10-25 11:20 384次阅读
    DMA传输不经过CPU处理的<b class='flag-5'>地址</b><b class='flag-5'>空间</b>复制解决方案

    Linux虚拟地址空间和物理地址空间关系

    过程,这其实也是MMU的工作原理。 我们知道,在Linux中,每个进程都有自己独立的地址空间,且互不干扰。每个进程的地址空间又分为用户空间
    的头像 发表于 10-08 11:40 505次阅读
    Linux虚拟<b class='flag-5'>地址</b><b class='flag-5'>空间</b>和物理<b class='flag-5'>地址</b><b class='flag-5'>空间</b>的<b class='flag-5'>关系</b>

    Linux系统为什么需要引入虚拟地址

    在 Linux 系统中,采用了虚拟内存管理技术,事实上大多数现在操作系统都是如此!在 Linux 系统中,每一个进程都在自己独立的地址空间
    的头像 发表于 10-07 17:28 542次阅读
    Linux<b class='flag-5'>系统</b>为什么需要引入虚拟<b class='flag-5'>地址</b>

    Linux操作系统中程序地址空间详解

    在正式讲程序[地址空间]前我们先来看一段简单的代码来分析分析。
    发表于 09-12 10:56 130次阅读
    Linux操作<b class='flag-5'>系统</b>中程序<b class='flag-5'>地址</b><b class='flag-5'>空间</b>详解

    Normal World与Secure World的地址空间隔离是如何实现的

    众所周知,Normal World的用户态与内核态的地址空间隔离是基于MMU分页来实现的,那么Normal World与Secure World的地址空间隔离是如何实现的呢?
    的头像 发表于 09-05 09:36 541次阅读
    Normal World与Secure World的<b class='flag-5'>地址</b><b class='flag-5'>空间</b>隔离是如何实现的

    Linux如何证明线程共享进程的地址空间

    所有的书上都说,进程中的所有线程共享进程的地址空间,如上图中的蓝框都在一个进程中。那么该如何证明这个结论呢?
    发表于 08-25 16:22 342次阅读
    Linux如何证明线程共享进程的<b class='flag-5'>地址</b><b class='flag-5'>空间</b>

    扩展了DDR后,蜂鸟的指令寻址空间地址空间为什么还是不变?

    扩展了DDR后,蜂鸟的指令寻址空间地址空间还是不变,最大都只有64K吗?如果想进一步扩大指令空间的话,需要修改SDK的makefile吗?
    发表于 08-16 06:57

    psram地址空间如何对应?

    QSPI0可以映射到512Mb(0x2000_0000开始)地址空间直接访问,其他QSPI是怎样映射的?不是很清楚8M的psram对应的地址空间是什么
    发表于 08-16 06:43

    Arm PCI配置空间访问固件接口1.0BET1平台设计文档

    本文档为调用方(如操作系统系统管理程序)定义了访问PCI配置空间的标准固件接口。 该接口可用作增强配置访问机制(ECAM)硬件机制的替代方案,该机制在PCIe规范[1]中进行了定义。
    发表于 08-11 07:55

    ARM用于A级系统地址映射

    本文档描述了ARM用于A级系统地址映射,来自模型和模拟器到开发板和复杂的SoC。 它解释了存储器、外围设备和扩展的地址分区选择空间。 它描述了当32位平台操作
    发表于 08-02 08:19

    访问PCI/PCIe设备的流程

    PCI/PCIe 地址空间怎么转换? 假设 CPU 发出的 addr_cpu,是用来访问 PCI 设备的,转换关系为: addr_
    的头像 发表于 07-30 09:44 1050次阅读

    PCI/PCIe地址空间的概念

    地址空间的概念 以人类为例: 爷爷生了4个小孩,排行1234 老大又生了4个小孩,排行1234 这两个“1234”辈分不一样,空间不一样 嵌入式系统中的
    的头像 发表于 07-30 09:38 456次阅读
    <b class='flag-5'>PCI</b>/PCIe<b class='flag-5'>地址</b><b class='flag-5'>空间</b>的概念

    内存是怎么映射到物理地址空间的?内存是连续分布的吗?

    如果我们将两个4G内存插入内存插槽,得到的内存地址空间是0到8G吗?是不是0到4G是第一根内存,4到8G是第二根内存呢?实际情况相差甚远,内存在物理地址空间的映射是分散的。
    的头像 发表于 06-30 15:59 2029次阅读
    内存是怎么映射到物理<b class='flag-5'>地址</b><b class='flag-5'>空间</b>的?内存是连续分布的吗?

    基于IAR指定RL78程序地址空间说明

    存放 函数指定地址存放 1 首先需要根据自己需要指定存放的C文件里面程序所占大小来规划自己的空间。 2 可根据编译生成的map文件来定位C文件所占大小。 如何生成map文件如下图所示: 3 通过查看
    的头像 发表于 06-19 15:25 565次阅读
    基于IAR指定RL78程序<b class='flag-5'>地址</b><b class='flag-5'>空间</b>说明