배경
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 동작을 시뮬레이션해야 합니다).
질문
하지만 몇몇 머신에는 원시 바이너리가 없지만하다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 정보를 얻을 수 있습니다.
질문
첫 번째 예처럼 재사용할 수 있도록 /sys/firmware/dmi/tables 파일을 사용하여 원래 바이너리 덤프를 (Bash/Python/Perl/... 스크립트에서) 재구성할 수 있습니까?
나는 이 파일들을 함께 모아 보았지만 성공하지 못했습니다( Invalid entry length (0). DMI table is broken! Stop.
).
답변1
코드를 참고하시면 됩니다https://github.com/mirror/dmidecode/blob/master/dmidecode.c. 행운을 빌어요.
예: 7f + 00 + 80 + 30 + 7b = 18a
18a는 8bit = 8a를 유지합니다.
DMI의 새 주소는 0x20으로 하드 코딩됩니다.
답변2
smbios_entry_point
dmidecode의 16진수 덤프를 바이너리 출력과 비교하면 다음과 같은 것을 알 수 있습니다.비슷한dmidecode 출력에 대한 바이트 0-31. 마찬가지로 DMI
바이트 32+와 일치합니다. 바이트 32가 누락되었습니다. 항상 비어 있는 것 같습니다.
충분히 가까워 보여서 효과가 있었으면 좋겠습니다.
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);헤더에 허용되는 더미 값을 결정하는 것은 그리 어렵지 않습니다. 적어도 지금은 독자들에게 연습문제로 남겨두겠습니다. ;)