《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(15)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(14)

2.3.1 PCI桥

在PCI Agent设备的配置空间中包含了许多寄存器,这些寄存器决定了该设备在PCI总线中的使用方法,本节不会全部介绍这些寄存器,因为系统软件只对部分配置寄存器感兴趣。PCI Agent设备使用的配置空间如图2-9所示:

本回继续讲解在PCI Agent设备的配置空间中包含的其余寄存器:

(10)Base Address Register 0~5寄存器

该寄存器简称为BAR寄存器BAR寄存器保存PCI设备使用的地址空间的基地址,该基地址保存的是该设备在PCI总线域中的地址。其中每一个设备最多可以有6个基地址空间,但多数设备不会使用这么多组地址空间。

在PCI设备复位之后,该寄存器将存放PCI设备需要使用的基址空间大小、这段空间是I/O空间还是存储器空间、如果是存储器空间,该空间是否可预取

系统软件对PCI总线进行配置时,首先获得BAR寄存器中的初始化信息之后根据处理器系统的配置,将合理的基地址写入相应的BAR寄存器中。系统软件还可以使用该寄存器获得PCI设备使用的BAR空间的长度,其方法是向BAR寄存器写入0xFFFFFFFFF,之后再读取该寄存器Linux系统使用__pci_read_base函数获得BAR寄存器的长度

处理器访问PCI设备的BAR空间时,需要使用BAR寄存器提供的基地址。值得注意的是,处理器使用存储器域的地址,而BAR寄存器存放PCI总线域的地址。因此,处理器系统并不能直接使用“BAR寄存器 + 偏移”的方式访问PCI设备的寄存器空间,而需要将PCI总线域的地址转换为存储器域的地址。在Linux系统中,一个处理器系统使用BAR空间的正确方式如源代码2-2所示:

源代码2-2 Linux系统使用BAR空间的正确方法

    pciaddr = pci_resource_start(pdev, 1);
    if (!pciaddr) {
        rc = -EIO;
        dev_err(&pdev->dev, "no MMIO resource\n");
        goto err_out_res;
    }
    ……
    regs = ioremap(pciaddr, CP_REGS_SIZE);

在Linux系统中,使用pci_dev->resource[bar].start参数保存BAR寄存器在存储器域的地址。在编写Linux设备驱动程序时,必须使用pci_resource_start函数获得BAR空间对应的存储器域的物理地址,而不能使用从BAR寄存器中读出的地址

当驱动程序获得BAR空间在存储器域的物理地址后,再使用ioremap函数将这个物理地址转换为虚拟地址。Linux系统直接使用BAR空间的方法是不正确的,如源代码2-3所示:

源代码2-3 Linux系统使用BAR空间的错误方法

    ret = pci_read_config_dword(pdev, 1, &pciaddr);
    if (!pciaddr) {
        rc = -EIO;
        dev_err(&pdev->dev, "no MMIO resource\n");
        goto err_out_res;
    }
    ……
    regs = ioremap(pciaddr, BAR_SIZE);

在Linux系统中,使用pci_read_config_dword函数获得的是PCI总线域的物理地址。在许多处理器系统(如Alpha和PowerPC处理器系统)中,PCI总线域的物理地址与存储器域的物理地址并不相等。

如果x86处理器系统使能了IOMMU,这两个地址也并不一定相等。因此处理器系统直接使用这个PCI总线域的物理地址,并不能确保访问PCI设备的BAR空间的正确性。除此之外,在Linux系统中,ioremap函数的输入参数为存储器域的物理地址,而不能使用PCI总线域的物理地址

在pci_dev->resource[bar].start参数中保存的地址已经经过PCI总线域到存储器域的地址转换,因此在编写Linux系统的设备驱动程序时,需要使用pci_dev->resource[bar].start参数中的物理地址,再用ioremap函数将物理地址转换为“存储器域”的虚拟地址

PCI Agent设备配置空间中包含的其余寄存器请看下回。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SCT2A27STER:5.5V-100V Vin,4A峰值限流,高效异步降压DCDC转换器,集成200mA LDO

特性: • 5.5V-100V 输入电压范围 • 最大输出电压:30V • 2A 连续输出电流 • 4A峰值电流限制 • 1.2V 1% 反馈电压 • 集成500mΩ 高侧功率 MOSFETs • 可选5V或者3.3V,输出一路200mA LDO • 25uA静态电流,VBIAS连接到高于6V的辅助电源 •…

从起高楼到楼塌了的中台战略 —— 业务中台、数据中台、技术中台

目录 一. 前言 二. 中台能力总体框架 三. 业务中台 四. 数据中台 五. 技术中台 5.1. API 网关 5.2. 开发框架 5.3. 微服务治理 5.4. 分布式数据库 5.5. 数据处理组件 六. 阿里拆中台的原因和意义 七. 总结 一. 前言 中台是近年来互联网行业的一个热门话题。它最早是…

