问题描述:当机器(服务器、台式机、笔记本)的内存、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;
}