1.SeaBIOS(2) - 硬件架构
2.浅度剖析 SeaBIOS 之 QEMU 初始化
3.浅度剖析 SeaBIOS 基础组件之 PCI 枚举
SeaBIOS(2) - 硬件架构
每个BIOS设计时都会针对一套特定的硬件架构,考虑其需求与操作,因硬件资源的多样性,BIOS难以涵盖所有情况。SeaBIOS也不例外,它基于奔腾时代的商机资讯源码PC架构,以Intel FX PMC和PIIX芯片组为支撑。
FX PMC作为北桥芯片,连接主板的高速设备,提供处理器的Host总线接口,连接内存DRAM,以及PCI总线接口,构建PCI设备树,涵盖PIIX南桥芯片。
PIIX4南桥芯片连接低速设备,如IDE控制器、地推分销源码DMA控制器、硬盘、USB控制器、SMBus总线控制器,以及ISA总线,用于连接其他低速设备。
由于支持的硬件平台iFX + PIIX过于老旧,已无法满足Intel不断推出的新型芯片组和功能,如PCIe、AHCI。后来,SeaBIOS引入Intel Q芯片组,支持PCIe,以Q MCH作为北桥芯片,ICH 9作为南桥芯片。蚂蚁分类网站源码此平台是Intel在年推出的。
即便QMCH + ICH9的架构已有十多年历史,PMC + PIIX架构更为老旧,但许多虚拟机仍在使用。原因是更新硬件架构的必要性不大,Hypervisor模拟硬件功能而非其内部机制、架构和物理特性。硬件功能与接口保持稳定多年,如PCI接口,模拟时无需大幅改动代码。
理解SeaBIOS的硬件架构对于深入理解其源码至关重要,因为其中包含配置和操作特定芯片组的代码。不理解目标硬件架构,很难解释代码功能。
浅度剖析 SeaBIOS 之 QEMU 初始化
本文旨在深入剖析 SeaBIOS 在 QEMU 中的自动生成公式源码初始化与加载机制,探讨这一开源 位 x BIOS 实现在虚拟化环境下的角色与功能。
SeaBIOS 的初始化与加载过程紧密关联于 QEMU/KVM 架构中的主板模拟与复位流程。本文将从主板固件的配置、初始化、加载,直至进入 BIOS 的逻辑流程,逐一解析这一过程的关键步骤。
首先,主板固件配置在《浅度剖析 QEMU 主板模拟的初始化》一文中已有详述。通过命令行参数或配置文件指定,SeaBIOS 被加载到主板内存模块中,与其它设备一同初始化。
进入固件的初始化阶段,SeaBIOS 的固件在内存中被读入并挂载,但此时并未映射至虚拟机的付费闯关游戏源码物理地址。这一过程在虚拟机复位时完成,复位操作触发了设备的初始化过程,包括 SeaBIOS 的真正加载。
当虚拟机复位时,主板复位函数执行,对所有设备进行复位。在此过程中,SeaBIOS 的复位函数被调用,实现固件从内存映射至虚拟机物理地址的关键步骤。
随着主板复位,CPU 也执行复位操作。这一动作在 QEMU 中通过调用底层函数实现,最终指向 CPU 复位函数的注册。在 QEMU 的架构中,CPU 的复位函数需在初始化阶段通过特定的注册机制(如 qemu_register_reset)实现。
至此,SeaBIOS 的初始化与加载过程结束,虚拟机正式进入 BIOS 环境。这一环境允许执行 BIOS 代码,包括 POST(Power-On Self Test)过程中的关键操作。
深入探讨 SeaBIOS 的源码与实现细节,将作为后续文章的主题,为读者提供更深入的理解与分析。本文旨在提供一个全面而直观的视角,引导读者理解 SeaBIOS 在 QEMU 中的初始化与加载过程,以及其在虚拟化环境中的重要作用。
浅度剖析 SeaBIOS 基础组件之 PCI 枚举
欢迎关注我的公众号:窗有老梅
本文是一篇关于《QEMU/KVM 源码解析与应用》系列读书笔记的番外篇,深入浅出地分析了 SeaBIOS 中 PCI 枚举的实现,并探讨了 PCI 体系下的几个有趣细节。以下内容将引导您了解 PCIe 总线基本架构、SeaBIOS PCI 枚举的实现、以及探讨设备如何得知自己的 bus、device 和 function 号,最后讨论一条总线上最多能挂载的设备数量。
在 PCIe 总线的基本架构中,图1展示了一个直观的总线结构图。理解 PCIe 总线中的 bridge 概念对于深入学习 PCI 架构至关重要,尽管关于 bridge 在 PCI 和 PCIe 下的不同含义,文中并未详细区分。
SeaBIOS 枚举 PCI 的基本流程如下:遍历一条 bus 上的所有 device,以实现系统对硬件设备的全面识别与管理。这一过程对于理解 BIOS 如何与硬件交互具有重要意义。
接下来,本文将深入探讨 PCI 枚举代码背后的一些有趣细节。首先,设备是如何知道自己的 bus 号的。设备的标识 BDF(bus device function)需要通过主机桥在 PCI 总线扫描时分配给设备,此过程基于 DFS(深度优先搜索)策略。当访问到一个 bridge 时,主机桥会为其分配 primary 和 secondary bus number,subordinate bus number 则在 DFS 回溯到当前层时得知。设备在收到的配置报文中包含 bus 和 device 号,此时设备将其记录到寄存器中,类似于当有人敲门告诉你所在的门牌号,你便能知道自己所处的位置。
其次,设备如何得知自己的 device 号。设备的 device 号在与主机桥的交互过程中被确定,实际上,这是基于地址译码电路将 AD[:] 转换成片选信号,实现设备选择。PCI 总线推荐使用 AD[:] 进行地址译码,通过固化的映射关系,每种设备对应唯一的片选信号,从而确定设备号。
设备如何知道自己的 function 号?对于单 function 设备,function 号默认为 0。而对于多 function 设备或支持虚拟 function 的设备,function 号由设备内部管理,无需通过总线枚举确定。
一条总线上能挂载的设备数量受到多种因素限制。理论上,设备的 BDF 寄存器宽度允许最多 个设备。然而,实际限制还包括物理地址译码电路、负载能力,以及内存管理单元(MMU)对地址空间的支持。例如,AD[:] 的输入限制最多只能输出 路片选信号,实际的译码电路输入通常减少到 AD[:],进一步限制到 路。PCI 总线负载能力也限制了最多能挂接 个负载。
通过本文的深入探讨,您可以对 PCI 架构及其在 SeaBIOS 中的应用有更全面的理解,同时对设备识别和硬件交互过程有更深的洞察。