web-dev-qa-db-ja.com

/ sys / firmware / dmi / tablesからのdmidecodeバイナリダンプの再構築

バックグラウンド

dmidecodeユーティリティは、_--dump-bin_オプションを使用して生のバイナリダンプを作成できます。

_root@here:~$ dmidecode --dump-bin foo.dump
_

これは別のマシンで再利用でき、dmidecodeが元のマシンで実行されているかのように効果を生み出します。

_me@elsewhere:~$ dmidecode --dump-bin foo.dump
# dmidecode 2.12
SMBIOS 2.7 present.
68 structures occupying 2688 bytes.
Table at 0xBAE9D000.
[...]
_

私はいくつかのマシンからこれらのバイナリを持っており、dmidecodeをラップするスクリプトをテストするためにそれらを使用します(したがって、ハードウェアのセットアップが異なるかのようにdmidecodeの動作をシミュレートする必要があります)。

問題

しかし、いくつかのマシンから、私は生のバイナリを持っていませんが、doは4によって公開された/ sys/firmware/dmi/tablesのコピーを持っています。*カーネル。 kernel.orgのドキュメント 言う:

[...] dmi/Tablesは、/ dev/memから読み取るユーティリティの代わりに、sysfsを介して生のSMBIOSエントリポイントとDMIテーブルを提供します。生のSMBIOSエントリポイントとDMIテーブルは、バイナリ属性として表示され、次の方法でアクセスできます。

_/sys/firmware/dmi/tables/smbios_entry_point
/sys/firmware/dmi/tables/DMI
_

完全なDMI情報は、これら2つのテーブルを使用して取得できます。

質問

/ sys /ファームウェア/ dmi/tablesファイルを使用して(Bash/Python/Perl/...スクリプトで)生のバイナリダンプを再構築して、最初の例のように再利用できるようにすることは可能ですか?

ファイルをまとめようとしましたが、成功しませんでした(Invalid entry length (0). DMI table is broken! Stop.)。

1
Alois Mahdal

enter image description here

enter image description here

enter image description here

https://github.com/mirror/dmidecode/blob/master/dmidecode.c からコードを参照できます。頑張ってください。

enter image description here

例:7f + 00 + 80 + 30 + 7b = 18a

18aホールド8ビット= 8a

DMIの新しいアドレスは0x20にハードコードされています。

1
James Iter

smbios_entry_pointの16進ダンプをdmidecodeのバイナリ出力と比較すると、類似のバイト0〜31であることがわかります。 dmidecodeの出力。同様に、DMIは32バイト以上に一致します。バイト32がありません。常にnullだと思います。

それは私がそれが機能することを期待していたのに十分に近いように見えます。

echo -en '\0' >NUL
Sudo cat /sys/firmware/dmi/tables/smbios_entry_point NUL /sys/firmware/dmi/tables/DMI >table
dmidecode --from-dump table

ただし、dmidecodeは次の出力でクラッシュします。

# dmidecode 2.12-dmifs
Reading SMBIOS/DMI data from file table.
SMBIOS 2.8 present.
Bus error (core dumped)

SMBIOS/DMI仕様は インターネット(pdf)で入手可能 ;ヘッダーの許容可能なダミー値を決定するのはそれほど難しいことではありません。少なくとも当面は、読者の練習問題として残しておきます;)

0
Mark