BIOS 硬件监控模块:监控内存、CPU、硬盘变化

问题描述:当机器(服务器、台式机、笔记本)的内存、CPU、硬盘(HDD、SSD、NVME)发生变化时,BIOS怎么监控到,并给出提示信息。

1、思路流程图

请添加图片描述

2、代码重难点

1)追加一条监控记录到 MultiMonitorRecords中
EFI_STATUS
AppendToPostMonitorRecords (
  IN OUT MONITOR_RECORD          **MultiMonitorRecords,
  IN UINTN                       MultiRecordSize,
  IN MONITOR_RECORD              *AppendMonitorRecord
  )
{
  UINT32 AppendRecordSize;
  UINT8  *Buffer;

  if ((MultiMonitorRecords == NULL) || (AppendMonitorRecord == NULL )) {
    return EFI_INVALID_PARAMETER;
  }
  AppendRecordSize = AppendMonitorRecord->Length;
  *MultiMonitorRecords = (MONITOR_RECORD *) ReallocatePool (
                                              MultiRecordSize,
                                              MultiRecordSize + AppendRecordSize,
                                              (VOID *) (*MultiMonitorRecords)
                                              );
  Buffer = (UINT8 *)(*MultiMonitorRecords);
  Buffer += MultiRecordSize;
  CopyMem (Buffer, AppendMonitorRecord, AppendRecordSize);

  return EFI_SUCCESS;
}

监控记录使用双指针存储,先扩大内存,每增加一条记录,使用copyMen把记录追加到记录中

2)如何区分硬件类型
typedef struct {
  ///
  /// Version of this data structure.
  ///
  UINT32         Version;
  EFI_GUID       DeviceType;
  EFI_HANDLE     DeviceHandle;
  CHAR8          DeviceIdentifier[DEVICE_IDENTIFIER_ASCII_LENGTH];
} MONITOR_DEVICE_IDENTIFIER;

设备描述字段中包括 DeviceType,可以区分是内存、硬盘还是CPU
设备描述字段中包括DeviceIdentifier,DeviceIdentifier 是根据设备的串口号进行哈希转换形成的,
字段DeviceType,DeviceIdentifier可以保证硬件设备的唯一性。

Status = Sha1HashAll (AtaIdentify->SerialNo, sizeof (AtaIdentify->SerialNo), MonitorDeviceId->DeviceIdentifier);  
3)新监控记录与旧纪录比较
//GetMonitorNvData 从getvariable中获取旧纪录,mNvMonitorDeviceRecord为获取记录,mNvMonitorDeviceRecordSize获取记录的大小
Status = GetMonitorNvData (&mNvMonitorDeviceRecord, &mNvMonitorDeviceRecordSize);
//获取旧纪录的初始地址
RecordPtr = (UINT8 *)mNvMonitorDeviceRecord;
//获取旧纪录的整体长度
RecordTailPtr = RecordPtr + mNvMonitorDeviceRecordSize;
 //在地址范围内进行数据比较
while (RecordPtr < RecordTailPtr) {
     if (!CompareMem(((MONITOR_RECORD*)RecordPtr)->DeviceIdentifier,DeviceIdentifier,DEVICE_IDENTIFIER_ASCII_LENGTH)){
     
     }
     指针移动一个监控记录的长度
     RecordPtr += ((MONITOR_RECORD *)RecordPtr)->Length;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值