AMI8 Inside

Материал из Wiki.

Эпиграф
AMIBIOS восьмой инкарнации, равно как и в своих предыдущих воплощениях (AMI6, AMI7) имеет много общего с главным трудом родины разработчиков (Индии) - камасутрой.

 

Содержание

AMIBIOSC0800

Главная сигнатура располагается там где ей и положено - в BootBlock-е. Она есть "стержень" биоса, от неё все пляшут дальше. Найти просто, для восьмой версии это "AMIBIOSC08xx" (где xx - подверсия).

struct AMI_BIOS_Header        // "AMIBIOSC"-signature
{
db RESERVED[3]; // +00 =20 xx xx xx
db bROM_IMAGE_ATTR; // +03 -1D xx
db ROM_IMAGE_VER[4]; // +04 -1C xx xx xx xx
db bMODUL_EXTHEADER_LEN; // +08 -18 xx
db bEXTHEADER_LEN; // +09 -17 0A
db SIGNATURE[8]; // +0A -16 'AMIBIOS'
db CORE_VER[4]; // +12 -0E '08xx'
dw wBIOS_dqLEN; // +16 -0A xx xx
dd dBIOS_CRC; // +18 -08 xx xx xx xx
dd FMB; // +1C -04 xx xx xx xx
}; // =20 -00

Модули имеют структуру заголовков не отличающуюся от AMI7 с поправкой на то, что dCRC используется 32-битная (а не 8-битная, как в AMI7) контрольная сумма.

struct  AMI_Module_Header
{
dd dDataSize; // +00
dd dCRC; // +04
dd Next; // +08
dw wDataSize; // +0C
db bID; // +0E
db bAttr; // +0F
dd Dest; // +10
// =14
dd PackSize; // +14
dd UnPackSize; // +18
}; // =1C

В отличие от предыдущих версий (AMI6, AMI7) файлы модулей в биосе "растут" от конца к началу (как в PhoenixBIOS). Т.е. чтобы "разобрать" AMI8 нужно найти AMH (AMI_BIOS_Header) и поле FMB (First Modul in BIOS) укажет на первый модуль.

Важное замечание. В "официальной версии" начальной точкой заголовка модуля считается поле Next (в результате чего dCRC и dDataSize имеют отрицательные смещения) и потому значение в нём (в поле Next) также будет указывать именно на поле Next в заголовке следующего модуля. Однако такой способ "исчисления" не слишком удобен для понимания, потому заголовок был приведён к "классическому" виду.

Для подсчёта CRC модуля используется 32-bit суммирование по всей длине (от поля dDataSize до последнего dword модуля - кстати, именно поэтому в AMI8 используется выравнивание на 4 байта).

Оригинальная процедура подсчёта modul-CRC в AMI8 выглядит следующим образом:

count_modul_CRC	proc near          
mov eax, 14h
sub esi, eax
mov ecx, [esi]
add ecx, eax
shr ecx, 2
xor eax, eax
@@:
add eax, [esi]
add esi, 4
loop @B
or eax, eax
retn


Подсчёт CRC биоса ведётся по схожему алгоритму, только с "дискретностью" на "октобайт" (qword):

call    _search_AMIBIOSC; return in EDI offset 'AMIBIOSC'-signature
jnz AMIBIOSC_fail; signature not found
mov cx, [edi-0Ah]
xor eax, eax
@@:
add eax, [edi-4]
sub edi, 8
add eax, [edi]
loop @B
jz short BIOS_CRC_OK

Как видно из алгоритма, подсчёт ведётся от начала сигнатуры (не включая её) и исчисляется wBIOS_dqLEN "октобайт" (qword).


Устройство и принцип действия


Разбираем на запчасти

Первое сразу заметное отличие от предыдущих (AMI6 / AMI7) ядер - модули в AMI8 "растут" от конца биоса к началу, как это всегда было в том же PhoenixBIOS. В результате, если мы захотим "разобрать" биос на модули, то технология следующая:

  1. Ищем ABH - AMI BIOS Header ('AMIBIOSC'-signature)
  2. Поле ABH->FMB (First Module in BIOS) указывает на заголовок первого модуля.
  3. Отняв от ABH->FMB 8 байт (из-за того, что "центральным" в заголовке считается поле Next) получим указатель на AMH - первый модуль в BIOS.
  4. Следующий модуль будет лежать по смещению ( AMH->Next - 8 )
  5. Если AMH->Next == 0 - это последний модуль.

 


Single Link Arch BIOS

Но не изменившееся направление "роста" модулей является главным изменением по сравнению с AMI6 / AMI7. Главным нововведением стал модуль 1B, который MMTOOL обзывет 'Single Link Arch BIOS'.


RAM map in POST

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SEG CODE other(DATA/STACK/etc) ADDR BEG-END SIZE(h-bytes)
---------**********---------------------****************----------------*
F000:0 RUN F0000 - FFFFF 10000 (64kB)
E800:0 USB_DATA E8000 - EFFFF 800 *
E36A:0 AFDR E36A0 - E7FFF
E369:0 FDR E3690 -
E368:0 INT10 E3680 -
E000:0 I13R E0000 -
C000:0 SHADOW_DATA C0000 - DFFFF 20000 (128kB) *
B2A7:0 SMI_STRUC B2A70 -
A800:0 SMI_BSP A8000 -
A7E0:0 SMI_BSP_DUMP A7E00 - A7FFF 200 *
A760:0 SMI_BSP_STACK A7600 - A7DFF 800 *
A00D:0 SMI_BSP_DATA A00D0 -
A000:0 SMI_BSP_ENTRY A0000
9000:0 90000 - 91655 1656
8000:0 BB 80000 - 8FFFF 10000 (64kB)
5129:0 ACPITBL_DATA 51290 -
4C0D:0 SETSVR 4C0D0
4000:0 POST 40000
3000:0 TEMP_DATA 30000 10000 (64kB) *
2D9A:0 SMBIOS 2D9A0
2B35:0 POST_DATA 2B350
2A33:0 PMM_DATA 2A330
29E0:0 PMM 29E00
25ED:0 I13P 25ED0
1C54:0 DIM_DATA 1C540
13CB:0 DIM 13CB0
1352:0 INTERFACE 13520 *
0453:0 U 04530 EFF0 *
0053:0 STACK 00530 - 452F ? 400 *
0051:0 BBLK_DATA 00510 - 00522 13 *
0040:0 BDA_DATA 00400 - 0050F 110 *
0000:0 IVT_DATA 00000 - 003FF 400 *
=========================================================================

...in progress...

Если данная информация оказалась полезной/интересной - плюсаните, пожалуйста:

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.

Подробнее о форматировании текста

Антибот - введите цифру.
Ленты новостей