Articles

BIOS

A BIOS (um acrónimo para Basic Input/Output System e também conhecida como BIOS ROM ou Xbox ROM) é uma imagem de firmware que é mapeada para os 16MiB superiores do espaço de endereço físico da CPU (0xFF000000 – 0xFFFFFFFFFFFFFF). Tal como a BIOS standard do PC, é responsável pela inicialização do hardware Xbox e pelo arranque do sistema. Ao contrário da BIOS do PC, porém, a imagem da BIOS do Xbox também contém o kernel de forma comprimida e criptografada.

Em uma Xbox padrão, a imagem da BIOS é armazenada na ROM Flash. A imagem da BIOS é na verdade 256 kiB, duplicada 4 vezes para preencher o chip de 1 MiB ROM. Você pode verificar isso executando:

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

Você vai notar que é o mesmo arquivo repetido 4 vezes. Isso explica como alguns chips BIOS são de 1 MiB e outros de 256 kiB. A próxima coisa é que a BIOS é repetida de 0xFF000000 até encher o resto da memória. Em outras palavras, que 256 kiB de dados são repetidos 64 vezes.

Componentes

A BIOS é dividida em diferentes componentes. Estes são em grande parte os mesmos de BIOS para BIOS, mas com algumas diferenças.

3944 4034 4134 4817 5101 5530 5713 5838
Tabela de Inicialização NV2A 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000 0x00000
MCPX Tabela de Inicialização 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070 0x00070
X-Códigos 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080 0x00080
Cadeia de Copyright 0x00CFA 0x00CFA 0x00CFA 0x00DB9 0x00E49 0x00E59 0x00E59 0x00DCC
Kernel 0x0619C
Kernel Data Segment 0x3944C
2BL
Sempre 0x6000 bytes
0x39E00 0x39E00 0x39E00
FBL
Sempre 0x2880 bytes
0x3D400 0x3D400 0x3D400 0x3D400 0x3D400
Carregador de isco de engodo 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00 0x3FE00

Para informações sobre como estas secções são utilizadas, ver Processo de Boot.

NV2A Tabela de Inicialização

A primeira DWORD é um ponteiro para uma tabela de valores que a ponte norte NV2A usa para se inicializar, mas com o bit menos significativo sempre definido como 1 (provavelmente algum tipo de verificação de sanidade). A segunda DWORD é o ponteiro de tabela não modificada. Em toda a BIOS Xbox, a tabela de inicialização da NV2A está sempre no file offset 8, endereço virtual 0xFF000008.

A primeira DWORD da tabela de inicialização da NV2A é o número mágico 0x2B16D065 (chamado de “boot header”). O propósito dos valores restantes na tabela é desconhecido.

MCPX Tabela de Inicialização

Esta é uma tabela de valores usada para inicializar a ponte sul MCPX. Ela deve ser colocada no offset 0x70 na imagem ROM.

xcodes

Estas são as operações do xcode executadas pelo interpretador MCPX. As primeiras linhas parecem ser um disparate (não executam nenhuma funcionalidade), mas depois os primeiros códigos reais que encontrei são:

Os xcodes nas versões 3944, 4034, 4134 da BIOS, todos começam com:04 10 08 00 80 01 80 00 00

Os xcodes nas versões da BIOS 4817, 5101, 5530, 5713, 5838 todos começam com:04 84 08 00 80 01 80 00 00

Isto leva-me a acreditar que as três primeiras versões da BIOS que tenho são compatíveis com a 1.0 MCPX, e as outras são compatíveis com a 1.1 MCPX.

Next, algumas pessoas acreditavam que havia outra seção desconhecida entre os xcodes e a string de copyright. Até onde posso dizer, essa seção foi para permitir que a instrução do xcode se expandisse, pois a 5838 BIOS tem consideravelmente mais xcodes que a 3944 BIOS.