Эпиграф
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) укажет на первый модуль.
Для подсчёта 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. В результате, если мы захотим "разобрать" биос на модули, то технология следующая:
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...
Отправить комментарий