【问题标题】:SMBIOS - Invalid structure table address?SMBIOS - 结构表地址无效?
【发布时间】:2019-10-15 03:21:25
【问题描述】:

我目前正在开发一个旧的 MS-DOS 应用程序,它使用 DMI 来识别硬件。它过去运行良好,但似乎在较新的系统(例如 Skylake)上提供了无效数据。如规范中所述,我们正在扫描 0xF0000-0xFFFFF 以查找“SM”锚字符串,这仍然按预期工作。

但现在看来,位于“结构表地址”的数据(存储在偏移量 0x18h 中)是无效的(参见下面的转储)。 dmidecoe 之类的工具可提供正确的信息(但是,它在 Windows 上使用 GetSystemFirmwareTable())。我在这里做错了什么?

编辑(澄清情况)

在旧系统上,我得到了预期的数据(转储在 FreeDOS 的 debug98 实用程序中完成) - 以下来自 IvyBridge 系统(第 3 代):

-d F000:04C0
F000:04C0  5F 53 4D 5F 03 1F 02 07-77 00 00 00 00 00 00 00   _SM_....w.......
F000:04D0  5F 44 4D 49 5F E0 6E 04-10 BA 0E 00 17 00 27 00   _DMI_.n.......'.
F000:04E0  1E 66 60 68 00 F0 1F B8-90 D0 83 C0 0F 24 F0 A3   .f`h.........$..
F000:04F0  1D 03 B9 00 E0 2B C8 79-02 33 C9 89 0E 1F 03 33   .....+.y.3.....3
F000:0500  C0 66 2E 8B 1E 63 00 66-83 FB 00 74 0B 66 81 FB   .f...c.f...t.f..
F000:0510  00 00 0E 00 72 02 8B C3-A3 19 03 F7 D0 A3 1B 03   ....r...........
F000:0520  66 61 1F C3 00 1E 50 68-00 F0 1F 0B DB 74 28 F7   fa....Ph.....t(.
F000:0530  C3 80 00 74 1C 2E 80 3E-24 05 00 75 43 83 F9 3E   ...t...>$..uC..>
-d E000:BA10
E000:BA10  00 18 00 00 01 02 00 F0-03 7F 80 98 89 3F 01 00   .............?..
E000:BA20  00 00 03 0D 04 06 FF FF-41 6D 65 72 69 63 61 6E   ........American
E000:BA30  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
E000:BA40  00 42 51 37 37 52 31 31-31 00 30 37 2F 30 35 2F   .BQ77R111.07/05/
E000:BA50  32 30 31 33 00 00 01 1B-01 00 01 02 03 04 00 00   2013............
E000:BA60  01 26 60 24 00 05 00 06-00 07 00 08 00 09 06 05   .&`$............
E000:BA70  06 20 00 20 00 20 00 30-30 30 30 30 31 32 36 36   . . . .000001266
E000:BA80  30 32 34 00 20 00 20 00-00 02 0F 02 00 01 02 03   024. . .........

较新的系统 - 在这种情况下,基于 Skylake 的一个(第 6 代)数据是不同的。在地址中,SMI 结构指向我没有得到预期的数据(我希望看到 BIOS 字符串,但它们不存在):

