PCI bar 解析

news2024/12/24 0:22:09

只要是接入系统的 pci 设备就需要和系统软件进行交互,设备和系统之间的交流主要包含以下两部分:

1,系统要能访问到设备的寄存器

用于控制设备行为,包括DMA,数据收发等;设备通过寄存器报告自身的状态,如是否工作正常,有没有什么错误;

2,设备和系统之间互相传输数据

系统定位设备寄存器的位置以及数据收发的位置。换句话说,设备内部的这些资源应该是可寻址的,能够被系统访问到进而完成一些读写操作。一种思路是设备出厂的时候,就固化自己片上存储空间对应在系统中的地址空间,比如对应到0xFE000000h ~ 0xFE000FFF(4KB),这段地址被该设备独占,对这段地址进行ioremap映射后进行访问就可以和该设备交互。可想而知这种方式可扩展性差,毕竟设备有很多,照这样分配地址,那估计系统有多少地址宽度都不够造的。

另外每个设备对于其所需要的地址空间类型(无论是IO映射还是MMIO映射)和大小有多种多样的需求,但是又不能自己配置,所以必须以一定方式提供信息(包括请求的地址空间类型和大小)给系统,从而让BIOS或操作系统内核来为其分配。这就引出了BAR,BAR指的是设备配置空间中的4个字节,针对一个设备来说,其有6个BAR地址(实际中所有的BAR并不会都使用,不使用的BAR必须由厂商硬编码为0),设备的每个BAR对应设备上的一段存储空间(或者寄存器空间),系统通过将系统地址写入BAR就建立了存储空间的卡上地址和系统地址空间的映射。

在硬件加电初始化时,BIOS固件统一检查了所有的PCI设备, 并统一为他们分配了一个和其他互不冲突的地址,让他们的驱动程序可以向这些地址映射他们的寄存器,这些地址被BIOS写进了各个设备的配置空间的BAR寄存器中,因为这个活动是一个PCI的标准的活动,所以自然写到各个设备的配置空间里而不是他们风格各异的控制寄存器空间里。当然只有BIOS可以访问配置空间。当操作系统 初始化时,他为每个PCI设备分配了pci_dev结构,并且把BIOS获得的并写到了配置空间中的地址读出来写到了pci_dev中的resource 字段中。这样以后我们在读这些地址就不需要在访问配置空间了,直接跟pci_dev要就可以了,我们这里的四个函数就是直接从pci_dev读出了相关数 据,代码在include/linux/pci.h中。定义如下:

        #define pci_resource_start(dev,bar) ((dev)->resource[(bar)].start)

        #define pci_resource_end(dev,bar) ((dev)->resource[(bar)].end)

在内核中pci_setup_device()函数完成了对单个pci 设备的设备和检测,并将获取的信息存取设备结构体中,用于后期具体设备的使用,在pci_setup_device->pci_read_bases-> __pci_read_base中会decode bar读取bios 中配好的系统地址,并写到创建的 resource中去,这里的地址都是物理的(即写到bar中的地址值),必须要在pci设备驱动的probe函数中调用ioremap 或者 pci_iomap 来将这些地址map成虚拟地址才可以使用,访问这个虚拟地址就可以直接操作pcie 设备上的寄存器(片上物理地址)了:

        base_addr = pci_resource_start(pci_dev, bar_idx); 

        size = pci_resource_len(pci_dev, bar_idx); 

        virt_addr = pci_iomap(vpri_dev->pci_dev, bar_idx, 0); 

pci_read_bases 作用:

1,pci_read_bases首先会依次遍历howmany PCI/PCIe设备的BAR配置;

2,struct resource *res = &dev->resource[pos]获取对应的PCI/PCIe设备对应的BAR的resource结构体,为后面的获取到资源信息做填充使用;

3,__pci_read_base用于具体的PCI/PCIe设备资源获取和解析;

