AMI8 Inside

Материал из Wiki.ROM.by
Перейти к: навигация, поиск
Эпиграф
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...


Персональные инструменты
Google