我正在开发一个嵌入式项目。我需要一个地方来在存储设备上存储一些与文件系统无关的元信息。该设备有一个 MSDOS 分区表。该设备也可能有未分配的空间(取决于其大小),但它将被 TRIMmed(并且将来也可能被新分区吹走)。
我需要在设备上找到一个未被分配且被触碰的风险较低的位置(除了彻底擦除设备之外)。设备只能保证在需要首次写入元数据时具有 MBR;这意味着不存在任何可供我使用的 EBR/VBR。
设备最开始处有 446 个字节可用于 MBR 引导代码。目前我唯一的想法是将数据存储在此块的末尾。但是,该设备是可引导的,我无法知道我是否会遗漏引导代码。
扇区大小为 512 字节,MBR 是第一个扇区,我漂亮的当然(如果我错了请纠正我)这意味着第二个扇区可供分区数据使用,所以我也不能使用它。
有人有什么想法吗?我需要 4 个字节的空间。
答案1
Windows NT 使用 32 位磁盘签名识别单个 MBR 分区磁盘,并将其存储为从 440 [01B8h] 开始的六个字节(四个字节包含签名和两个零字节)。这样就剩下 440 个字节用于引导代码。
磁盘签名最初是在 Windows NT 4 中引入的(从 Windows Vista 开始,MBR 磁盘上就需要使用磁盘签名)。从那时起,非 Windows 系统也以类似于 GPT 的“磁盘 UUID”的方式使用它(Linux 和 GRUB 支持它)。
因此,许多引导加载程序将 MBR 中的引导代码限制为 440 字节,以避免覆盖磁盘签名。(我刚刚验证了 GRUB 和 Syslinux 都这样做。)
您的设备使用的引导加载程序很有可能也会保留磁盘签名。检查从 444 [01BCh] 开始的两个字节是否保持不变00 00
- 如果是,那么其他四个字节很可能保持不变,除非整个分区表被破坏,或者除非安装了大于 440 字节的新引导代码。
答案2
MBR 包含分区表以及引导代码
引导代码:446字节 主分区:64字节 Sig:2字节
存储是否用于启动?可能值得考虑“破坏” MBR 中的启动代码以存储元数据。启动代码仅在启动时使用
答案3
唯一真正安全的数据存储方式是将其存储在自己的分区中。根据您的需要,分区可以很小(一个扇区)。将数据存储在分区之外可能会使其溢出或您的数据覆盖重要内容。考虑到它只有四个字节,接管分区表的序列号(正如grawity所建议的那样)可能是分区外选项中最安全的,但我不建议这样做,尤其是在没有更多上下文的情况下,因为序列号是被一些工具使用,因此如果您依赖使用序列号的东西,接管它可能会导致问题。