Je veux vider les données du BIOS de mon ordinateur portable dans un fichier. La seule solution que j'ai trouvée est la commande suivante:
dd if=/dev/mem bs=X skip=Y count=1
X
et Y
sont différentes dans les solutions suggérées par différentes personnes car il existe différents types de BIOS.
Existe-t-il un moyen de trouver l'adresse exacte des données du BIOS dans /dev/mem
? Puis-je utiliser dmidecode
pour trouver la plage d'adresses du BIOS en mémoire? Et Linux décharge-t-il toutes les données du BIOS dans RAM ou juste une partie spéciale de celui-ci?
Si Linux peut vider les données du BIOS dans la RAM, l'utilisateur root peut-il également accéder directement au BIOS?
Vous pouvez essayer d'utiliser biosdecode
.
Il s'agit d'un utilitaire de ligne de commande pour analyser la mémoire du BIOS et imprimer des informations sur toutes les structures (ou points d'entrée) qu'il connaît. Il trouve des informations sur le matériel telles que:
etc.
Choses à considérer:
biosdecode
analyse la mémoire [~ # ~] bios [~ # ~] et affiche les informations sur toutes les structures.biosdecode
ne sont pas dans un format lisible par l'homme.Vous devrez utiliser la commande dmidecode
pour vider le contenu de la table DMI (SMBIOS) d'un ordinateur à l'écran.
$ Sudo dmidecode --type 0
Recherchez la page de manuel pour plus d'informations:
$ man dmidecode
Oui, le noyau conserve uniquement les informations dont il a besoin du BIOS dans la RAM. Cependant, vous pouvez effectuer des appels BIOS en temps réel à partir de l'utilisateur root à l'aide d'applications C qui incluent l'ASM intégré (code d'assemblage), etc.
Vous pouvez en savoir plus sur le noyau Linux et le BIOS d'un système dans cet article de Linuxmagazine intitulé: Linux et le BIOS .
Je pense que ce que vous cherchez est flashrom
. À condition que votre système soit pris en charge, vous pouvez lire le contenu de votre BIOS en émettant
# flashrom -r <outputfile>
Si vous souhaitez uniquement enregistrer la soi-disant RAM CMOS (les octets supplémentaires dans lesquels vous enregistrez la configuration, comme l'alarme sur RTC et al) le pilote et le périphérique nvram
du noyau peuvent vous aider:
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.
Si d'autres outils ne sont pas disponibles ou ne peuvent pas être utilisés, voici un moyen de faire une estimation éclairée de la région de mémoire à vider.
Par exemple, à partir d'une machine virtuelle VirtualBox, j'ai réussi à vider son BIOS en faisant:
$ 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
Option bios dans dmidecode
dmidecode -t bios
Lisez la mémoire de C:0000
à F:FFFF
sans besoin de dmidecode
dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8
Cela a fonctionné pour moi dans VirtualBox:
$ grep ROM /proc/iomem
ce qui se traduit par:
000c0000-000c7fff: ROM vidéo
000e2000-000e2fff: ROM de l'adaptateur
000f0000-000fffff: ROM système
Système ROM commence à 000f0000, qui est 0xF0000.
Ouvrez le navigateur et accédez à http://www.hexadecimaldictionary.com/hexadecimal/0xF00 . Cela signifie que la valeur décimale est 983040, divisée par 1024 pour obtenir des kilo-octets, soit 960, qui est le point de départ et la valeur pour "ignorer".
Le numéro de fin est 0xFFFFF qui est 1048575 qui est juste timide de 1024. 1024 - 960 est 64, qui est la valeur de 'count'.
La commande à exécuter pour vider le bios est donc:
dd if=/dev/mem of=pcbios.bin bs=1k skip=960 count=64