Articles

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.