【BIOS/UEFI】SMBIOS

news/2024/12/29 22:55:31/

       SMBIOS( System Management BIOS)是主板或者系统制造商以标准格式显示产品信息所遵循的规范。依据该规范,BIOS在POST阶段可以知道如何去创建。OS阶段,操作系统和应用程序知道如何使用,解释内存区域表示什么意思。在物理上,SMBIOS是上电开机,BIOS在内存中建立的一块区域,保存了平台的相关信息。在 EFI 系统中,SMBIOS 表的地址可以通过 SMBIOS GUID (SMBIOS_TABLE_GUID)在 EFI 配置表(EFI Configuration Table)中找到 。

        SMBIOS 表中 SMBIOS 记录的总数可以从其起始数据结构 (SMBIOS Entry Point Structure)中获得。应用程序可以从 SMBIOS Entry Point Structure 中获得所有 SMBIOS 记录的起始地址,并且通过遍历每一个 SMBIOS 记录来获得各种系统信息。

        SMBIOS_TABLE_ENTRY_POINT:

        SMBIOS 表的起始数据结构和 SMBIOS 记录的关系:

        每一个 SMBIOS 记录包含两个部分,一是 SMBIOS 规范定义的部分,该部分是必须存在的;另一个是非规范定义的部分,该部分是可选的(SMBIOS 规范没有定义该部分的内容和长度)。每一个 SMBIOS 记录都必须以 0000h 做为结束标志。

        当一个 SMBIOS 记录的规范定义部分的某个域是字符串,该域只存放字符串在非规范定义的部分的索引号,字符串的内容放在非规范定义部分。 

SMBIOS 数据结构 

EFI_SMBIOS_PROTOCOL 

        EFI_SMBIOS_PROTOCOL 是 PI 规范中定义的协议。它给用户提供了接口用来添加,获取或 者删除 SMBIOS 表。产生 EFI_SMBIOS_PROTOCOL 协议的驱动负责创建 SMBIOS 表并且将 SMBIOS 表的指针安装到 EFI 系统配置表 (EFI System Configuration Table) 中。SMBIOS 协议的 调用者需要保证添加的 SMBIOS 表与 MajorVersion 和 MinorVersion 规定的 SMBIOS 规范的版 本一致。

Add: 增加一条 SMBIOS 记录(SMBIOS Record)到 SMBIOS 表中;

UpdateString:更新某条 SMBIOS 记录中字符串内容;

Remove: 删除某条 SMBIOS 记录;

GetNext: 遍历所有的 SMBIOS 记录;

MajorVersion:SMBIOS 表的主版本号;

MinorVersion:SMBIOS 表的次版本号。

EFI_SMBIOS_RECORD_HEADER

每一条 SMBIOS 记录都由 EFI_SMBIOS_RECORD_HEADER 和 SMBIOS 记录的内容构成的。 

 

         HeaderSize 是 EFI_SMBIOS_RECORD_HEADER 的大小,RecordSize 是包括 EFI_SMBIOS_RECORD_HEADER 大小 在内的整个 SMBIOS 记录的大小。ProducerHandle 是 SMBIOS 记录创建者的句柄,用来标识 该 SMBIOS 记录的创建者。NumberOfStrings 是该 SMBIOS 记录中字符串的数量。

EFI_SMBIOS_ENTRY

        所有 SMBIOS 记录构成一个单向循环链表,链表中每一个节点的数据结构定义如下。

         RecordHeader 指向某条 SMBIOS 记录,Link 用来构成该单向循环链表,并且可以通过 SMBIOS_ENTRY_FROM_LINK 来获取 Link 所在的数据结构 SMBIOS_ENTRY_FROM_LINK。

SMBIOS_INSTANCE

        实现 EFI_SMBIOS_PROTOCOL 协议的驱动定义了 SMBIOS_INSTANCE 内部数据结构。 Signature 用来标识这个数据结构,其定义如下:

       Handle 用来安装 EFI_SMBIOS_PROTOCOL 协议。Smbios是 EFI_SMBIOS_PROTOCOL 协议的实现。 DataListHead 是由多个 SMBIOS 记录组成的链表。AllocatedHandleListHead 用来记录已经分配 给 SMBIOS 记录的句柄(Handle)。

        SMBIOS 驱动模块用两个链表维护系统中所有产生的 SMBIOS 记录。以 DataListHead 为起始的链表记录了系统中已经产生的 SMBIOS 记录,以 AllocateHandleListHead 为起始的链表记录 了产生的 SMBIOS 记录的句柄(Handle)。 SMBIOS 规范要求每一个 SMBIOS 记录的句柄是不能重复的,当用户添加一个新的 SMBIOS 记录时,SMBIOS 驱动模块就用 AllocateHandleListHead 链表获得一个未用的句柄,用来产生新的 SMBIOS 纪录。

SMBIOS_HANDLE_ENTRY  

        SMBIOS_HANDLE_ENTRY 数据结构组成了一个链表,记录了已经使用的 SMBIOS 句柄。我们 可以通过查找这个链表知道一个 SMBIOS 句柄是否已经被一个 SMBIOS 记录使用。可以通过 SMBIOS_HANDLE_ENTRY_FROM_LINK 来获取 Link 所在的数据结构 SMBIOS_HANDLE_ENTRY。 

