Как записать данные BIOS в файл

24

Я хочу записать данные BIOS моего ноутбука в файл. Единственное решение, которое я нашел, это следующая команда:

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

Xи Yразные в предложенных решениях от разных людей, потому что есть разные типы BIOS.

Есть ли способ узнать точный адрес данных BIOS /dev/mem? Можно ли использовать, dmidecodeчтобы найти диапазон адресов BIOS в памяти? И выдает ли Linux все данные BIOS в ОЗУ или только специальную часть?

Если Linux может записывать данные BIOS в ОЗУ, может ли пользователь root также напрямую обращаться к BIOS?

Омид
источник

Ответы:

20

Вы можете попробовать использовать biosdecode.

Это утилита командной строки, которая анализирует память BIOS и печатает информацию обо всех структурах (или точках входа), о которых она знает. Он находит информацию об оборудовании, такую ​​как:

  • Устройство IPMI
  • Тип памяти и скорость
  • Информация о шасси
  • Датчик температуры
  • Охлаждающее устройство
  • Зонд электрического тока
  • Информация о процессоре и памяти
  • Серийные номера
  • Версия BIOS
  • Слоты PCI / PCIe и скорость

и т.п.

Что нужно учитывать:

  • biosdecodeанализирует память BIOS и печатает информацию обо всех структурах.
  • Декодирование данных BIOS аналогично дампированию DMI компьютера . Таблица DMI в основном описывает, из чего состоит система.
  • Данные предоставлены biosdecodeне в удобочитаемом формате.

Просмотр содержимого на экране

Вам нужно будет использовать dmidecodeкоманду для вывода содержимого таблицы DMI (SMBIOS) компьютера на экран.

$ sudo dmidecode --type 0 

Поиск man-страницы для получения дополнительной информации:

$ man dmidecode

Да, ядро ​​хранит в ОЗУ только ту информацию, которая ему нужна из BIOS. Однако вы можете в реальном времени выполнять вызовы BIOS от пользователя root с помощью приложений на языке C, которые включают встроенный ASM (код сборки) и т. Д.

Вы можете прочитать больше о ядре Linux и BIOS системы в этой статье из Linuxmagazine под названием: Linux и BIOS .

delta24
источник
12

Я думаю, что вы ищете flashrom. При условии, что ваша система поддерживается, вы можете прочитать содержимое BIOS, выполнив

# flashrom -r <outputfile>

Если вы хотите сохранить только так называемую ОЗУ CMOS (те дополнительные байты, в которые вы сохраняете конфигурацию, например, аварийный сигнал в RTC и др.), nvramДрайвер и устройство ядра могут вам помочь:

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.
Андреас Визе
источник
Это хорошее предложение, но, вероятно, не будет работать на вашем ноутбуке. Для этого программного обеспечения отсутствует поддержка BIOS для ноутбука. Например, он не будет работать на ноутбуках Thinkpad, которые у меня есть (много разных моделей).
СЛМ
10

Если другие инструменты недоступны или не могут быть использованы, вот способ сделать обоснованное предположение о том, какую область памяти выгружать.

Например, из виртуальной машины VirtualBox я успешно сбросил ее BIOS, выполнив:

$ 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
извед
источник
2
Как вы знаете, какие размеры использовать на основе адресов памяти?
unseen_rider
7

Вариант биос в dmidecode

dmidecode -t bios

Читайте память от C:0000до F:FFFFбез необходимости dmidecode

dd if=/dev/mem bs=1k skip=768  count=256 2>/dev/null | strings -n 8
Тотти
источник
3

Это работает для меня в VirtualBox:

$ grep ROM /proc/iomem

что приводит к:
000c0000-000c7fff: ПЗУ видео
000e2000-000e2fff: ПЗУ адаптера
000f0000-000fffff: ПЗУ системы

Системное ПЗУ начинается с 000f0000, что составляет 0xF0000.

Откройте браузер и перейдите по адресу http://www.hexadecimaldictionary.com/hexadecimal/0xF0000 . Это говорит о том, что десятичное значение 983040, которое делится на 1024, чтобы получить килобайт, это 960, что является отправной точкой и значением для «пропустить».

Конечное число - 0xFFFFF, которое равно 1048575, которое просто не соответствует 1024. 1024 - 960 - это 64, что является значением 'count'.

Команда для запуска сброса BIOS выглядит следующим образом:

dd if=/dev/mem of=pcbios.bin bs=1k skip=960 count=64
Франсуа Тирион
источник