# BIOS 阶段划分

  • SEC : Security (安全) : 处理 平台重 事件,创造一个 临时的内存 区 (此时内存还 未初始化 ),在系统中作为一个可信的 root,传递信息到 PEI
  • PEI : pre-efi initialization (预 EFI 初始化): 初始化 一些 永久的内存 HOBS ( hand-off BLocks ) 中内存,以及在 HOBS 里面的 FV (firmware volume) 位置,传递 控制权到DXE 阶段
  • DXEdriver execution environment (驱动程序执行环境) : 重点 关注,服务器上 硬件驱动的执行环境 ,与 后期外设 的使用,有极大的关系
  • BDS : boot device select (引导设备选择) 初始化 console设备 ;加载设备驱动;尝试 加载和执行启动项
  • RTrun time service (运行时服务) :此时与 bootloader 关系 紧密
  • AL : after life ( transition from the os back to the environment ) of system

#BMC 通信

# 基础了解

# 平台管理

  • 平台管理 ( platform managemet) : 平台管理表示一系列的 监视控制 功能, 操作的对象系统硬件 ,比如监视系统的 温度电压风扇电源 等,并 做响应的 调节工作,以保证系统处于 健康状态 。若系统 不正常 ,通过 复位方式 重启

平台管理

  • BMC : Baseboard Management Controller) : 把上面的功能集成到一个 控制器 上,称为 基板管理控制器BMC 是一个独立的系统,它不依赖系统上的 其它硬件 (如 CPU , 内存 ),也不依赖于 BIOS , OS 等,但 BMC 可以与 BIOSOS 交互。BMC 本身也是一个 带外处理器 (一般都是 ARM 处理器) 的小系统,单独用来处理某些工作,其中重点还是平台管理

  • BMC 通过不同的 接口系统 中其它 组件连接LPCI2C , SMBUS , Serial基本接口

  • IPMI , 它是与 BMC 匹配的 接口 ,所有 BMC 都需要实现这种接口

# IPMI

IPMI 全称 Intelligent Platform Management Interface 智能平台 管理接口IPM 是对 平台管理 概念的 具体规范 ,该规范定义了 平台管理 的软硬件架构, 交互指令事件格式数据记录能力集 等,而 BMCIPMI 中的一个 核心 部分,属于 IPMI 硬件架构。

IPMI智能平台管理接口

# BIOS 通信

BIOSBMC 之间的通信,主要使用 IPMI 。共有 两个 阶段 PEIDXE (包括 DXE 后面的),用的是不同的 IPMI 函数 (重点 注意 )

虽然后使用 IPMI ,但使用 两个 通道分别是 KCSBT ,一般 使用KCS 通道。

BMC不会 主动与 BIOS 通信,BIOS 会发送 IPMI命 令给 BMC , BMC 如果 成功接收 的话,就会有个 返回信息BIOS

# 如果 BMCBIOS 产生了通信故障

  • 确认 BIOS 是否发送了 IPMI命令BMC , 可以查看 BMC 返回的 completion code ;
  • 确认 BMC 是否收到了 BIOS 发送的 IPMI命令
  • 如果 BIOS 发送了 IPMI命令 ,但是 BMC未接收 :可能是 BMCIPMI进程 正处于 忙碌状态 ,所以 丢掉 了这条 IPMI命 令 (BIOS 如果发送失败,可以 尝试多次 发送;另外可以 稍微调高KCS通道延时 );当然,也有可能是 BMC 的 IPMI进程 挂了
  • (极少见) 一条IPMI 命令通常设计 2个底层 实现函数, SendDataToBmcPort()ReceiveBmcDataFormPort() 。接收时,BIOS 从 KCSI/O端口 读取 数据 ,读完后,会 检测KCS寄存器OBF状态寄存器 ,如果 BMC没有写 数据,就会 计数-1延时5ms ,然后重试,当 BMC 一直不写数据时, 计数到0 , 就认为 BMC有故障 ,返回 Device Error ;

# ACPI

Advanced Configuration and Power Interface 简称 ACPI高级配置电源接口 ,提供操作系统应用程序管理所有电源管理接口。

对于 BIOS 而言, ACPI 最直观的就是 电源功耗 ,从而 影响CPU性能

# OS Loader

操作系统加载器: 引导 加载 程序

