我当前正在使用旧的MS-DOS应用程序,该应用程序使用DMI识别硬件。过去它运行良好,但似乎在较新的系统(例如Skylake)上提供了无效数据。如规范中所述,我们正在扫描0xF0000-0xFFFFF以查找“ SM ”锚定字符串,该字符串仍按预期运行。
但是现在看来位于“结构表地址”(存储在中的偏移量0x18h处)的数据无效(请参见下面的转储)。诸如dmidecoe之类的工具可以提供正确的信息(但是,它在Windows上使用GetSystemFirmwareTable())。我在这里做错了什么?
-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..~
答案 0 :(得分:1)
您的SMBIOS结构位于物理地址0x871d9000
(如从偏移量f000:0610或从“ _SM3_
”锚定字符串偏移量x10所见),正如Michael Petch指出的那样。
这是次要的要点,但根据您的软件构造方式可能很重要。请记住,这是一个符合SMBIOS 3.0的结构(按“ _SM3_
”锚定字符串),并且结构表地址可以位于任何 64位地址上。为确保您的软件可在所有系统中正常工作,应使用_SM3_
结构表地址(如果存在),并允许软件使用大实模式或其他机制读取任何64位物理地址。当_SM3_
结构不存在时,请恢复到旧的软件流程。
关于您为什么现在看到这个,这是您第一次遇到物理地址大于1MB的数据结构吗?