Solaris 模块调试器指南

buftag 数据完整性

如前所述,每个 buftag 的后半部分包含了有关对应缓冲区的额外信息。 此数据中一部分是调试信息,一部分是分配器的专用数据。 尽管此辅助数据可以采用几种不同的形式,但是它统称为“缓冲区控制”或 bufctl 数据。

不过,分配器需要知道缓冲区的 bufctl 指针是否有效,因为该指针也可能由于异常代码而损坏。 分配器通过存储其辅助指针该指针的编码版本,然后交叉检查这两个版本来确认该指针的完整性。

图 9–5 中所示,这些指针是 bcp(缓冲区控制指针)和 bxstat(缓冲区控制 XOR 状态)。 分配器会对 bcp 和 bxstat 进行排列,以便表达式 bcp XOR bxstat 等于已知值。

图 9–5 buftag 中的额外调试数据

图形由上下文说明。

这两个指针中的一个或两个损坏时,分配器可以轻易检测到此类损坏,并会导致系统出现紧急情况。分配缓冲区后,bcp XOR bxstat = 0xa110c8ed ("allocated")。缓冲区空闲时,bcp XOR bxstat = 0xf4eef4ee ("freefree")。


注意 –

您可能会发现重新检查检查已释放的缓冲区: 0xdeadbeef中的示例会有助于确认那里显示的 buftag 指针是否一致。


分配器找到损坏的 buftag 时,会导致系统出现紧急情况,并生成与以下内容类似的消息:

kernel memory allocator: boundary tag corrupted

    bcp ^ bxstat = 0xffeef4ee, should be f4eef4ee

请记住,如果 bcp 已损坏,仍可通过采用 bxstat XOR 0xf4eef4eebxstat XOR 0xa110c8ed(取决于缓冲区是已分配的还是空闲的)的值来对其值进行检索。