Articles

BIOS

BIOS (akronim od Basic Input/Output System i znany również jako BIOS ROM lub Xbox ROM) jest obrazem firmware’u, który jest mapowany do górnych 16MiB fizycznej przestrzeni adresowej procesora (0xFF0000 – 0xFFFFFFFF). Podobnie jak standardowy BIOS komputera PC, jest on odpowiedzialny za inicjalizację sprzętu Xbox i uruchamianie systemu. Jednak w przeciwieństwie do BIOS-u PC, obraz BIOS-u konsoli Xbox zawiera również jądro w skompresowanej i zaszyfrowanej formie.

Na standardowej konsoli Xbox, obraz BIOS-u jest przechowywany w pamięci Flash ROM. Obraz BIOS-u to tak naprawdę 256 kiB, powielone 4 razy, aby wypełnić 1 MiB pamięci ROM. Możesz to sprawdzić uruchamiając:

$ split -n 4 xbox.bin $ md5sum xa*542c62cb976a4993c8c5027dff9638ce xaa542c62cb976a4993c8c5027dff9638ce xab542c62cb976a4993c8c5027dff9638ce xac542c62cb976a4993c8c5027dff9638ce xad

Zauważysz, że jest to ten sam plik powtórzony 4 razy. To wyjaśnia, dlaczego niektóre układy BIOS-u mają 1 MiB, a inne 256 kiB. Kolejną rzeczą jest to, że BIOS jest powtarzany od 0xFF0000 aż do zapełnienia reszty pamięci. Innymi słowy, te 256 kiB danych jest powtarzane 64 razy.

Komponenty

BIOS jest podzielony na różne komponenty. Są one w dużej mierze takie same w różnych BIOS-ach, ale z pewnymi różnicami.

.

.

.

3944 4034 4134 4817 5101 5530 5713 5838
Tablica inicjalizacji NV2A 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000
Tablica inicjalizacji MCPX 0x00070 . 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070
X-Kody 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 . 0x00080
Copyright String 0x00CFA 0x00CFA 0x00CFA 0x00DB9 0x00E49 . 0x00E59 0x00E59 0x00DCC
Kernel 0x0619C .
Segment danych jądra 0x3944C
2BL
Zawsze 0x6000 bajtów
0x39E00 0x39E00 0x39E00 .
FBL
Zawsze 0x2880 bajtów
0x3D400 0x3D400 0x3D400 0x3D400 0x3D400 0x3D400
Decoy Boot Loader 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00

W celu uzyskania informacji, jak te sekcje są używane, zobacz Boot Process.

Tablica inicjalizacji NV2A

Pierwszy DWORD jest wskaźnikiem do tablicy wartości, których mostek północny NV2A używa do inicjalizacji, ale z najmniej znaczącym bitem zawsze ustawionym na 1 (prawdopodobnie jakaś kontrola poprawności). Drugi DWORD jest niezmodyfikowanym wskaźnikiem do tabeli. Na wszystkich Xbox BIOS, tablica inicjalizacyjna NV2A jest zawsze w pliku offset 8, adres wirtualny 0xFF000008.

Pierwszym DWORD tablicy inicjalizacyjnej NV2A jest magiczna liczba 0x2B16D065 (nazywana „boot header”). Przeznaczenie pozostałych wartości w tablicy jest nieznane.

Tablica inicjalizacyjna MCPX

Jest to tablica wartości używanych do inicjalizacji mostka południowego MCPX. Musi być umieszczona na offsecie 0x70 w obrazie ROM.

xcodes

To są operacje xcode wykonywane przez interpreter MCPX. Pierwsze kilka linii wydaje się być nonsensowne (nie wykonują żadnej funkcjonalności), ale potem pojawiają się pierwsze rzeczywiste kody, które znalazłem:

Kody xcodes w BIOS-ie w wersjach 3944, 4034, 4134 zaczynają się od:04 10 08 00 80 01 80 00 00

Kody xcodes w BIOS-ach w wersjach 4817, 5101, 5530, 5713, 5838 wszystkie zaczynają się od:04 84 08 00 80 01 80 00 00

To prowadzi mnie do przekonania, że pierwsze trzy wersje BIOS-ów, które posiadam są kompatybilne z 1.0 MCPX, a pozostałe są kompatybilne z 1.1 MCPX.

Następnie, niektórzy uważali, że istnieje jeszcze jedna nieznana sekcja pomiędzy xcodes a copyright stringiem. Z tego, co wiem, sekcja ta miała umożliwić rozszerzenie zestawu instrukcji xcode, ponieważ BIOS 5838 ma znacznie więcej xcodes niż BIOS 3944.