배경

배경

배경

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_pointdmidecode의 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);헤더에 허용되는 더미 값을 결정하는 것은 그리 어렵지 않습니다. 적어도 지금은 독자들에게 연습문제로 남겨두겠습니다. ;)

관련 정보