Linux系统与windows系统设置定时任务的具体操作方法,如数据库自动备份等

设置定时备份 要设置数据库定时备份,你可以使用操作系统的定时任务功能来自动执行 backup.sh 脚本(此脚本可关注文末公众号回复04获取)。不同的操作系统有不同的方法来设置定时任务,但一般来说,你可以按照以下步骤进行操作: 打开…

书生.浦语大模型实战一

从专用模型到通用大模型 数据 书生.万卷1.0 文本图像-文本视频数据 OpenDataLab开放平台 图像:ImageNettokens语料:WikiQA音频视频:MovieNet3D模型 预训练 微调 增量续训 使用场景:让基座模型学习到一些新知识&#xff0…

鸿蒙原生应用/元服务开发-长时任务

概述 功能介绍 应用退至后台后,对于在后台需要长时间运行用户可感知的任务,例如播放音乐、导航等。为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。申请长时任务后,系统…

MyBatis 源码分析(五):异常模块

1、前言 上一篇我们解了Mybatis解析器模块,本篇我们来了解反射模块。本文,我们来分享 MyBatis 的异常模块。 对应 exceptions 包,如下图所示: 在 MyBatis源码分析(二):项目结构 中,简…

大创项目推荐 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

Django web开发(一) - 前端

文章目录 前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和span2.5 超链接2.6 图片小结标签的嵌套2.7 列表2.8 表格2.9 input系列2.10 下拉框2.11 多行文本用户注册案例: 用户注册GET 方式POST 方式表单数据提交优化 3.CSS样式3.1 快速上手3.2 CSS应用方式1. 在…

【原生部署】SpringBoot+Vue前后端分离项目

本次主要讲解SpringBootVue前后端完全分离项目在CentOS云服务器上的环境搭建与部署过程,我们主要讲解原生部署。 一.原生部署概念 原生部署是指将应用程序(一般是指软件、应用或服务)在底层的操作系统环境中直接运行和部署,而不…

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

基于 InternLM 和 LangChain 搭建你的知识库

基于 InternLM 和 LangChain 搭建你的知识库 大模型开发范式LLM的局限性:RAG 检索增强生成 LangChain简介构建向量数据库搭建知识库助手Web Demo部署环境配置下载 NLTK 相关资源下载本项目代码 大模型开发范式 LLM的局限性: 知识实效性受限&#xff1a…

实用Unity3D Log打印工具XDebug

特点 显示时间,精确到毫秒显示当前帧数(在主线程中的打印才有意义,非主线程显示为-1)有三种条件编译符(如下图) 注:要能显示线程中的当前帧数,要在app启动时,初始化mainThreadID字段条件编译符…

8.1、5G网络切片认识篇

首先,3G上网时代来临,流量高速增长,但是网络资源有限,不可能保证所有业务都能全速进行,总得捡重要的首先保障,因此就对业务进行分类,给予不同优先级的业务不同的资源,不同的服务质量…

基于filter的内存马

主要是通过过滤器来拦截severlet请求中的参数,作为过滤器中的参数,来调用自定义过滤器中的恶意函数 在这里我们分析一下filter的实现原理,循序渐进 Demo1: 直接使用filter模拟内存马效果: 1.配置一个简单的severlet的…

[uniapp] uni-ui+vue3.2小程序评论列表组件 回复评论 点赞和删除

先看效果 下载地址 uni-app官方插件市场: cc-comment组件 环境 基于vue3.2和uni-ui开发; 依赖版本参考如下: "dependencies": {"dcloudio/uni-mp-weixin": "3.0.0-3090820231124001","dcloudio/uni-ui": "^1.4.28","…

flask+mysql徐州市天气信息可视化分析系统-计算机毕业设计源码04600

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对天气信息等问题,对天气信息进行…

深度学习在交通标志识别中的应用

深度学习在交通标志识别中的应用 深度学习在交通标志识别中的应用1. 交通标志识别的背景2. CNN在交通标志识别中的应用3. 数据集准备4. 模型训练与优化5. 模型评估与部署结语 深度学习在交通标志识别中的应用 交通标志是道路上的重要元素,它们提供了关键的信息&…

网络的设置

一、网络设置 1.1查看linux基础的网络设置 网关 route -n ip地址ifconfigDNS服务器cat /etc/resolv.conf主机名hostname路由 route -n 网络连接状态ss 或者 netstat域名解析nslookup host 例题:除了ping,什么命令可以测试DNS服务器来解…

机器学习系列--R语言随机森林进行生存分析(2)

随机森林(Breiman 2001a)(RF)是一种非参数统计方法,需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术,通过拟合一组树来稳定预测精度模型估计。随机生存森林(RSF&#xff0…

【算法分析与设计】移动零

题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0…