Articles

BIOS

Het BIOS (een acroniem voor Basic Input/Output System en ook bekend als het BIOS ROM of Xbox ROM) is een firmware image dat is toegewezen aan de bovenste 16MiB van de fysieke adresruimte van de CPU (0xFF000000 – 0xFFFFFFFF). Net als de standaard PC BIOS, is het verantwoordelijk voor het initialiseren van de Xbox hardware en het opstarten van het systeem. In tegenstelling tot het PC BIOS bevat het Xbox BIOS image echter ook de kernel in een gecomprimeerde en gecodeerde vorm.

Op een standaard Xbox wordt het BIOS image opgeslagen in het Flash ROM. De BIOS image is eigenlijk 256 kiB, 4 keer gedupliceerd om de 1 MiB ROM chip te vullen. Je kunt dit controleren door te draaien:

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

Je zult zien dat het hetzelfde bestand is dat 4 keer herhaald wordt. Dat verklaart waarom sommige BIOS chips 1 MiB zijn en andere 256 kiB. Het volgende is dat het BIOS wordt herhaald vanaf 0xFF000000 totdat het de rest van het geheugen vult. Met andere woorden, die 256 kiB aan data wordt 64 keer herhaald.

Componenten

Het BIOS is opgedeeld in verschillende componenten. Deze zijn grotendeels hetzelfde van BIOS tot BIOS, maar met enkele verschillen.

3944 4034 4134 4817 5101 5530 5713 5838
NV2A Initialisatietabel 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000
MCPX Initialisatietabel 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070
X-Codes 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080
Copyright String 0x00CFA 0x00CFA 0x00CFA 0x00DB9 0x00E49 0x00E59 0x00E59 0x00DCC
Kernel 0x0619C
Kernel Data Segment 0x3944C
2BL
Altijd 0x6000 bytes
0x39E00 0x39E00 0x39E00
FBL
Altijd 0x2880 bytes
0x3D400 0x3D400 0x3D400 0x3D400 0x3D400
Decoy Boot Loader 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00

Voor informatie hoe deze secties worden gebruikt, zie Opstartproces.

NV2A Initialisatietabel

De eerste DWORD is een pointer naar een tabel met waarden die de NV2A northbridge gebruikt om zichzelf te initialiseren, maar waarvan de minst significante bit altijd op 1 wordt gezet (waarschijnlijk een soort sanity check). De tweede DWORD is de ongewijzigde tabel pointer. Op alle Xbox BIOS, staat de NV2A initialisatie tabel altijd op file offset 8, virtueel adres 0xFF000008.

De eerste DWORD van de NV2A initialisatie tabel is het magische getal 0x2B16D065 (de “boot header” genoemd). Het doel van de overige waarden in de tabel is onbekend.

MCPX Initialization Table

Dit is een tabel met waarden die worden gebruikt om de MCPX southbridge te initialiseren. Hij moet worden geplaatst op offset 0x70 in de ROM image.

xcodes

Dit zijn de xcode operaties die worden uitgevoerd door de MCPX interpreter. De eerste paar regels lijken onzin (ze voeren geen enkele functionaliteit uit), maar daarna zijn de eerste werkelijke codes die ik heb gevonden:

De xcodes in de BIOS versies 3944, 4034, 4134 beginnen allemaal met:04 10 08 00 80 01 80 00 00

De xcodes in de BIOS versies 4817, 5101, 5530, 5713, 5838 beginnen allemaal met:04 84 08 00 80 01 80 00 00

Dit doet mij geloven dat de eerste drie BIOS versies die ik heb compatibel zijn met de 1.0 MCPX, en de rest compatibel zijn met de 1.1 MCPX.

Verder geloofden sommige mensen dat er nog een onbekende sectie tussen de xcodes en de copyright string zat. Voor zover ik kan nagaan, was die sectie bedoeld om de xcode instructieset te kunnen uitbreiden, daar de 5838 BIOS aanzienlijk meer xcodes heeft dan de 3944 BIOS.