【PCIe 总线及设备入门学习专栏 1.1 -- PCI 设备访问方法】

文章目录

    • CPU 地址空间与PCI 地址空间
      • PCI 地址空间
      • CPU 地址空间
      • Host Bridge
    • PCI 设备连接框图
    • PCI 硬件信号
      • Configuration Commands

CPU 地址空间与PCI 地址空间

PCI 地址空间

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

CPU 地址空间

如果处理器具有32位的地址总线,其理论可寻址空间为2的32次方=4GB。在不同的物理位置上存在着不同设备,不同的设备又各自具有存储器,那么CPU如何访问这些存储器呢?CPU把系统中各个设备的存储空间映射到一个统一的存储空间上,称为系统存储空间共4GB,这样CPU就可以访问到所有的存储器。比如PCI存储器映射到从0xFFF80000开始的地址空间,显卡映射到0XFFF00000。

在这里插入图片描述

Host Bridge

PCI 地址空间和CPU地址空间的范围都是0x00000000—0xFFFFFFFF。主机端只能发起/响应CPU地址空间的地址访问操作,PCI设备也只能发起/响应对于PCI地址空间的访问请求,因此,在PCI地址空间和CPU地址空间之间就存在一层映射关系,如下图所示。

在这里插入图片描述
当CPU需要访问PCI地址空间 0xF0000000—0xFFFFFFFF这段地址时,根据图2中的映射关系,CPU需要发出对0x90000000—0x9FFFFFFF这段地址空间中相应地址的访问请求。当CPU发出对0xF0000008地址的访问请求时,实际访问的则是CPU地址空间的0xF0000008地址,并不能访问到PCI地址空间的0xF0000008地址。只有当CPU发出对0x90000008地址的访问请求时,才能真正访问到PCI地址空间的0xF0000008地址。反之亦然,当PCI设备需要访问CPU地址空间0x00000000—0x7FFFFFFF这段地址时,PCI设备实际发出的是对PCI地址空间0x30000000—0xAFFFFFFF这段地址空间的访问操作。

在这里插入图片描述
由于在CPU地址空间和PCI地址空间需要进行地址映射,因此就需要一个具有地址转换功能的角色,该角色就是PCI的HOST主桥。以CPU访问PCI设备为例,当CPU需要发起对某一个PCI设备的访问时,会发出对相应CPU地址空间的访问请求,然后由HOST主桥将该CPU地址空间转换为对应的PCI地址空间,然后再由对应的PCI设备对该访问请求进行响应。因此,任何一个PCI设备只有在CPU地址空间具有相应的映像地址时,才能被CPU所访问。

由以上分析可知,HOST主桥负责隔离CPU地址空间和PCI地址空间,并完成CPU与PCI设备之间的地址映射和数据交换。

PCI 设备连接框图

在这里插入图片描述

CPU 发出的地址位于CPU的地址空间,CPU 发出的某个地址有可能是访问内存的或者是访问某个其它模块的,也有可能是访问某个PCI 设备的,CPU 发出的地址范围不一样,它访问到的外设就不一样。假设CPU 发出一个访问PCI 设备的地址 Address0, 那么 CPU 下面连接着的 Bridge 会把 CPU 发出来的地址转换为 PCI_Address, PCI_Address 地址通过 PCI 总线会到达各个设备,那么,那么多设备,谁来相应PCI_Address 这个地址呢?

  • 首先,驱动程序初始化的时候会去扫描 PCI 设备,获取PCI设备需要的地址空间大小,比如 设备 LAN 需要 1K的空间, SCSI 需要1M的空间,所以需要首先确认每个设备需要多大范围的空间。具体就是读PCI设备配置空间的寄存器,就可以知道该设备属于哪类设备、该设备要申请的资源(要申请多大的空间)。
  • 然后,驱动程序要把 PCI 地址空间中的某一块地址分配给这些设备,所谓分配地址空间给某个设备,就是从从PCI 地址空间中划出一段,表示以后如果要访问这块地址空间时,就是访问这个设备。具体操作就是分配地址范围,然后将地址范围写回到配置空间中的寄存器中。

PCI 硬件信号

在这里插入图片描述
从图中可以看到有 AD 信号,也即地址和数据复用信号,一共是32条线,上面传输的时地址或者是数据,那么如何区分AD上传输的时地址信号还是数据信号呢? 答案就是通过 FRAM信号,在FRAM信号为低的时候,在第一个时钟时,AD 总线上传输的就是地址信号,在后续的时钟里传输就是Data。

