Articles

BIOS

Il BIOS (un acronimo per Basic Input/Output System e conosciuto anche come BIOS ROM o Xbox ROM) è un’immagine del firmware che è mappata nei primi 16MiB dello spazio degli indirizzi fisici della CPU (0xFF000000 – 0xFFFFFFFF). Come il BIOS standard del PC, è responsabile dell’inizializzazione dell’hardware Xbox e dell’avvio del sistema. A differenza del BIOS del PC, tuttavia, l’immagine del BIOS della Xbox contiene anche il kernel in una forma compressa e criptata.

Su una Xbox standard, l’immagine del BIOS è memorizzata nella Flash ROM. L’immagine BIOS è in realtà 256 kiB, duplicata 4 volte per riempire il chip ROM da 1 MiB. Potete verificarlo eseguendo:

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

Si noterà che è lo stesso file ripetuto 4 volte. Questo spiega come alcuni chip BIOS siano da 1 MiB e altri da 256 kiB. La cosa successiva è che il BIOS si ripete da 0xFF000000 fino a riempire il resto della memoria. In altre parole, quei 256 kiB di dati sono ripetuti 64 volte.

Componenti

Il BIOS è diviso in diversi componenti. Questi sono in gran parte gli stessi da BIOS a BIOS, ma con alcune differenze.

3944 4034 4134 4817 5101 5530 5713 5838
Tabella inizializzazione NV2A 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000
Tabella inizializzazione MCPX 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070
X-Codici 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080
Copyright String 0x00CFA 0x00CFA 0x00CFA 0x00DB9 0x00E49 0x00E59 0x00E59 0x00DCC
Kernel 0x0619C
Segmento Dati Kernel 0x3944C
2BL
Sempre 0x6000 byte
0x39E00 0x39E00 0x39E00
FBL
Sempre 0x2880 byte
0x3D400 0x3D400 0x3D400 0x3D400 0x3D400
Decoy Boot Loader 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00

Per informazioni su come queste sezioni sono usate, vedere Processo di avvio.

Tabella di inizializzazione NV2A

Il primo DWORD è un puntatore a una tabella di valori che il northbridge NV2A usa per inizializzarsi, ma con il bit meno significativo sempre impostato su 1 (probabilmente una sorta di controllo di sanità mentale). Il secondo DWORD è il puntatore alla tabella non modificato. Su tutti i BIOS Xbox, la tabella di inizializzazione NV2A è sempre all’offset 8 del file, indirizzo virtuale 0xFF000008.

Il primo DWORD della tabella di inizializzazione NV2A è il numero magico 0x2B16D065 (chiamato “boot header”). Lo scopo dei valori rimanenti nella tabella è sconosciuto.

Tabella di inizializzazione MCPX

Questa è una tabella di valori usata per inizializzare il southbridge MCPX. Deve essere posizionata all’offset 0x70 nell’immagine ROM.

xcodes

Queste sono le operazioni xcode eseguite dall’interprete MCPX. Le prime due righe sembrano essere senza senso (non eseguono alcuna funzionalità), ma poi i primi codici effettivi che ho trovato sono:

Gli xcodes nelle versioni BIOS 3944, 4034, 4134 iniziano tutti con:04 10 08 00 80 01 80 00 00

Gli xcode nelle versioni BIOS 4817, 5101, 5530, 5713, 5838 iniziano tutti con:04 84 08 00 80 01 80 00 00

Questo mi porta a credere che le prime tre versioni BIOS che ho sono compatibili con il 1..0 MCPX, e le altre sono compatibili con la 1.1 MCPX.

In seguito, alcune persone credevano che ci fosse un’altra sezione sconosciuta tra gli xcodes e la stringa del copyright. Per quanto posso dire, quella sezione era per permettere l’espansione del set di istruzioni xcode, poiché il BIOS 5838 ha considerevolmente più xcodes del BIOS 3944.