Проникнення в bios rom освоюємо spi flash №1

Інтерфейс SPI: історична довідка

Як відомо, швидкодія мікросхеми постійного пам'яті
(Flash ROM), що використовується в якості носія BIOS, практично не впливає на
загальну продуктивність комп'ютера. Це пов'язано з тим, що при старті
материнської плати, BIOS переписується (або розпаковується) в оперативну
пам'ять Shadow RAM і при зверненні до BIOS в сеансі ОС, програми працюють з
оперативною пам'яттю, а не з мікросхемою Flash ROM. Тому, на відміну від
процесора, пам'яті, графічної підсистеми, еволюція яких супроводжується
зростанням продуктивності, мікросхеми Flash ROM і їх інтерфейси розвиваються в
іншому напрямку. Тут головними критеріями є зменшення вартості,
споживаної потужності і займаної площі на материнській платі. головний метод
досягнення цих цілей - зменшення кількості провідників між мікросхемою BIOS
і контролером, зазвичай входять до складу "південного моста" чіпсета. З точки зору
методу підключення мікросхеми BIOS, можна виділити три покоління материнських
плат:

Відзначимо, що інтерфейс LPC також підтримується сучасними чіпсетами і
розробник материнської плати може використовувати для підключення мікросхеми BIOS
як LPC, так і SPI. Сфера застосування інтерфейсу SPI не обмежується
материнськими платами комп'ютерів. Уважний Новомосковсктель міг звернути увагу на
то, що через перехід до послідовного формату даних, кожен з описаних
інтерфейсів використовує більше тактів для виконання операцій читання і запису,
ніж його попередник, що загрожує зниженням швидкодії. Але цього не
відбувається, так як вказані обставини компенсується зростанням частоти і
оптимізацією форматів даних. Шина ISA працює на частотах 5-8MHz, LPC на
33MHz, SPI на 33-50 MHz.

Архітектура мікросхеми SPI Flash ROM

Призначення кожного з восьми контактів мікросхеми, опис всіх команд, а
також інші подробиці містяться в [5].

Архітектура контролера SPI

Біт 0 (SPI Cycle In Progress) - використовується для визначення моменту
завершення операції на шині SPI. "0" означає, що шина SPI вільна і програма
може запускати наступний цикл. "1" означає, що шина SPI зайнята, виконується
транзакція. Біт встановлюється і скидається апаратно, доступний тільки для
читання.

Біт 1 (Reserved) - не використовується.

Біт 2 (Cycle Done Status) - встановлюється в "1" апаратно, при
завершенні транзакції на шині SPI. Для скидання, програма повинна записати "1" в
даний біт.

Біт 3 (Flash Cycle Error) - встановлюється в "1" апаратно, якщо при
виконанні транзакції мали місце помилки: захист записи або спроба запуску
наступної транзакції до завершення попередньої. Для скидання, програма повинна
записати "1" в даний біт.

Біти 5-7 (Reserved) - не використовуються.

Біт 8 (Reserved) - не використовується. Як було показано вище, біти 8-31
розглянутого 32-бітного слова відповідає бітам 0-23 регістра Software
Sequencing Flash Control.

Біт 10 (Atomic Cycle Sequence) - при передачі наказу на виконання
транзакції, запис "1" в цей біт забороняє зовнішніх подій втручатися в
процеси, що відбуваються на інтерфейсі SPI до тих пір, поки не будуть виконані три
фази: передача префиксной команди, передача основної команди і завершення
виконання основної команди.

Відзначимо, що таким чином реалізується один з механізмів захисту від
випадкового спотворення вмісту мікросхеми BIOS. Так звані префіксние
команди (наприклад, Write Enable) повинні передувати командам, що змінює
вміст мікросхеми (наприклад, Write, Erase). Отримавши код команди, що містить
"1" в даному бите, всі три фази контролер виконує апаратно, без
втручання процесора до завершення виконання основної команди.

Біт 11 (Sequence Prefix Opcode Pointer) - при використанні префіксних
команд (коли біт 10 встановлений в "1", см. вище), цей біт вибирає один з двох
байтів, який буде переданий в якості префиксной команди для мікросхеми SPI
Flash. При "0" вибирається молодший байт регістра Prefix Opcode Configuration
Register, при "1" - старший.