EFI_SMBIOS_TABLE_HEADER

        EFI_SMBIOS_TABLE_HEADER是 SMBIOS 记录中特定的数据。其中,Type 是 SMBIOS 记录的类型,0~127 是 SMBIOS 规范使用的,128~256 可以让 BIOS 厂商使 用。Length 是该 SMBIOS 记录的大小。Handle 是标识该 SMBIOS 记录的唯一的句柄。     

SMBIOS 函数

        SmbiosAdd() 用来增加一条 SMBIOS 记录,即增加一个新的 SMBIOS 记录在DataListHead 链表中,以及增加一个新的 SMBIOS 句柄在 AllocatedHandleListHead 链表中。

        SmbiosRemove() 根据调用者传入的 SMBIOS 句柄(SmbiosHandle)删除某个 SMBIOS 记录。

        SmbiosGetNext() 用于遍历所有的 SMBIOS 记录。

        SmbiosTableConstruction() 是 ReadyToBoot 事件的回调函数,当 ReadyToBoot 事件被触发时被 调用。它根据所有的 SMBIOS 记录创建最终的 SMBIOS 表,并且安装到 EFI 系统配置表(EFI System Configuration Table)中。

        SmbiosCreateTable() 根据所有的 SMBIOS 记录创建最终的 SMBIOS 表。

【关于SMBIOS的添加和读取本人已经上传了C代码资源,如有需要请移至下载处自行下载。

资源连接:https://blog.csdn.net/weixin_45258382?type=download 】


http://www.ppmy.cn/news/548562.html

相关文章

Java 字符串截取方法大全,助你轻松应对各种场景

系列文章目录 文章目录 系列文章目录前言一、使用 substring() 方法截取字符串的一部分二、使用 split() 方法按指定分隔符截取字符串三、使用 substringBefore() 和 substringAfter() 方法截取指定字符串之前和之后的内容四、使用 substringBetween() 方法截取指定两个字符串之…

NCI Core Framework

3.1 概述 NCI 核心包括以下必需的功能:  通过 NCI 传输命令、响应、通知和数据消息的数据包格式。  用于设备主机和 NFC 控制器之间不同操作(第 4 节中指定)的命令、响应和通知的定义。 (本规范后面的一些部分定义了不属于…

Java面试题2023(实际面试中遇到的有意思的问题)

问题1&#xff1a;Explain需要关注的指标 需要重点关注type、rows、filtered、extra。 type由上至下&#xff0c;效率越来越高 ALL 全表扫描 index 索引全扫描 range 索引范围扫描&#xff0c;一般条件查询中出现了>、<、in、between等查询 ref 使用非唯一索引扫描或…

docker-compose把微服务部署到centos7

前言 这里主要记录以下微服务使用docker、docker-compose部署遇到的一些问题&#xff0c;大佬可以绕道去看看自动化集成这篇文章 部署之前你需要准备一些内容 微服务 这里feign-api是用来做服务之间相互调用的&#xff0c;单独抽离成了一个模块&#xff0c;gateway是服务网关&…

基于Java+Swing+Socket实现中国象棋-网络版

基于JavaSwingSocket实现中国象棋-网络版 一、系统介绍二、功能展示1.系统登陆2.选择黑色方进行对局3.整体页面4、保存棋谱5、认输 三、其他系统四、获取源码 前言 中国象棋是起源于中国的一种棋&#xff0c;属于二人对抗性游戏的一种&#xff0c;在中国有着悠久的历史。由于用…

低功耗蓝牙迈向工业车规级,助力充电桩和电动车智能化

近两年来&#xff0c;国内新能源汽车发展突飞猛进&#xff0c;一骑绝尘。据汽车工业协会统计&#xff0c;2022年1~6月份&#xff0c;新能源汽车的产销分别为266.1万辆和260万辆&#xff0c;同比均增长1.2倍&#xff0c;市场占有率达到了21.6%。另据公安部的统计&#xff0c;截至…

Qt 实现SQLite全部语法(增删改查、内置函数、高级语法)

Qt 实现SQLite全部语法 【1】SQLite Qt界面设计【2】SQLite Qt数据库创建、打开、关闭、删除【3】SQLite Qt表格的创建【4】SQLite Qt表格的插入【5】SQLite Qt表格的查询【6】SQLite Qt表格的删除【7】SQLite Qt表格的更新【8】SQLite Qt表格的结构【9】SQLite Qt表格的修改【…

SD/StableDiffusion部署图文教程,ai绘画教程,实现谷歌云端零成本部署,中文UI

目录 一、前言 二、准备前提 三、教程说明 四、开始搭建 1、第一步&#xff0c;下载ipynb脚本文件 2、第二步&#xff0c;上传一键脚本文件到谷歌云盘 3、选择该.ipynb文件--右键--打开方式--关联更多应用 4、输入框搜索Colaboratory找到该应用&#xff0c;安装 5、安…