OS loader 可以通过 BS(Boot Services)RT 使用 UEFI 提供的服务,并且将 计算机的资源 转移到 自己手 中,此过程称为 TSL(Transient System Loader) 。在此阶段结束之后, OS Loader 会调用 ExitBootServices()函数 ,结束 BS 并且 回收BS占用的资 源,然后 BIOS 会进入 RT阶段 ,然后 OS loader 会加载 操作系统内核 ,逐渐进入 OS,此过程称为 TSL ( Transient System Load )

BDS 阶段, BIOS 会选择 可启动项 ,按照 设置的顺序逐一 尝试,经过 校验之后 ,加载 OS Loader

BIOSBDS 阶段)----> OS Loader ----> OS

引导区位于 FAT32 格式分区。一般 FAT32 位于磁盘的最开始,大小 1MB 左右。

  • UEFI 会把 FAT32的格式 都当做启动磁盘都添加到 启动菜单

  • 在启动盘 UEFI/Boot/BootX64.efi 中加载

# 硬盘启动盘文件也都位于此
EFI/Boot/BootX64.efi
# 32 位系统无需 + X64

系统启动编译结构

系统内核加载架构

USB重装系统过程

# UEFI

UEFI ( Unified Extensible Firmware Interface , 统一可扩展固件接口) 提供给 操作系统 的接口包括 启动服务 ( Boot ServiceBS ) 和 运行时 服务 ( Runtime Service , RT ) 以及 隐藏BS之后 的丰富的 Protocol (协议), BSRT 的形式 (C 语言中的 结构体 ) 存在。

UEFI 的实现分为两部分

  • 平台初始化
  • 固件 - 操作系统 接口

# 组成

OS Loader 可以通过 BSRT 使用 UEFI 提供的服务,将计算机资源逐渐转移到自己手中,这个过程为 TSL (Transient System Load)

UEFi系统组成

OS Loader 完全 掌握 了计算机资源时, BS 也就 完成 了它的 使命OS Loader 调用 ExitBootServices() 结束 BS回收BS 占用的资源,之后计算机系统进入 UEFI Runtime 阶段

# BS 提供的服务 (TSL 阶段)

UEFI 提供给操作系统的 接口 ,包括 启动服务 ( Boot Services , BS )

  • 事件 服务:事件时 异步 操作的基础,有了 事件 的支持,才能够在 UEFI系统内 执行 并发操作
  • 内存 管理:提供内存的分配与释放,管理系统内存映射
  • Protocol 管理:提供了 安装与卸载 Protocol 的服务,注册通知函数的服务
  • Protocol使用类 服务: Protocol 的打开与关闭,查找支持 Protocol控制 ,例打开设备上 PciloProtocol , 用 PciIo->Io.Read() 服务读取设备上的 寄存器
  • 驱动管理 :包括用于将驱动安装到控制器的 connect服务 ,以及将驱动从控制器上 卸载的disconnect服务 。若启动时,需要网络服务,通过 loadImage 将驱动加载到内存,通过 connect 服务将驱动安装到设备
  • Image管理 :加载,卸载,启动和退出 UEFI 应用程序或驱动
  • ExitBootServices :用于结束启动服务

# RT 提供的服务

UEFI 提供给操作系统的 运行时 服务

  • 时间 服务:读取 / 设定系统时间,
  • 读取 UEFI系统变量 :读取 / 设置系统变量,例如 BootOrder 用于指定 启动项顺序 ,通过系统变量保存系统配置
  • 虚拟内存 服务: 将 物理地址 转换为 虚拟地址
  • 其它服务:包含 重启系统的ResetSystem , 获取系统提供的 下一个单调单增值

# UEFI 启动过程

image-20230728095402333

启动过程任务

# SEC 阶段

Security Phase , 当 CPU 收到 ResetVector 信号后,开始执行 第一行 代码, 平台初始化的第一个阶段,安全阶段, 最早 运行的固件代码,此模块 相当部分 使用 汇编 语言开发。

电脑的开机或者重启, 本质 上是给 CPU 发送了一个 ResetVector 信号。

由于 没有初始化内 存,会 临时使用CPU 的缓存,内嵌在 CPU 中,初始化好的,

SEC 作为整个系统执行的起点,可能遇到各种异常,就需要设置 IDT ,有了中断描述符表接受异常,就能让系统遭遇意外情况时,不至于崩溃,为 PEI 阶段设置临时 内存的基地址和长度 并传给 PEI,同时将 PEI 代码的入口点,将控制权移交过去,并且处理临时内存。

# 位于 EDK2 如下目录
UefiCpuPkg/ResetVector/Vtf0

