BIOS
La BIOS (acrónimo de Basic Input/Output System (Sistema Básico de Entrada/Salida) y también conocida como BIOS ROM o Xbox ROM) es una imagen de firmware que se asigna a los 16MiB superiores del espacio de direcciones físicas de la CPU (0xFF000000 – 0xFFFFFF). Al igual que la BIOS de PC estándar, es responsable de inicializar el hardware de Xbox y arrancar el sistema. A diferencia de la BIOS de PC, sin embargo, la imagen de la BIOS de Xbox también contiene el kernel en una forma comprimida y encriptada.
En una Xbox estándar, la imagen de la BIOS se almacena en la Flash ROM. La imagen de la BIOS es en realidad 256 kiB, duplicada 4 veces para llenar el chip de 1 MiB de ROM. Puedes comprobarlo ejecutando:
$ split -n 4 xbox.bin $ md5sum xa*542c62cb976a4993c8c5027dff9638ce xaa542c62cb976a4993c8c5027dff9638ce xab542c62cb976a4993c8c5027dff9638ce xac542c62cb976a4993c8c5027dff9638ce xad
Verás que es el mismo archivo repetido 4 veces. Eso explica que algunos chips de la BIOS sean de 1 MiB y otros de 256 kiB. Lo siguiente es que la BIOS se repite desde 0xFF000000 hasta llenar el resto de la memoria. En otras palabras, esos 256 kiB de datos se repiten 64 veces.
Componentes
La BIOS se divide en diferentes componentes. Estos son en gran medida los mismos de BIOS a BIOS, pero con algunas diferencias.
3944 | 4034 | 4134 | 4817 | 5101 | 5530 | 5713 | 5838 | ||
---|---|---|---|---|---|---|---|---|---|
Tabla de inicialización de NV2A | 0x00000 | 0x00000 | 0x00000 | 0x00000 | 0x00000 | 0x00000 | 0x00000 | 0x00000 | |
Tabla de inicialización MCPX | 0x00070 | 0x00070 | 0x00070 | 0x00070 | 0x00070 | 0x00070 | 0x00070 | 0x00070 | |
X-Códigos | 0x00080 | 0x00080 | 0x00080 | 0x00080 | 0x00080 | 0x00080 | 0x00080 | ||
Copyright String | 0x00CFA | 0x00CFA | 0x00CFA | 0x00DB9 | 0x00E49 | 0x00E59 | 0x00E59 | 0x00DCC | |
Kernel | 0x0619C | ||||||||
Segmento de datos del kernel | 0x3944C | . | |||||||
2BL Siempre 0x6000 bytes |
0x39E00 | 0x39E00 | 0x39E00 | ||||||
FBL Siempre 0x2880 bytes |
0x3D400 | 0x3D400 | 0x3D400 | 0x3D400 | 0x3D400 | ||||
Decoy Boot Loader | 0x3FE00 | 0x3FE00 | 0x3FE00 | 0x3FE00 | 0x3FE00 | 0x3FE00 | 0x3FE00 | 0x3FE00 |
Para saber cómo se utilizan estas secciones, véase Proceso de arranque.
Tabla de inicialización de NV2A
El primer DWORD es un puntero a una tabla de valores que el northbridge de NV2A utiliza para inicializarse, pero con el bit menos significativo siempre a 1 (probablemente algún tipo de comprobación de sanidad). El segundo DWORD es el puntero de la tabla sin modificar. En todas las BIOS de Xbox, la tabla de inicialización de NV2A está siempre en el offset de archivo 8, dirección virtual 0xFF000008.
El primer DWORD de la tabla de inicialización de NV2A es el número mágico 0x2B16D065 (llamado la «cabecera de arranque»). El propósito de los valores restantes en la tabla es desconocido.
Tabla de inicialización MCPX
Esta es una tabla de valores utilizada para inicializar el southbridge MCPX. Debe colocarse en el offset 0x70 de la imagen ROM.
xcodes
Estas son las operaciones xcode que ejecuta el intérprete MCPX. El primer par de líneas parecen no tener sentido (no ejecutan ninguna funcionalidad), pero luego los primeros códigos reales que he encontrado son:
Los xcodes en las versiones de la BIOS 3944, 4034, 4134 empiezan todos por:04 10 08 00 80 01 80 00 00
Los xcodes de las versiones de la BIOS 4817, 5101, 5530, 5713, 5838 empiezan todos por:04 84 08 00 80 01 80 00 00
Esto me lleva a pensar que las tres primeras versiones de la BIOS que tengo son compatibles con el 1.0 MCPX, y el resto son compatibles con la 1.1 MCPX.
Luego, algunas personas creían que había otra sección desconocida entre los xcodes y la cadena de copyright. Por lo que puedo decir, esa sección era para permitir que el conjunto de instrucciones xcode se expandiera, ya que la BIOS 5838 tiene considerablemente más xcodes que la BIOS 3944.