-d f000:05e0
F000:05E0  5F 53 4D 5F F3 1F 03 00-8C 01 00 00 00 00 00 00   _SM_............
F000:05F0  5F 44 4D 49 5F 15 CE 07-00 90 1D 87 1A 00 30 00   _DMI_.........0.
F000:0600  5F 53 4D 33 5F 4A 18 03-00 00 01 00 CE 07 00 00   _SM3_J..........
F000:0610  00 90 1D 87 00 00 00 00-00 00 00 00 00 00 00 00   ................
F000:0620  1E 66 60 68 00 F0 1F B8-00 C6 83 C0 0F 24 F0 A3   .f`h.........$..
F000:0630  8E 03 B9 00 E0 2B C8 79-02 33 C9 89 0E 90 03 33   .....+.y.3.....3
F000:0640  C0 66 2E 8B 1E 63 00 66-83 FB 00 74 0B 66 81 FB   .f...c.f...t.f..
F000:0650  00 00 0E 00 72 02 8B C3-A3 8A 03 F7 D0 A3 8C 03   ....r...........
-d 871d:9000
871D:9000  76 06 D1 E9 73 08 8A 05-A4 88 44 FF 74 08 8B 05   v...s.....D.t...
871D:9010  A5 89 44 FE E2 F8 5F 5E-5D C2 04 00 55 8B EC 4C   ..D..._^]...U..L
871D:9020  4C 56 57 83 7E 04 02 73-2D 83 7E 04 02 74 03 E9   LVW.~..s-.~..t..
871D:9030  18 01 8B 46 06 03 06 AC-10 8B F8 50 FF 76 06 FF   ...F.......P.v..
871D:9040  16 AE 10 59 59 0B C0 7F-03 E9 FE 00 FF 76 06 57   ...YY........v.W
871D:9050  E8 9D FF E9 F4 00 8B 46-04 48 F7 2E AC 10 8B 56   .......F.H.....V
871D:9060  06 03 D0 8B FA 8B 46 04-D1 E8 F7 2E AC 10 8B 56   ......F........V
871D:9070  06 03 D0 8B F2 57 56 FF-16 AE 10 59 59 0B C0 7E   .....WV....YY..~

【问题讨论】:

  • 表中的字节总数具有较低的值 00,因此表明它是有效的。标头中的结构表地址是一个 32 位物理地址(线性),位于0x871d9000。您正在转储(使用 DOS 调试?)段:偏移地址 871d:9000 这是物理地址 (0x871d0x901D0 。在有效的系统上,它们的结构表地址是什么?
  • 分段地址和 32 位物理地址不是一回事。如果这是 MS-DOS,您的程序是进入虚幻模式还是保护模式以从 1MiB 以上的内存中读取结构表?
  • 鉴于您的表位于0x871d9000,并且该地址位于奇数兆字节边界上,我希望启用A20 line,否则您将不会从正确的内存位置读取。
  • 感谢您的意见,迈克尔。我必须调查您的输入,然后会回到这个 a.s.a.p.转储是在 FreeDOS 下完成的——这在过去给了我预期的结果。在较新的系统上似乎有所不同 - 实际上是具有基于 Skylake 的 CPU 的系统。
  • 很高兴看到在您的问题中添加了相同类型的转储,但在旧系统上有效。它以前可能是靠运气/巧合起作用的。您正在使用的 MS-DOS 程序 - 您是否有它的源代码,或者它是由其他人编写的,而您只有一个 EXE? ——

标签: dos x86-16 bios firmware


【解决方案1】:

正如 Michael Petch 指出的那样,您的 SMBIOS 结构位于物理地址 0x871d9000(从偏移 f000:0610 或从“_SM3_”锚字符串偏移 x10 可以看到)。

这是一个小问题,但可能很重要,具体取决于您的软件的构建方式。请记住,这是一个符合 SMBIOS 3.0 的结构(根据“_SM3_”锚字符串),并且结构表地址可以是 any 64 位地址。为确保您的软件在所有系统中工作,您应该使用_SM3_ 结构表地址(如果存在)并使您的软件能够使用大实模式或其他机制读取任何 64 位物理地址。当_SM3_ 结构不存在时,恢复到您的旧软件流程。

至于为什么你现在才看到这个,你是不是第一次遇到物理地址超过1MB的数据结构?

【讨论】:

  • 是的 - 这是第一次遇到这种麻烦。我同意必须在之前寻找“SM3”结构。然而,我担心我不知道如何从我非常古老的基于 MS-DOS 的 C 程序中访问这些地址。如果可能的话 - 你知道一些好的例子吗?
  • 研究使用虚幻模式(或我们过去所说的大实模式)。这是示例代码link 的链接。试试链接中的代码。如果您有问题,请回复。
  • 好的,我出去了。我对汇编代码有基本的了解,但我认为我不会让它工作。不过,非常感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 2014-08-15
  • 2023-03-16
  • 1970-01-01
  • 2011-06-11
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多