# SEC 阶段任务

  • 接受并处理系统 启动重启 信号,以及运行过程中的 严重异常 信号
  • 初始临时存储区域 ,启动系统需要的一些临时 RAM ,空间资源仍然 稀缺
  • 作为 可信系统 根传递给下一个 阶段PEI

image-20230728111306147

# Reset Vector

  • 进入 固件入口
  • …..

# PEI 阶段

PEI : Pre-EFI Initialization

  • 资源 十分 有限PEI后期 进行内存 初始化
  • DXE 准备执行环境,将需要传递的信息组成 HOB 列表,将控制权移交到 DXE 手中
  • PEI Foundation : 负责接受 SEC 发送的交换数据,并扮演 模块分发 的角色
  • PEIMs-EFI Initlization Modules 是模块化的, PEI 阶段的 4 档事情就是交给 PEIMs 完成,完成后就来到了 DXE阶段

系统的初始化 ,找出系统中所有的 PEIM ,并根据 PEIM 之间的依赖关系按照顺序执行 PEIM ,

# PEI 入口函数

  • 系统当前的状态,判断 系统健康状况
  • 可启用 固件的地址大小
  • 临时 RAM区域地址大小
  • 地址大小

# PEI 执行流程

FEI执行流程

PEI 阶段, PEIMPPIHOM 组成了 PEI 阶段,PEI 阶段的 module 可理解为 Driver 就是 PEIMPEI阶段 就是由一个一个的 PEIM 组成的; PPIPEIM 之间相互调用的接口,由唯一的 GUID ( 全局统一标识符 ) 引导,内部也包含一些 接口 ,HOB 相当于信件在 PEI 阶段创建,会记录当前系统的信息,可以 自定义HOB ,然后在 DXE阶段读出

PEI阶段

PEIM : PEI Module ,会被编译成 efi binary

在一套的 BIOS code 编译完之后,进入到 build目录 就可以找到 PEIM 具体的 efi

PPIsPEIM-to-PEIM Interfaces ,PEIMs 被调用通过 PPIInterface 。调用函数必须通过 PPI 接口

  • PPI 名称: GUID (128-bits)
  • PPIs 结构体,PPI 就是一个结构体,可能包含的功能,数据。
  • PEIM 会把 PPI 注册到 PEI Foundation 。 ( PEI Foundation 管理着庞大的 PPI 数据库)
  • Core Services 包含后面 phase 用到的各种 Services。在 PEI 阶段 get 当前计算机启动的 boot Mode 有直接定义的 PEI Service 函数,在 DXE 以及后面的阶段要通过 HOB 方式通过 get HOB LIS T 然后拆解信息进行 ge 启动 boot Mode
  • Core Dispatcher 负责派发个 PEIMs , 将 PEIM 按照既定的顺序 Load 并执行, Dependency 顺序,就是 inf 文件里面的 depx , 满足条件可执行
  • PEIM Entry 可能使用其它 PEIMPPI
  • PEI Core 最后会找到 DXE 获得之前 phase Data 是从 HOB 里拿到,PEI Core 会创建 HOB,PEI 和 DXE 都可以使用 HOB的Data

函数:

  • InstallPPI 安装 PPI 到 PEI foundation , Protocol install 安装完毕后放到 Handle Database
  • LocatePPI() :根据 PPI 名称 GUIDPEI foundationInterface
  • NotifyPPI() : PPI 里的 function 不会在派发时就执行,通知系统此 PPI 会在某个 PPI 被安装时才执行

# Install PPI

/**
  Install PPI services. It is implementation of EFI_PEI_SERVICE.InstallPpi.
  这是个 service,PEI foundation 提供的。 通过 GUID 安装。目的是让别人调用。
  @param PeiServices                An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  标准格式,入口第一人参数是铁定的 EFI_PEI_SERVICES 指针
  @param PpiList                    Pointer to PPI array that want to be installed.
  第二个参数是 PPI List, LIST 里包括 Flag、GUID 和函数 参考.h 里的 EFI_PEI_PPI_DESCRIPTOR 定义
  @retval EFI_SUCCESS               if all PPIs in PpiList are successfully installed.
  @retval EFI_INVALID_PARAMETER     if PpiList is NULL pointer
                                    if any PPI in PpiList is not valid
  @retval EFI_OUT_OF_RESOURCES      if there is no more memory resource to install PPI
**/
EFI_STATUS
EFIAPI
PeiInstallPpi (
  IN CONST EFI_PEI_SERVICES        **PeiServices,
  IN CONST EFI_PEI_PPI_DESCRIPTOR  *PpiList
  );

