PCIe Expansion ROMs

目录

  • PCIe Expansion ROMs
    • 1. 为什么需要Expansion ROM
    • 2. 怎么知道PCIe设备是否包含Expansion ROM
    • 3. 怎么知道Expansion ROM的空间大小
    • 4. Expansion ROM里存了什么
      • 4.1 不只一份Code Image
      • 4.2 Code Image格式
        • 4.2.1 Header Format
        • 4.2.2 Data Structure Format

1. 为什么需要Expansion ROM

为了将操作系统加载到内存中,系统需要三类设备:

  • 存储设备:用于保存操作系统。
  • 显示设备:用于显示当前的启动进度。
  • 输入设备:用于接收用户输入信息。

在这个阶段,操作系统还没有被加载到内存执行,也就意味着操作系统中对应的设备驱动程序也没有被加载,因此,就需要在Expansion ROM里面存放一份启动阶段使用的设备驱动程序。

说的直接点就是,BIOS阶段向使用一个PCIe设备,但是原始的BIOS不包含这个设备的驱动程序,这个时候就从这个PCIe设备Expansion ROM里获取设备驱动程序代码,并加载到内存中执行。

2. 怎么知道PCIe设备是否包含Expansion ROM

并不是所有PCIe设备都包含Expansion ROM,所以就需要软件进行判定。

在PCIe的配置空间(PCIe Configuration Space)里有个叫“Expansion ROM Base Address Register”的东西,利用它判定Expansion ROM的步骤如下:

  • 向Expansion ROM Base Address Register写入0xFFFF FFFF。
  • 读取Expansion ROM Base Address Register,如果值是0,那就表示不存在Expansion ROM(Game Over!)。如果读取的值非0,那就表示存在Expansion ROM,但这并不就表明这东西可用了,还需要下面的判定步骤。
  • 给PCIe Expansion ROM分配一个合适的地址,把地址的值写入Expansion ROM Base Address Register。
  • 将Expansion ROM Base Address Register bit 0置为1,使能Address Decode。
  • 读取ROM的前两个字节,如果前两个字节是AA55h,那就表明当前ROM是合法可用的,否则还是Game Over

3. 怎么知道Expansion ROM的空间大小

在Expansion ROM的判定阶段,有一个过程是向Expansion ROM Base Address Register写入0xFFFF FFFF,然后读取它的值,利用这个值就可以判定出Expansion ROM的空间大小。

假设写入0xFFFF FFFF之后,读出的值是0xFFFE 0000,那么第17位就是非0值的最低位,那么Expansion ROM的大小就是2^17 Bytes= 128KB。PCI文档规定,ROM最大可为16MB,即bit[31:25]必须是可读/可写的。

4. Expansion ROM里存了什么

4.1 不只一份Code Image

就像之前提到的,ROM存了设备的驱动程序代码,专业点叫做code image。实际上,PCI协议规定ROM里可以存放不只一份code image,不同的code image对应不同的处理器架构同一供应商的不同产品等等。BIOS或者其他软件需要选择最合适的code image提取到内存中执行。

每一份code image包含run-time code image和initialization code image两部分。BIOS或其他上位机软件按照如下步骤使用code image:

  • 将最合适的code image拷贝的内存中。
  • 将Expansion ROM Base Address Register bit 0置为0,关闭Expansion ROM’s address decoder。
  • 执行initialization code。
  • 释放initialization code所占用的内存。
  • 将剩余的code image所占用的内存部分设置为写保护(write-protected),避免被修改。

4.2 Code Image格式

4.2.1 Header Format

在每个image最开始的地方都有一个Header,因此可以叫它code image header。

下面的表格描述了code image header的格式(第一列的offset是指相对于该image起始位置的偏移):

Offset 02h~17h的位置存放的是处理器相关的数据,其格式如下表:

4.2.2 Data Structure Format

Data structure中包含了设备信息和image信息。

由于code image header中使用两个bytes存放指向data structure的指针,所以data structure只能存放在该code image的前64KB范围内。

当code image中包含run-time code时,data structure必须放在run-time code中。但是在某些情况下,code image可以不包含run-time image,只有initialization code,此时data structure放在initialization code中。

Data Structure格式如下表:

  • Vendor ID & Device ID & Class Code :只有当这三个参数与设备匹配时,该image才会被BIOS加载到内存中执行。
  • Code Type:表明当前image的执行条件。
    • Code Type = 00h:Intel x86 (兼容IBM PC-AT)架构可执行代码。
    • Code Type = 01h:符合open firmware标准,可结合OpenBoot使用。
    • Code Type = 02h:HP PA/RISC架构可执行代码。
    • Code Type = 03h:Extensible Firmware Interface(EFI)