4,如果rom是有效的,则会进一步去解析PCI_ROM_RESOURCE的扩展配置空间的资源信息( #6: expansion ROM resource );

__pci_read_base 的作用:

1,读取PCI/PCIe设备的BAR寄存器,解析PCI/PCIe设备的属性以及资源需求信息;

2,读取BAR寄存器的过程

 ·读BAR,保留原值;

 ·写0xFFFFFFFF到BAR;

 ·再读出来,解析出所需要的地址空间大小,记录在pci_dev->resource[ ]里;

       pci_dev->resource[ ].start = 0;

       pci_dev->resource[ ].end = size - 1;

 ·将原值写会BAR寄存器中;

 ·根据上一步读取出的l和sz去计算设备当前BAR所需要资源的基址和大小,通过pcibios_bus_to_resource配置到对应设备BAR的resource里面(设置resource.start);

涉及的代码如下:

    /* 读取BAR寄存器的过程 */

    pci_read_config_dword(dev, pos, &l); /* BARl(起始地址) */

    pci_write_config_dword(dev, pos, mask); /* BAR1 */

    pci_read_config_dword(dev, pos, &sz); /* BARsz(长度) */

    pci_write_config_dword(dev, pos, l); /* BAR l(恢复) */

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

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

相关文章

Nginx部署vue项目和配置代理

Nginx部署vue项目和配置代理目录概述需求:实现思路分析1.一般前后端分离的项目需要进行跨域2.微服务代理3.vuenginx实现服务端跨域4.网页解析器参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&am…

【问题解决】Android JDK版本不匹配导致崩溃踩坑记录

【问题解决】Android JDK版本不匹配导致崩溃踩坑记录部分机型反馈崩溃问题谷歌回复与解决方案Android打包脱糖操作对比与排查总结前几天同事遇到一个非常诡异的报错,紧急处理后,趁着周末仔细研究了一下原因,觉得还挺有意思的,所以…

制作一个谷歌浏览器插件,实现网页数据爬虫

一、什么是浏览器插件 浏览器插件,基于浏览器的原有功能,另外增加新功能的工具,是可定制浏览体验的小型软件程序,让用户可以根据个人需要或偏好来定制浏览器。 如拦截网页中的广告、划词翻译、倍速视频等等。 Chrome、edge等浏…

WEB前端网页设计 网页代码参数(背景、图片)类

目录 设置圆角 旋转属性: box-sizing属性: 设置背景图像固定background-attachment 设置多重背景图像 鼠标光标形状:cursor ”图片背景“ background-size 背景图片的大小 背景图像的位置 px 无序列表 : 标签 项目符…

解决cocos2d-x-4.0 Android Demo构建遇到的问题

环境 硬件:macbook pro 四核Intel Core i7系统:macOS Big Sur 11.4.2、 xcode Version 13.1 、cmake 3.20.5软件:iterm2 Build 3.4.8、zsh 5.8、Android Studio Dolphin | 2021.3.1cocos2d-x v4 : 官方下载压缩包 http://cocos2d…

讲点登录业务

1.单点Session 通过判断用户是否有服务器赋予的session_id,点对点服务器的用户信息,确认用户身份 缺点: 单点性能压力大无法扩展,如果是分布式的话,其他的服务怎么进行认证呢? 2.Redis解决共享问题 我们…

JavaWeb(四)

前言 在学习JSP之前,首先咱们要了解的是,学这个语言有什么用,这个语言用在哪里呢? 这就要从咱们的MVC框架开始讲起 MVC模式是一种软件架构模式,对于我这种软件工程专业的人来说,真的是逃离不了学这个东西。…

Java_题目_学生管理系统_注册登录忘记密码

学生管理系统升级版 Java_题目_学生管理系统_业务分析并搭建主菜单_查询添加删除修改 需求: ​ 为学生管理系统书写一个登陆、注册、忘记密码的功能。 ​ 只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。 分析: 登录…

微信小程序自动化测试实践(附 Python 源码)| 实战系列

为什么要进行小程序自动化测试 随着微信小程序的功能和生态日益完善,很多公司的产品业务形态逐渐从 App 延升到微信小程序、微信公众号等。小程序项目页面越来越多,业务逻辑也越来越复杂,全手工测试已无法满足快速增长的业务需求。 然而&am…

LL(1)文法的核心原理

来自编译原理课本,课本上讲的非常好,这里用我自己的方法再讲述一下。 讨论范围:2型文法,产生式的左边只有一个非终结符号。(这样才能构建树) 用语法树去进行巨型分析的时候会遇到的问题:多个候…

web前端期末大作业 html+css+javascript汽车介绍网页设计实例 企业网站制作(带报告3490字)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

WEB前端网页设计 CSS网页代码 基础参数(三)

目录 font-size属性单位; color:文本颜色 间距 text-decoration:文本装饰 text-align:水平对齐方式 white-space:空白符处理 text-overflow:标示对象内溢出文本 盒子模型: 高度坍…

Python课程设计-图书管理系统

Python课程设计-图书管理系统摘要第一章 绪论1.1 开发环境及技术1.2 系统实现功能描述第二章 功能详细设计与实现2.1 系统框架各层次实现2.1.1 可视页面设计2 数据库设计3 逻辑流程设计2.2 主要功能的设计与实现1 功能 1用户登录2 功能 2展示图书3 功能 3添加图书4 功能 4删除图…

3dmax 打开查看模型

下载一个3dmax模型如下图;包含一个.max文件,一个文件夹; 从File菜单打开该模型;打开对话框右侧会显示模型的一个缩略图; 有任何情况均忽略,直接打开,出现一个Scene Converter对话框,…

Spring MVC 源码分析

Spring MVC 源码分析1. 回顾Servlet1.1. 什么是Servlet1.2. Servlet工作模式1.3. Servlet的工作原理1.4. 源码分析1.4.1. Servlet接口1.4.2. GenericServlet抽象类1.4.3. HttpServlet抽象类1.5. Servlet的局限性2. Spring MVC简介2.1. 什么是MVC2.2. 什么是Spring MVC&#xff…

【深度学习】详解 BEiT

目录 摘要 一、引言 二、方法 2.1 图像表示 2.1.1 图像 patch 2.1.2 视觉 token 2.2 主干网络:图像 Transformer 2.3 预训练 BEiT:掩码图像建模 2.4 从变分自动编码器的角度来看 2.5 预训练设置 2.6 在下游视觉任务微调 BEiT 三、实验 3.…

谁还说我没表情包用?马上用Python采集上万张个表情包

前言 今天来表演一手 采集全网表情包图片 虽然我现在的wx表情包已经996个了,但是我还在存表情包哈哈,多了就继续删 现在跟人聊天,不发个表情包,我都觉得不对劲,怪难受的 索性今天就来,给你们分享一下&a…

Vue3:分析elementplus表格第一列序号hover变多选框实现思路

灵感来自Vue el-table 表格第一列序号与复选框hover切换 源码是通过Vue2elementui去实现的,本篇是通过Vue3elementplus实现,所以在代码上面有些许不同,但函数名一致 实现思路: ①通过表头是多选框,我们可以判定这一…

9.1、面向对象编程

文章目录面向对象编程简介面向对象编程面向对象编程的三大特性对象和类封装练习继承什么是继承重写父类方法多继承私有属性和私有方法多态项目案例:栈和队列的封装栈的封装队列的封装python是面向对象的编程语言 面向对象编程简介 “面向过程”(Procedure Oriente…

Java并发编程—synchronized

文章目录synchronized 的底层实现原理监视器锁对象的锁的获取过程如下:monitorexit:加synchronized锁前后对比synchronized的作用synchronized的三种主要用法synchronized为什么是 非公平锁?————————————————————————…