Como despejar dados do BIOS em um arquivo

24

Quero despejar os dados do BIOS do meu laptop em um arquivo. A única solução que encontrei é o seguinte comando:

dd if=/dev/mem bs=X skip=Y count=1

Xe Ysão diferentes nas soluções sugeridas por pessoas diferentes, porque existem diferentes tipos de BIOS.

Existe uma maneira de encontrar o endereço exato dos dados do BIOS /dev/mem? Posso usar dmidecodepara encontrar o intervalo de endereços do BIOS na memória? E o Linux despeja todos os dados do BIOS na RAM ou apenas uma parte especial?

Se o Linux pode despejar dados do BIOS na RAM, o usuário root também pode acessar o BIOS diretamente?

Omid
fonte

Respostas:

20

Você pode tentar usar biosdecode.

É um utilitário de linha de comando para analisar a memória do BIOS e imprimir informações sobre todas as estruturas (ou pontos de entrada) que conhece. Ele encontra informações sobre hardware, como:

  • Dispositivo IPMI
  • Tipo de memória e velocidade
  • Informações do chassi
  • Sonda de temperatura
  • Dispositivo de refrigeração
  • Sonda de corrente elétrica
  • Informações sobre processador e memória
  • Números de série
  • Versão do BIOS
  • Slots e velocidade PCI / PCIe

etc.

Coisas a considerar:

  • biosdecodeanalisa a memória do BIOS e imprime as informações sobre todas as estruturas.
  • Decodificar dados do BIOS é o mesmo que descarregar a DMI de um computador . A tabela DMI descreve principalmente de que o sistema é composto atualmente.
  • Os dados fornecidos por biosdecodenão estão em um formato legível por humanos.

Visualizando o conteúdo na tela

Você precisará usar o dmidecodecomando para despejar o conteúdo da tabela DMI (SMBIOS) de um computador na tela.

$ sudo dmidecode --type 0 

Pesquise a página do manual para obter mais informações:

$ man dmidecode

Sim, o kernel mantém apenas as informações necessárias do BIOS na RAM. No entanto, você pode fazer chamadas de BIOS em tempo real a partir do usuário root usando aplicativos C que incluem ASM (código de montagem) incorporado etc.

Você pode ler mais sobre o kernel do Linux e o BIOS de um sistema neste artigo da Linuxmagazine intitulado: Linux and the BIOS .

delta24
fonte
12

Eu acho que o que você está procurando é flashrom. Desde que o seu sistema seja suportado, você pode ler o conteúdo do BIOS emitindo

# flashrom -r <outputfile>

Se você deseja salvar apenas a chamada RAM CMOS (os bytes extras em que você salva a configuração, como o alarme no RTC et al), o nvramdriver e o dispositivo do kernel podem ajudá-lo:

config NVRAM
     tristate "/dev/nvram support"
     depends on ATARI || X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM
     ---help---
       If you say Y here and create a character special file /dev/nvram
       with major number 10 and minor number 144 using mknod ("man mknod"),
       you get read and write access to the extra bytes of non-volatile
       memory in the real time clock (RTC), which is contained in every PC
       and most Ataris.  The actual number of bytes varies, depending on the
       nvram in the system, but is usually 114 (128-14 for the RTC).

       This memory is conventionally called "CMOS RAM" on PCs and "NVRAM"
       on Ataris. /dev/nvram may be used to view settings there, or to
       change them (with some utility). It could also be used to frequently
       save a few bits of very important data that may not be lost over
       power-off and for which writing to disk is too insecure. Note
       however that most NVRAM space in a PC belongs to the BIOS and you
       should NEVER idly tamper with it. See Ralf Brown's interrupt list
       for a guide to the use of CMOS bytes by your BIOS.

       On Atari machines, /dev/nvram is always configured and does not need
       to be selected.

       To compile this driver as a module, choose M here: the
       module will be called nvram.
Andreas Wiese
fonte
Essa é uma boa sugestão, mas provavelmente não funcionará no seu laptop. Falta o suporte do BIOS do laptop para este software. Por exemplo, ele não roda em nenhum laptop Thinkpad que eu possuo (muitos modelos diferentes).
Slm
10

Se outras ferramentas não estiverem disponíveis ou não puderem ser usadas, aqui está uma maneira de adivinhar qual a região da memória a ser despejada.

Por exemplo, de dentro de uma VM do VirtualBox, eu despejei seu BIOS com êxito, fazendo:

$ grep ROM /proc/iomem # https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-firmware-memmap
000c0000-000c7fff : Video ROM
000e2000-000e2fff : Adapter ROM
  000f0000-000fffff : System ROM
# dd if=/dev/mem of=pcbios.rom bs=64k skip=15 count=1 # 15*64k + 64k
ack
fonte
2
Como você sabe quais tamanhos usar com base nos endereços de memória?
Unseen_rider
7

BIOS de opções em dmidecode

dmidecode -t bios

Leia a memória de C:0000para F:FFFFsem a necessidade de dmidecode

dd if=/dev/mem bs=1k skip=768  count=256 2>/dev/null | strings -n 8
totti
fonte
3

Isso funcionou para mim no VirtualBox:

$ grep ROM /proc/iomem

que resulta em:
000c0000-000c7fff: ROM de vídeo
000e2000-000e2fff: ROM do adaptador
000f0000-000fffff: ROM do sistema

A ROM do sistema inicia em 000f0000, que é 0xF0000.

Abra o navegador e acesse http://www.hexadecimaldictionary.com/hexadecimal/0xF0000 . Isso indica que o valor decimal é 983040, dividido por 1024 para obter kilobytes, 960, que é o ponto de partida e o valor de 'ignorar'.

O número final é 0xFFFFF, que é 1048575, que é apenas 1024. 1024 - 960 é 64, que é o valor de 'count'.

O comando a ser executado para despejar o BIOS é assim:

dd if=/dev/mem of=pcbios.bin bs=1k skip=960 count=64
François Thirion
fonte