参考资料:《PCI Express System Architecture》

PCIe Expansion Roms相关推荐

  1. Kernel PCI总线框架

    2019独角兽企业重金招聘Python工程师标准>>>     1,PCI总线介绍 在PC时代的早期,外部设备通过ISA总线接入计算机.ISA总线只有24根地址线,因此其上的外部设备 ...

  2. linux网卡驱动源码分析

    转自http://blog.csdn.net/ustc_dylan/article/details/6329375 网络驱动是一种典型的PCI设备驱动,无论在嵌入式平台还是在PC领域,网络相关的项目开 ...

  3. Linux源码研究-用户管理员手册-内核命令行参数

    下面的列表是__setup(), core_param()和module_param()宏实现的内核参数,内核从命令-开始解析参数,如果参数不被识别,也不包含".",参数会被用来启 ...

  4. 【WIFI】mtk7621驱动

    mtk7621驱动 无线驱动在完成驱动注册的同时,需要进行 cfg80211接口注册(提供命令支持). 1. 驱动 mtk wifi驱动基于pci进行扩展,第一个文件:/os/linux/pci_ma ...

  5. linux网卡驱动源码分析(一)

    linux网卡驱动源码分析(一) linux struct linux内核 网络 descriptor resources 转自http://blog.csdn.net/ustc_dylan/arti ...

  6. Linux内核引导简析

    bootsect.S.setup.S.head.S分析 收藏 2010-01-14 13:36:34 bootsect.S,系统引导程序,一般不超过512字节. 在PC系统结构中,线性地址0xA000 ...

  7. PCI总线体系结构概述

    §1.PCI总线体系结构概述  PCI总线体系结构是一种层次式的(Hierarchical)体系结构.在这种层次式体系结构中,PCI桥设备占据着重要的地位,它将父总线与子总线连接在一起,从而使整个系统 ...

  8. 关于BIOS加载BOOT.S的经典解答

    摘录论坛问答(一) 问:我需要一个什么样的环境才能编译 0.11的内核 ,比如应安装什么版本的linux ,什么样的硬件比较好.需要在安装LINUX的机器上再安装什么软件包和编译工具. 答: 一般带有 ...

  9. MIT-OS实验-lab1

    Lab 1 Part 1:PC Bootstrap 1.预备知识: BIOS: 第一代PC处理器是16位字长的Intel 8088处理器,这类处理器只能访问1MB的地址空间,即0x00000000-0 ...

  10. 构建nas_我的第一个diy nas服务器构建

    构建nas One of the things I've wanted to do for a long time is to consolidate all my NAS and NAS-ish d ...

最新文章

  1. c# 建立到数据源的连接 以及获取项目配置文件的属性
  2. Java 7之集合类型 - 二叉排序树、平衡树、红黑树---转
  3. linux关于文件夹的知识,Ubuntu 7.10 系统文件夹相关知识
  4. 洛杉矶手机资费9.9美元包打一年
  5. WordPress内核站群全自动新闻采集发布源码,单站专用
  6. BZOJ2612 : [Poi2003]Sums
  7. 【MySQL】MySQL 一些 使用 案例
  8. Java知多少(56)线程模型
  9. Leetcode - 广度优先遍历专题
  10. ASP.NET网站限制访问频率
  11. 正态分布的前世今生:正态分布的各种推导
  12. BZOJ1108 [POI2007]天然气管道Gaz
  13. 【ResNet翻译】Deep Residual Learning for Image Recognition
  14. 红警win10黑屏和不显示菜单栏问题 只有声音没有图像的解决
  15. Form 电子表格(JTF GRID)
  16. Pycharm修改图片大小
  17. 炒伦敦金哪个平台正规?2021香港排名前10伦敦金交易平台一览
  18. 对大学计算机课程的认识 感想,大学计算机基础学习感想复习课程.pdf
  19. 云计算机具有什么特点,云计算具有哪些特点?
  20. 谷歌浏览器将在2023年2月7日起停止支持Windows 7和8.1版

热门文章

  1. 网络统考计算机操作题分数占比,计算机一级office考试 word占多少分值?
  2. 什么是devicenet跟以太网啥区别
  3. 视频切片mp4格式转换m3u8
  4. ssh 所选的用户密钥未在远程主机上注册
  5. MFC 树形控件的使用
  6. 多媒体计算机硬件指示,多媒体计算机硬件系统构成
  7. 银行利率bps是什么意思,贷款利率bps是什么意思
  8. 唐诗欣赏静夜思用html设计,古诗鉴赏:静夜思
  9. 洛谷P2440 木材加工 —二分答案
  10. 华中师范大学计算机学院学分绩,华中师范大学全日制本科交换生学分转换、成绩认定管理办法...