我使用 UEFI 存储持久变量。我注意到奇怪的行为。在设置变量之前,我查询
MaximumVariableSize
(使用 QueryVariableInfo
)并收到一个数字,例如 65,000。然后我将 19 个字节写入一个变量(并且我使用的变量名称少于 100 个字符,因此名称为 200 个 UTF-16 字节)。当我再次查询最大变量大小时,我收到了 64,000。
大概65,000和64,000的单位是字节。为什么编写一个总共消耗 19 + 200 = 219 字节的变量会使可用空间减少 1,000 字节?我做错了什么还是这是预期的行为?这是 NVRAM 中出现不良碎片的情况吗?我无法立即在 UEFI 规范中找到任何与此相关的信息,但公平地说,该规范没有定义实现。
更新:我注意到,当我覆盖具有相似长度内容的UEFI变量时,
RemainingVariableStorageSize
会减少,即使我没有增加在UEFI中存储的内容总量。我不知道支持固件的 NVRAM 的属性。是否有可能每个电源周期只能写入 NVRAM 的每个区域一次,这就是可用空间不断减少的原因?
闪存是一种允许在任何地方将任何位从“1”更改为“0”的技术,但要将位更改回“1”需要“擦除”存储器的一部分,称为“擦除块”。 擦除块的典型大小是 64 KB,擦除它会将该部分内的所有位设置为“1”, 更新变量时,实现需要将其新版本存储在先前已擦除的位置,而不是存储当前值的同一位置,因此,更新变量的值会创建一个新版本,该版本消耗新的空间。 为了维护变量的“多个版本”,每个变量需要额外的开销,并且还可能包括数据完整性检查(每个变量),从而增加了存储新变量或更新变量所消耗的空间量。 当配置存储在 EEPROM 中时,数据可以“就地”更新,但此类存储器的尺寸明显小于闪存。