Біт 12-14 (Cycle Opcode Pointer) - це бітове поле вибирає один з
восьми байтів, який буде переданий в якості основної команди для мікросхеми
SPI Flash. Зазначені байти знаходяться в регістрі Opcode Menu Configuration
Register.

Біт 15 (Reserved) - не використовується.

Біти 16-21 (Data Byte Count) - задає кількість байтів даних для
операцій читання або запису даних. Кількість дорівнює значенню цього поля плюс 1.
Наприклад: 000000b = 1 байт, 111111b = 64 байта.

Біт 22 (Data Cycle) - Задає наявність байтів даних в команді. "0"
означає, дані відсутні (наприклад, в команді стирання), "1" означає, що
дані присутні (наприклад, в команді читання статусу, даними є
вміст регістра статусу).

Біт 23 (SPI SMI # Enable) - дозвіл формувати запит на переривання
System Management Interrupt після завершення транзакції, 0 = заборонено,
1 = дозволено.

Біти 24-26 (SPI Cycle Frequency) - задає частоту бітової
синхронізації при виконанні транзакції на SPI. Використовуються два значення
(Інші зарезервовані): 000b = 20MHz, 001b = 33MHz.

Біти 27-31 (Reserved) - не використовуються.

Відзначимо, що попереднє заповнення восьми байтів регістра Opcode Menu
Configuration Register і двох байтів регістра Prefix Opcode Configuration
Register виконує BIOS при старті платформи. Тому, при формуванні бітових
полів, які обирають код команди і код префікса, програма повинна просканувати
зазначені регістри і знайти, під яким номером у них знаходяться коди необхідних
операцій. Варіанти заповнення можуть бути різними, навіть серед материнських плат
однієї моделі, що використовують різні версії BIOS. Деякі утиліти перезапису
Flash змінюють вміст зазначених регістрів.

Детальний опис всіх регістрів і команд контролера SPI наводиться в [3].
Опис команд мікросхеми SPI Flash наводиться в [4-7]. Інформація, викладена
вище, також проілюстрована асемблерними прикладами, що додаються до статті.

Механізми доступу до Flash ROM і захист записи

У загальному випадку, для ініціювання операцій стирання або перезапису мікросхеми
BIOS, програма повинна виконати чотири дії:

Розглянемо докладніше ці процедури, механізми захисту, що перешкоджають їх
несанкціонованого виконання і, звичайно, уразливості цих механізмів.

Джерела інформації

Електронні документи, доступні на сайті
developer.intel.com.

1) Intel Low Pin Count (LPC) Interface Specification. Revision 1.1. Document
Number 251289-001.
2) Intel P965 Express Chipset Family Datasheet - For the Intel 82P965 Memory
Controller Hub (MCH). Document Number: 313053-001.
3) Intel I / O Controller Hub 8 (ICH8) Family Datasheet - For the Intel 82801HB
ICH8 and 82801HR ICH8R I / O Controller Hubs. Document Number: 313056-001.

Електронні документи, доступні на сайті
www.superflash.com або
ssti.com.

4) 1 Mbit SPI Serial Flash SST25VF010 Data Sheet. Document Number:
S71233-01-000.
5) 8 Mbit SPI Serial Flash SST25VF080B Data Sheet. Document Number:
S71296-01-000.

Електронні документи, доступні на сайті
winbond.com.tw.

6) W25X10A, W25X20A, W25X40A, W25X80A 1M-bit, 2M-bit, 4M-bit and 8M-bit
Serial Flash Memory with 4KB sectors and dual output SPI Data Sheet.

Електронні документи, доступні на сайті
macronix.com.

7) MX25L802 8M-bit [8Mx1] CMOS Serial Flash EEPROM Data Sheet.

Електронні документи, доступні на сайті
datakey.com.

8) SPI EEPROM Interface Specification. Part Number 223-0017-004 Revision H.

Електронні документи, доступні на сайті
vtitechnologies.com.

9) SPI Interface Specification. Technical Note 15.

Електронні документи, доступні на сайті
pcisig.com.

Документи [11], [12] на сайті pcisig.com доступні тільки для членів PCI
Special Interest Group. Скориставшись пошуковими системами, можна знайти
дані документи для вільного завантаження.
10) PCI BIOS Specification. Revision 2.1.
11) PCI Local Bus Specification. Revision 3.0.
12) PCI-to-PCI Bridge Architecture Specification. Revision 1.1.

Покажи цю статтю друзям: