【93】PCI Expansion ROM

1、Expansion ROM

    PCIe、PCI设备可以提供Expansion ROM,Expansion ROM中存在设备初始化或者system boot的code。SystemBIOS在POST(Power-on Self Test)阶段,会枚举PCI设备,并判断有设备是否支持Expansion ROM,如果支持Expansion ROM,这把Expansion ROM code拷贝到RAM中并执行。

2、配置空间中Expansion ROM BAR位置

    Type 0的0x30位置是存放设备的Expansion ROM BAR的位置,Expansion ROM BAR的枚举和其他BAR没有太大区别,都是写全1然后回读获取BAR大小,唯一的区别就是systemBIOS要去对应的地址拷贝Expansion ROM code,并校验、执行。

3、PCI Expansion ROM内容

    PCIe Expansion ROM可能有很多份code image,每一份image都是512 byte boundary对齐的,并且每一份image都必须包含PCI Expansion ROM header。每次一份image的起始地址都依赖上一份image的大小(Image_N_header_offset=Image_N-1_header_offset+ Image_N-1_length*512)。最后一份image在last image indicator(0x15)字段标记出来。

3.1、PCI Expansion ROM Header格式

PCI Expansion ROM Header格式如上图,其中0x18~0x19指向PCI Data Structure。

3.2、PCI Data structure格式

    其中vendor identification(0x4)/device identification(0x6)和class code(0xd)三者表示了本image code支持的设备ID(match和PCI 子系统查找probe函数的match函数类似)。

    PCI data structure length(0xA)代表本image中的PCI data structure的length,单位是byte。

    Image length(0x10)代表本image的大小,但是是512byte。

    Code type(0x14)代表本image执行的CPU架构。

    Last image indicator(0x15),bit7代表本image是否是ROM中的last image。bit7为1代表是last image,为0代表不是last image。

4、Linux kernel中PCI Expansion ROM相关实现

    在sys文件系统中有对应PCIe设备的expansion ROM的binary。

    在drivers/pci/pci-sysfs.c中有pci_read_rom和pci_write_rom的实现。

    在drivers/pci/pci-sysfs.c中有访问Expansion ROM BAR的实现。

    可以看到pci_write_rom相对来说简单一些,只是根据输入参数设置了一下pci_dev->rom_atter_enable。

    在使用需要先echo 1 > rom,否则read是会返回Invalid argument。

4.1 pci_read_rom实现

pci_read_rom-->pci_map_rom------->pci_enable_rom----->io_remap----->pci_get_rom_size-->memcpy_fromio-->pci_unmap_rom-----> io_unmap----->pci_disable_rom

5、实际例子

    我们拿82599网卡的Expansion ROM举个例子。82599网卡的Expansion ROM BAR size为64K,起始地址为0xa6c10000。我们使能command reg的memory access enable和expansion ROM enable后就可以访问expansion ROM BAR了。

    从PCI Expansion ROM Header 的0x18看,PCI Data Structure在0x40的位置。

    0x40(signature)是0x52494350,0x52在ASCII对应的symbol是R,0x49在ASCII对应的symbol是I,0x43在ASCII对应的symbol是C,0x50在ASCII对应的symbol是P。signature是PCIR。

    0x44(Vendor Identification)~0x46(Device Identification)对应的是0x8086和0x10FB,是intel的82599网卡。

    0x4A(PCI Data Structure Length)为0x1C,代表该image中,PCI data structure到0x5C(0x40+0x1C)后面就是run time code和initialization code。

    0x4D(Class Code)为0x020000,0x02代表Network controller,0x0000代表Ethernet controller。

    0x50(Image Length)为0x78,说明下一个image的header的offset=0x00(当前image的header)+0x78*512=0xF000

    0x54(Code Type)为0x00,代表该image是intel X86,PC-AT compatible的。

    0x55(Last Image Indicator)为0x80,bit7为1,代表当前image是last image。

6、Firmware Power-on Self Test (POST) Firmware

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

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

相关文章

Python爬虫武汉市二手房价格数据采集分析:Linear Regression、XGBoost和LightGBM|代码分享...

全文链接:http://tecdat.cn/?p31958 分析师:Yan Liu 我国有大量的资金都流入了房地产行业,同时与其他行业有着千丝万缕的联系,可以说房地产行业对推动我国深化改革、经济发展、工业化和城市化具有不可磨灭的作用(点击…

WebSocket详解以及应用

😜作 者:是江迪呀✒️本文关键词:websocket、网络、长连接、前端☀️每日 一言:任何一个你不喜欢而又离不开的地方,任何一种你不喜欢而又无法摆脱的生活,都是监狱! 一、前言 我们在…

基于Spring Gateway路由判断器实现各种灰度发布场景

文章目录 1、灰度发布实现1.1 按随机用户的流量百分比实现灰度1.2 按人群划分实现的灰度1.2.1 通过Header信息实现灰度1.2.2 通过Query信息实现灰度1.2.3 通过RemoteAdd判断来源IP实现灰度 2、路由判断器2.1. After2.2. Before2.3. Between2.4. Cookie2.5. Header2.6. Host2.7.…

GEE/PIE遥感大数据处理与典型案例丨数据整合Reduce、云端数据可视化、数据导入导出及资产管理、机器学习算法等

目录 ​专题一:初识GEE和PIE遥感云平台 专题二:GEE和PIE影像大数据处理基础 专题三:数据整合Reduce 专题四:云端数据可视化 专题五:数据导入导出及资产管理 专题六:机器学习算法 专题七:…

2023-8-30 Dijkstra 求最短路(一)

题目链接&#xff1a;Dijkstra求最短路 I #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 510;int n, m; int g[N][N]; int dist[N]; bool st[N];int dijkstra() {memset(dist, 0x3f, sizeof dist);dist[1…

Leetcode每日一题:1448. 统计二叉树中好节点的数目

原题 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff1a;4 解…

C语言网络编程:实现自己的高性能网络框架

一般生产环境中最耗时的其实是业务逻辑处理。所以&#xff0c;是不是可以将处理业务逻辑的代码给拆出来丢到线程池中去执行。 比如像下面这样&#xff1a; ​我们事先创建好一堆worker线程&#xff0c;主线程accepter拿到一个连接上来的套接字&#xff0c;就从线程池中取出一个…

开始MySQL之路——MySQL的DataGrip图形化界面

下载DataGrip 下载地址&#xff1a;Download DataGrip: Cross-Platform IDE for Databases & SQL 安装DataGrip 准备好一个文件夹&#xff0c;不要中文和空格 C:\Develop\DataGrip 激活DataGrip 激活码&#xff1a; VPQ9LWBJ0Z-eyJsaWNlbnNlSWQiOiJWUFE5TFdCSjBaIiwibGl…

python+django+mysql旅游景点推荐系统-前后端分离(源码+文档)

系统主要采用Python开发技术和MySQL数据库开发技术以及基于OpenCV的图像识别。系统主要包括系统首页、个人中心、用户管理、景点信息管理、景点类型管理、景点门票管理、在线反馈、系统管理等功能&#xff0c;从而实现智能化的旅游景点推荐方式&#xff0c;提高旅游景点推荐的效…

MinIO框架安装使用+实现上传需求

MinIO框架 什么是MinIO框架如何安装&#xff08;Docker版&#xff09;安装步骤1. 查询MinIO的服务版本2. 拉取MinIO3.启动报错在docker中没有操作文件的权限 4. 访问 简单配置1.找到创建用户界面2. 设置用户信息3. 创建一个桶 使用MinIO依赖搭建MinIO的初始化API存储桶的基本操…

SaaS多租户系统架构设计

前言&#xff1a;多租户是SaaS&#xff08;Software-as-a-Service&#xff09;下的一个概念&#xff0c;意思为软件即服务&#xff0c;即通过网络提供软件服务。SaaS平台供应商将应用软件统一部署在自己的服务器上&#xff0c;客户可以根据工作的实际需求&#xff0c;通过互联网…

二级MySQL(十)——单表查询

这里我们只在一个表内查询&#xff0c;用到的是较为简单的SELECT函数形式 1、查询指定的字段&#xff1a; 用到的数据库是之前提到的S、P、SP数据库 S表格用到的总数据&#xff1a; 首先我们查询所有供应商的序号和名字 这时都是独立的&#xff0c;没有关系&#xff0c;我们找…

Acwing796.子矩阵的和

理解二维前缀和&#xff1a; #include <iostream>using namespace std;const int N 1010;int a[N][N], s[N][N];int main() {int n, m, q;cin >> n >> m >> q;for (int i 1; i < n; i)for (int j 1; j < m; j) {scanf("%d", &a…

SpringBoot的自动装配源码分析

文章目录 一&#xff1a;什么是自动装配二、springboot的启动流程1.调用SpringApplication&#xff08;&#xff09;的构造方法2.执行核心run方法&#xff08;&#xff09;3.执行核心prepareContext&#xff08;&#xff09;4.执行核心refreshContext&#xff08;&#xff09;5…

机房安全之道:构筑坚固的网络防线

引言&#xff1a; 在数字化时代&#xff0c;机房成为了许多组织和企业的核心基础设施&#xff0c;承载着重要的数据和应用。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;机房的安全性显得尤为重要。本文将深入探讨如何构建坚固的网络防线&#xff0c;保护机房免受攻击的方…

测试理论与方法----测试流程的第四个步骤:执行测试,提出缺陷

8、执行测试—–>提交缺陷报告 测试流程&#xff1a;执行测试—–>提交缺陷报告 1、缺陷的概述&#xff08;回顾&#xff09; 结果角度&#xff1a;实际结果和预期结果不一致 需求角度&#xff1a;所有不满足需求或超出需求的&#xff0c;都是缺陷 2、缺陷的相关属性…

基于React实现无限滚动的日历详细教程,附源码【手写日历教程第二篇】

前言 最常见的日历大部分都是滚动去加载更多的月份&#xff0c;而不是让用户手动点击按钮切换日历月份。滚动加载的交互方式对于用户而言是更加丝滑和舒适的&#xff0c;没有明显的操作割裂感。 那么现在需要做一个这样的无限滚动的日历&#xff0c;前端开发者应该如何去思考…

设计模式--代理模式(Proxy Pattern)

一、什么是代理模式&#xff08;Proxy Pattern&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对该对象的…

requests之post请求data传参和json传参区别

问题描述 在一次接口post测试请求传参异常的记录 print(header)rp requests.post(EvnUrlConfig.getUrl(url),headersheader,datauserDevcieParam)传输到后台服务器报了异常 原因分析&#xff1a; 显而易见我的请求头的content-type类型有异常了&#xff0c;但我明明传的是app…

如何利用人工智能实现软件测试的左移

在本文中&#xff0c;我们&#xff08;作者&#xff09;探讨了如何利用人工智能的力量&#xff0c;在软件测试领域实现左移。 用AI驱动的创新变革测试领域 测试在确保应用程序质量和可靠性方面发挥着至关重要的作用。然而&#xff0c;随着测试要求变得越来越复杂&#xff0c;人…