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.