那么就有个问题:一开始的时候,PCI 总线上的各个设备还没有地址空间,它们也不知道在PCI 总线传输的信号时访问谁的,那么如何去选中某个PCI 设备呢?

从上图中可以看到有个 IDSEL 引脚,它的作用就是配置设备时用来选中某个PCI 设备的,我们顺便看下PCI其他引脚的作用。
在这里插入图片描述
我们继续看下如何选中某个PCI 设备的,如下图所示:

在 PCI bus0 上挂有3个设备,第2个设备也是个PCI 桥,它的线面就是BUS1, 在BUS1 下面有第4个设备和第5个设备,刚开始的这个5个设备都没有配置,那么如何去选中某个设备,就是通过图中的 IDSEL信号来选中。比如对于设备1 它的 IDSEL 肯定是某一个信号,同样对于设备2,它的IDSEL肯定是另外一个信号,到底是通过哪个引脚来选中这个设备,不同的 Root Bridge 有不同的设计,比如可以设计成功过 AD31 信号来选中 PCI 设备1,通过 AD30 来选中设备2,当然也可以通过其他引脚来单独选中PCI设备1。再比如可以通过 BUS1中的AD31来选中PCI 设备4,使用总线BUS1中的AD30来选中PCI 设备5.
在这里插入图片描述
下图是type0 配置空间的头部信息。
在这里插入图片描述
通过 IDSEL 来选中某个 PCI设备,然后去读取它的配置寄存器,去设置它的配置寄存器,每个设备都有245字节的配置寄存器。此外每个设备可能有多种功能,每个PCI设备最多可以有八种功能,对于每种功能它都有256字节的配置寄存器,那么前面提到了通过 IDSEL 可以选择某个设备,那么怎选择设备中的某个功能呢? 怎么选择配置空间中某一个寄存器?

Configuration Commands

在这里插入图片描述
如上图所示 Type0 就是用来访问一般的PCI设备,Type1 用来访问桥后面的设备,紧着这再看时序图:
在这里插入图片描述
通过上面图 3-1 和图 3-4 我们就可以知道如何访问配置空间:

  • 首先通过 IDSEL 来选中某个 PCI 设备;
  • 如果想选中设备中的某个功能某个寄存器,就通过 ADDRESS,在 AD[31-0] 这32条信号线上指定功能function,指定寄存器 REG,如第一个图中的 Type0 的 bit[10:8] 可以用来指定function,bit[7:2] 可以用来选中 寄存器。 在FRAM 信号为底的时候,在第一个时钟 FRAM有效(低电平),这个时候 AD上传输的就是 address, 后续的时钟传输就是data;
  • 通过 C/BE(Command/Byte Enable) 信号来判断是读还是写:在这里插入图片描述 如果是读写配置空间,那么 C/BE 的4个信号传输的值应该是 0b1010 或者 0b1011。当设备配置好之后,可以通过 I/O Read 或者 IO Write 来访问它,也可以通过memory read 或者 memory write 来访问它。

推荐阅读
https://myfj.ijournals.cn/myfjsjyyj/article/html/20240105?st=article_issue
https://blog.csdn.net/zjy900507/article/details/81740345

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7超详细安装教程(含镜像)

1. 安装前准备 1.1 CentOS简介 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是一种基于 Red Hat Enterprise Linux(RHEL)源代码构建的免费开源操作系统。它在稳定性、安全…

【Linux】详谈 进程控制

目录 一、进程是什么 二、task_struct 三、查看进程 四、创建进程 4.1 fork函数的认识 4.2 2. fork函数的返回值 五、进程终止 5.1. 进程退出的场景 5.2. 进程常见的退出方法 5.2.1 从main返回 5.2.1.1 错误码 5.2.2 exit函数 5.2.3 _exit函数 5.2.4 缓冲区问题补…

音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现

一、引言 由《音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流》可以知道,推流端通过下面FFmpeg命令可以将一个媒体文件转推RTP,生成RTP流: ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec cop…

大模型Deepseek的使用_基于阿里云百炼和Chatbox

目录 前言1. 云服务商2. ChatBox参考 前言 上篇博文中探索了(本地)部署大语言模型,适合微调、数据高隐私性等场景。随着Deepseek-R1的发布,大语言模型的可及性得到极大提升,应用场景不断增加,对高可用的方…

zookeeper watch

目录 回顾回调&观察者模式&发布订阅模式Zookeeper 客户端/ 服务端 watchgetChildren 为例最后归纳 回顾回调&观察者模式&发布订阅模式 回调的思想 类A的a()方法调用类B的b()方法类B的b()方法执行完毕主动调用类A的callback()方法 回调分为同步回调和异步回调…

