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.