# HOB

HOB( Hand-Off Blocks ):传输信息的载体, PEIDXE 联系薄弱, DXE 需要知到 PEI初始化 的硬件内存等数据, HOB 作为 桥梁

HOB 实际就是一个 链表 ,当我们找到 hoblist 的头,那么整个链表的数据都能得到, GetHobList() 获取 hoblist指针

  • 一个HOB 总是 PHIT==Phase Handoff GetHobList(), 里面是 boot mode
  • 其它 HOB 可能出现在 List任意位置 ,最重要的是 System Memory HOB & Firmware VolumesHOB 列表总是会以 END_OF_HOB_LIST 结束

HOB链表

# 添加新的 HOB

/**
  Add a new HOB to the HOB List.
  @param PeiServices        An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
  @param Type               Type of the new HOB.
  @param Length             Length of the new HOB to allocate.
  @param Hob                Pointer to the new HOB.
  @return  EFI_SUCCESS           Success to create HOB.
  @retval  EFI_INVALID_PARAMETER if Hob is NULL
  @retval  EFI_NOT_AVAILABLE_YET if HobList is still not available.
  @retval  EFI_OUT_OF_RESOURCES  if there is no more memory to grow the Hoblist.
**/
EFI_STATUS
EFIAPI
PeiCreateHob (
  IN CONST EFI_PEI_SERVICES  **PeiServices,
  IN UINT16            Type, // 对于自定义的 HOB 一般使用 EFI_HOB_GUID_TYPE
  IN UINT16            Length,
  IN OUT VOID          **Hob
  );

# DXE 阶段

Driver Execution Environment 驱动执行环境,主要任务是把基本驱动程序加载起来,建立两者之间的联系。

执行 大部分系统初始化 的工作,此阶段内存已经 完全初始化

  • DXE内核 :复杂 DEX 基础服务和执行流程
  • DXE派遣器 :负责调度执行 EXE驱动 ,初始化系统 设备

DXE阶段执行流程

typedef EFI_STATUS(EFIAPI *EFI_IMAGE_ENTRY_POINT)
(
    IN EFI_HANDLE ImageHandle,
    IN EFI_SYSTEM_TABLE *SystemTable
)

驱动 之间通过 Protocol 进行通信。

  • Protocol 特殊结构体保存着对应的 GUID ,利用系统 BootServicesOpenProtocol ,并根据 GUID 打开对应的 Protocol ,进而使用 对应的服务 。当所有的 driver 执行 完毕 ,系统 完成初始化

# DXE Core

DxeMain() 是 DXE 阶段执行的 主函数 ,同时以 参数形式 接受 PEI 阶段的 HOB表

  • 创建 EFI System Table 在随后的 DXE Drive r 中逐步完善 table
  • 生成 Boot Services / Run Time Services / DXE Services
  • 调用 Dispatcher ,所有的 DXE Driver 在这个函数中 被检测执行
  • Driver 执行完毕之后,执行特殊的 DXE Driver 进而进入 BDS 阶段

# DXE Dispatcher

  • BIOS 芯片中搜寻 DXE Driver
  • 检测并按照相应的顺序执行所有的 DXE Driver , 在每个 driverinf 文件的 driver 依赖条件都成立时,该 driver 才被执行

DXE Dispatcher

# BDS 阶段

全程: Boot Device Select

U 盘就是寻找具有 FAT32分区 的设备

执行启动策略 BDS 三大任务: console初始化Driver初始化BootDeviceSelect :用户选择 BDS加载 启动选项里的 OS loader ,最后移交真正的 控制权OS loader ,由 OS Loader 将

  • 初始化控制台设备:查看系统有 多少 加载必要的设备驱动:启动所有检测到的设备,加载 driver
  • 根据系统设置加载和执行启动项 (若加载失败,系统将重新执行 DXE dispatcher 以加载更多的 驱动 ,然后重新尝试加载 启动项 )

DXE执行流程

# BDS Steps

  • 初始化 语言字符串 数据库
  • 获得 当前启动模式
  • 基于 启动模式 建立 设备清单
  • 连接 设备
  • 检测 input output 设备
  • 执行 内存测试
  • 进程 引导选项

BDS Steps

# TSL 阶段

Transient System Load : 操作系统 OS Loader 执行的第 一阶段 ,首先作为 UEFI 程序运行,之后 TSL 退出,系统进入 Run Time 阶段。OS loader 的主战场,TSL 是正式操作系统加载前的预备阶段,需要 Loader 找到并加载 OS

