【发布时间】: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? ——