PAT乙组(1016 部分A+B 1017 A除以B)C语言超详细

文章目录 1016 部分AB1017 A除以B 1016 部分AB 输入样例 1: 3862767 6 13530293 3输出样例 1: 399输入样例 2: 3862767 1 13530293 8输出样例 2: 0代码长度限制 16 KB 时间限制 150 ms 内存限制 64 MB 栈限制 8192 KB 思路解析…

论文笔记:Multi-Head Mixture-of-Experts

2024 neurips 1 背景 稀疏混合专家(SMoE)可在不显著增加训练和推理成本的前提下提升模型的能力【比如Mixtral 8*7B,表现可以媲美LLaMA-2 70B】 但它也有两个问题 专家激活率低(下图左) 在优化时只有一小部分专家会被…

【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快,在几个月之后重新搭建ADB 时发现UC 已经更新了很多,为了后续做ADB 的功…

解锁养生秘籍,拥抱健康生活

在这个快节奏的时代,人们行色匆匆,常常在忙碌中忽略了健康。其实,养生并非遥不可及,它就藏在生活的细微之处,等待我们去发现和实践。 规律作息是健康的基础。日出而作,日落而息,顺应自然规律&am…

动手学Agent——Day2

文章目录 一、用 Llama-index 创建 Agent1. 测试模型2. 自定义一个接口类3. 使用 ReActAgent & FunctionTool 构建 Agent 二、数据库对话 Agent1. SQLite 数据库1.1 创建数据库 & 连接1.2 创建、插入、查询、更新、删除数据1.3 关闭连接建立数据库 2. ollama3. 配置对话…

最新国内 ChatGPT Plus/Pro 获取教程

最后更新版本:20250202 教程介绍: 本文将详细介绍如何快速获取一张虚拟信用卡,并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号!一张虚拟信用卡…

Redis哈希槽机制的实现

Redis哈希槽机制的实现 Redis集群使用哈希槽(Hash Slot)来管理数据分布,整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时,Redis会先对键进行哈希运算,得到一个哈希值。然后,Redis将该哈…

下载安装运行测试开源vision-language-action(VLA)模型OpenVLA

1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码,执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…

外贸跨境订货系统流程设计、功能列表及源码输出

在全球化的商业环境下,外贸跨境订货系统对于企业拓展国际市场、提升运营效率至关重要。该系统旨在为外贸企业提供一个便捷、高效、安全的订货平台,实现商品展示、订单管理、物流跟踪等功能,满足跨境业务的多样化需求。以下将详细阐述外贸订货…

排序算法复习——包括插入排序、希尔排序、冒泡排序、快排(包括霍尔法、挖坑法、快慢指针法)、堆排、选择排序、归并排序等 (代码采用c/c++混编)

1.插入排序 插入排序就像我们打斗地主的时候,有一大把牌我们来不及理,就会一张一张的拿然后把拿到的牌放到合适的位置。 对于插入排序我们可以将待排序的数组理解为那一堆没有整理的牌,将排序好的部分理解为手上的牌,对于第i张牌我…

RocketMQ 5.0安装部署

0.前言 在微服务架构逐渐成为主流的今天,消息队列如同数字世界的快递员,承担着系统间高效通信的重要使命。 Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余…

Jetson Agx Orin平台preferred_stride调试记录--1924x720图像异常

1.问题描述 硬件: AGX Orin 在Jetpack 5.0.1和Jetpack 5.0.2上测试验证 图像分辨率在1920x720和1024x1920下图像采集正常 但是当采集图像分辨率为1924x720视频时,图像输出异常 像素格式:yuv_uyvy16 gstreamer命令如下 gst-launch-1.0 v4l2src device=/dev/video0 ! …

【玩转全栈】----Django模板语法、请求与响应

目录 一、引言 二、模板语法 三、传参 1、视图函数到模板文件 2、模板文件到视图函数 四、引入静态文件 五、请求与响应 ?1、请求 2、响应 六、综合小案例 1、源码展示 2、注意事项以及部分解释 3、展示 一、引言 像之前那个页面,太过简陋,而且一个完整…

#渗透测试#批量漏洞挖掘#CyberPanel面板远程命令执行漏洞(CVE-2024-51567)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞特征与影响 二、修复方案与技术细…

C++多态

目录 多态的概念多态的定义及实现协变析构函数的重写通过一段代码理解多态C11 final 和 override重载、覆盖(重写)、隐藏(重定义)的对比多态调用原理单继承中的虚函数表抽象类多继承中的虚函数表 多态的概念 概念:通俗来说,就是多种形态,具体…