# RT 阶段

Run Time : 系统控制权从 UEFI 内核转交到 OS Loader 手中,UEFI 资源回收到 OS Loader。在 OS Loader 中 OS 获取系统控制权。

# AL 阶段

After Life 如果系统 / 软件遇到灾难性错误,系统固件需要提供错误处理和灾难性恢复机制,此机制运行在 AL (After Life) 阶段。

常驻UEFI 驱动组成,计算机 关机 休眠 睡眠 重启过程中的系统信息都会在这一阶段 保存

# 源码部分基础

# 源码类型定义

typedef unsigned __int64  UINT64;
typedef __int64           INT64;
typedef unsigned __int32  UINT32;
typedef __int32           INT32;
typedef unsigned short    UINT16;
typedef unsigned short    CHAR16;
typedef short             INT16;
typedef unsigned char     BOOLEAN;
typedef unsigned char     UINT8;
typedef char              CHAR8;
typedef signed char       INT8;

# 一些硬件补充

# Hardware Monitor

读出所有计算进访问 传感器测试值

  • 不同地点的 temperature 读数 CPU and system temperature
  • 智能风扇 控制:风扇转速侦测和风扇控制输出
  • 电压监控

# 分时复用

是采用 一物理链接 的不同时段来传输不同 的信号 ,能达到 多路复用 的目的。通过事件上 交叉 发送每一路信号的一部分来实现一条电路传送多路信号。

将整个传输时间分割为 互不重叠 的时间间隔,又称为 时隙

  • 同步分时复用( STDMSynchronous Time Division Multiplexing ):采用 固定间隙 分配方式,即将传输信号按特定长度连续地 划分特定 的时间段或者一个 周期
  • 异步分时复用(ATDMAsynchronous Time Division Multiplexing ):根据用户市级需要动态分配资源的分时复用记数。

# PCI

  • 局部总线:局部总线是在 ISACPU总线 之间添加 一级总 线或 管理层 。这样可将一些 高速外设如图形卡 ,硬件控制器等从 ISA 总线上卸下而通过局部总线直接挂接在 CPU 总线上,使之余高速能与 CPU 总线相匹配。
  • PCI (Peripheral Component Interconnect) : Intel 1991 年推出的用于定义 局部总线 的标准。 PCI 不同于 ISA 总线,PCI 数据地址总线于数据总线是分时复用。以方便可以节省接插件的管脚数,另一方便便于实现数据传输。

# USB

USB总线 提供 中低速率 外围设备的扩充能力,像键盘,鼠标,遥感,喇叭,麦克风等设备,只要是 USB 接口设计,就可以以 热拔插Hot Plug ) 的方式,直接跟计算机连接或拆除 (离线),计算机与 OS会自动检测 并启用 / 禁用该设备,达到真正的即插即用。

新近的 BIOS 直接提供了 USB设备驱动读写 功能,比如开始就可以使用 USB键盘鼠标 以及 USB软盘 ,硬盘甚至 USB CD-ROM 来开机。

# ACPI

高级配置和电源管理接口: Advance Configuration and Power Management Interface . 早先 ACPI 将电源管理几乎全部分配给了 BIOS控制 ,限制了 操作系统 在控制电脑。系统可能进入 极地功耗 消耗状态,这些就是可利用多数桌面型电脑上睡眠和休眠设置

节电方式:

  • 显示屏 自动断电
  • 系统把当前信息存储在 内存 中,只有内存等几个关键部件通电,即挂起到内存
  • 挂起到硬盘 ,计算机自 动关机 ,关机千将当前数据存储在硬盘上。

# 中断向量表

中断向量表内存 中保存,其中放着 256个中断源 所对应的中断处理程序入口

什么是中断向量表

# 英语

  • Keyboard Power On : 键盘开机
  • Wake on LAN : 网卡遥控开机
  • 调制解调器 / 传真机来电开机( Modem Ring On )
  • CPU 过热防护: CPU Overheat Protection
  • 超频功能: Overclocking

# 参考资料

  • 什么是 BMC
  • gxh1992 博客
  • 《UEFI 原理与编程》
  • PEI 阶段扩展
  • DXE
  • 图表化呈现
此文章已被阅读次数:正在加载...更新于

请我喝[茶]~( ̄▽ ̄)~*

YuHeShui 微信支付

微信支付

YuHeShui 支付宝

支付宝

YuHeShui 贝宝

贝宝