Master Boot Record
O master boot record (MBR), ou registro mestre de inicialização, é um tipo de setor de inicialização localizado no primeiro bloco de dispositivos de armazenamento em massa de computadores particionados, como discos fixos ou unidades removíveis, destinado ao uso em sistemas compatíveis com IBM PC e posteriores. O conceito de MBR foi introduzido publicamente em 1983 com o PC DOS 2.0.
O MBR contém as informações sobre como os setores do disco (também conhecidos como "blocos") estão divididos em partições, com cada partição contendo teoricamente um sistema de arquivos. O MBR também contém código executável para funcionar como um carregador para o sistema operacional instalado — geralmente passando o controle para a segunda etapa do carregador ou em conjunto com o registro de inicialização do volume (VBR) de cada partição. Esse código do MBR é comumente chamado de carregador de inicialização (boot loader).
A organização da tabela de partições no MBR limita o espaço máximo de armazenamento endereçável de um disco particionado a 2 TiB (232 × 512 bytes).[1] Abordagens para elevar ligeiramente esse limite utilizando aritmética de 32 bits ou setores de 4096 bytes não são suportadas oficialmente, pois quebram fatalmente a compatibilidade com os carregadores de inicialização existentes, com a maioria dos sistemas operacionais compatíveis com MBR e ferramentas de sistema associadas, além de poderem causar corrupção grave de dados quando usadas fora de ambientes de sistema rigidamente controlados. Portanto, o esquema de particionamento baseado em MBR foi substituído pelo esquema de Tabela de Partições GUID (GPT) em quase todos os computadores novos. Uma GPT pode coexistir com um MBR a fim de fornecer alguma forma limitada de compatibilidade retroativa para sistemas mais antigos.
Os MBRs não estão presentes em mídias não particionadas, como disquetes, superdisquetes ou outros dispositivos de armazenamento configurados para se comportarem como tal, e também não estão necessariamente presentes em unidades usadas em plataformas que não sejam PC.
Visão geral
[editar | editar código]O suporte a mídias particionadas e, consequentemente, ao registro mestre de inicialização (MBR), foi introduzido com o IBM PC DOS 2.0 em março de 1983 para suportar o disco rígido de 10 MB do então novo IBM Personal Computer XT, ainda utilizando o sistema de arquivos FAT12. A versão original do MBR foi escrita por David Litton da IBM em junho de 1982. A tabela de partições suportava até quatro partições primárias. Isso não mudou quando o FAT16 foi introduzido como um novo sistema de arquivos com o DOS 3.0. O suporte a uma partição estendida, um tipo especial de partição primária usada como contêiner para abrigar outras partições, foi adicionado com o DOS 3.2, e as unidades lógicas aninhadas dentro de uma partição estendida surgiram com o DOS 3.30. Como o MS-DOS, o PC DOS, o OS/2 e o Windows nunca foram habilitados para inicializar a partir delas, o formato do MBR e o código de inicialização permaneceram quase inalterados em termos de funcionalidade (exceto por algumas implementações de terceiros) ao longo das eras do DOS e OS/2 até 1996.
Em 1996, o suporte ao endereçamento de bloco lógico (LBA) foi introduzido no Windows 95B e no MS-DOS 7.10 (não confundir com o IBM PC-DOS 7.1) para suportar discos maiores que 8 GB. Os carimbos de data/hora do disco (disk timestamps) também foram introduzidos.[2] Isso também refletia a ideia de que o MBR deve ser independente de sistema operacional e de sistema de arquivos. No entanto, essa regra de design foi parcialmente comprometida em implementações mais recentes do MBR da Microsoft, que forçam o acesso CHS para os tipos de partição FAT16B e FAT32 0x06/0x0B, enquanto o LBA é usado para 0x0E/0x0C.
Apesar da documentação às vezes escassa de certos detalhes intrínsecos do formato MBR (o que ocasionalmente causava problemas de compatibilidade), ele foi amplamente adotado como um padrão da indústria de fato, devido à grande popularidade dos computadores compatíveis com PC e à sua natureza semiestática ao longo de décadas. Isso ocorreu a ponto de ser suportado por sistemas operacionais de computador para outras plataformas. Às vezes, isso ocorria em adição a outros padrões preexistentes ou multiplataforma para inicialização (bootstrapping) e particionamento.[3]
As entradas de partição do MBR e o código de inicialização do MBR usados em sistemas operacionais comerciais, no entanto, são limitados a 32 bits.[1] Portanto, o tamanho máximo de disco suportado em discos que utilizam setores de 512 bytes (sejam reais ou emulados) pelo esquema de particionamento MBR (sem aritmética de 32 bits) é limitado a 2 TiB.[1] Consequentemente, um esquema de particionamento diferente deve ser usado para discos maiores, já que estes se tornaram amplamente disponíveis desde 2010. O esquema de particionamento MBR está, por isso, em processo de substituição pela Tabela de Partições GUID (GPT). A abordagem oficial faz pouco mais do que garantir a integridade dos dados empregando um MBR de proteção (protective MBR). Especificamente, ela não fornece compatibilidade retroativa com sistemas operacionais que também não suportam o esquema GPT. Enquanto isso, múltiplas formas de MBRs híbridos foram projetadas e implementadas por terceiros para manter partições localizadas nos primeiros 2 TiB físicos de um disco em ambos os esquemas de particionamento "em paralelo" e/ou para permitir que sistemas operacionais mais antigos inicializem a partir de partições GPT também. A atual natureza não padronizada dessas soluções causa vários problemas de compatibilidade em certos cenários.
O MBR consiste em 512 ou mais bytes localizados no primeiro setor da unidade.
Ele pode conter um ou mais dos seguintes itens:
- Uma tabela de partições que descreve as partições de um dispositivo de armazenamento. Neste contexto, o setor de inicialização também pode ser chamado de setor de partição.
- Código de inicialização: Instruções para identificar a partição configurada como inicializável, e então carregar e executar seu registro de inicialização do volume (VBR) como um carregador em cadeia (chain loader).
- Um carimbo de data/hora do disco (disk timestamp) opcional de 32 bits.[2]
- Uma assinatura de disco (disk signature) opcional de 32 bits.[4][5][6][7]
Particionamento de disco
[editar | editar código]O IBM PC DOS 2.0 introduziu o utilitário FDISK para configurar e manter partições MBR. Quando um dispositivo de armazenamento foi particionado de acordo com esse esquema, seu MBR contém uma tabela de partições que descreve as localizações, tamanhos e outros atributos de regiões lineares chamadas partições.
As próprias partições também podem conter dados para descrever esquemas de particionamento mais complexos, como registros de inicialização estendidos (EBRs), rótulos de disco BSD (disklabels) ou partições de metadados do Logical Disk Manager.[8]
O MBR não está localizado dentro de uma partição; ele fica no primeiro setor do dispositivo (deslocamento físico 0), precedendo a primeira partição. (O setor de inicialização presente em um dispositivo não particionado ou dentro de uma partição individual é chamado, em vez disso, de registro de inicialização do volume.) Nos casos em que o computador está executando uma sobreposição de BIOS DDO (Dynamic Drive Overlay) ou um gerenciador de inicialização, a tabela de partições pode ser movida para alguma outra localização física no dispositivo; por exemplo, o Ontrack Disk Manager frequentemente colocava uma cópia do conteúdo original do MBR no segundo setor e depois se ocultava de qualquer sistema operacional ou aplicativo inicializado subsequentemente, de modo que a cópia do MBR era tratada como se ainda residisse no primeiro setor.
Layout do setor
[editar | editar código]Por convenção, existem exatamente quatro entradas na tabela de partições primárias no esquema de tabela de partições MBR, embora alguns sistemas operacionais e ferramentas de sistema tenham estendido isso para cinco (Partições Ativas Avançadas (AAP) com o PTS-DOS 6.60[9] e DR-DOS 7.07), oito (AST e NEC MS-DOS 3.x[10][11] bem como o Storage Dimensions SpeedStor) ou até dezesseis entradas (com o Ontrack Disk Manager).
| Endereço | Descrição | Tamanho (bytes) | |
|---|---|---|---|
0x0000 (0) |
Área do código de inicialização (bootstrap) | 446 | |
0x01BE (446) |
Entrada de partição №1 | Tabela de partições (para partições primárias) |
16 |
0x01CE (462) |
Entrada de partição №2 | 16 | |
0x01DE (478) |
Entrada de partição №3 | 16 | |
0x01EE (494) |
Entrada de partição №4 | 16 | |
0x01FE (510) |
0x55 |
Assinatura de inicialização[a] | 2 |
0x01FF (511) |
0xAA | ||
| Tamanho total: 446 + 4×16 + 2 | 512 | ||
| Endereço | Descrição | Tamanho (bytes) | |
|---|---|---|---|
0x0000 (0) | Área do código de inicialização (parte 1) | 218 | |
0x00DA (218) |
0x0000 |
Carimbo de data/hora do disco[2][b] (opcional; Windows 95B/98/98SE/ME (MS-DOS 7.1–8.0). Alternativamente, pode servir como assinatura do carregador OEM com NEWLDR) | 2 |
0x00DC (220) |
Unidade física original (0x80–0xFF) |
1 | |
0x00DD (221) |
Segundos (0–59) | 1 | |
0x00DE (222) |
Minutos (0–59) | 1 | |
0x00DF (223) |
Horas (0–23) | 1 | |
0x00E0 (224) | Área do código de inicialização (parte 2, entrada do código em 0x0000) |
216 (ou 222) | |
0x01B8 (440) |
Assinatura de disco de 32 bits | Assinatura de disco (opcional; UEFI, Linux, família Windows NT e outros SOs) | 4 |
0x01BC (444) |
0x0000 (0x5A5A se for protegido contra cópia) |
2 | |
0x01BE (446) |
Entrada de partição №1 | Tabela de partições (para partições primárias) |
16 |
0x01CE (462) |
Entrada de partição №2 | 16 | |
0x01DE (478) |
Entrada de partição №3 | 16 | |
0x01EE (494) |
Entrada de partição №4 | 16 | |
0x01FE (510) |
0x55 |
Assinatura de inicialização[a] | 2 |
0x01FF (511) |
0xAA | ||
| Tamanho total: 218 + 6 + 216 + 6 + 4×16 + 2 | 512 | ||
| Endereço | Descrição | Tamanho (bytes) | |
|---|---|---|---|
0x0000 (0) | Área do código de inicialização | 428 | |
0x01AC (428) |
0x78 |
Assinatura AAP (opcional) | 2 |
0x01AD (429) |
0x56 | ||
0x01AE (430) |
Unidade física AAP (0x80–0xFE; 0x00: não usada; 0x01–0x7F, 0xFF: reservadas) |
Registro AAP (opcional) (entrada de partição AAP #0 com semântica especial) | 1 |
0x01AF (431) |
Endereço CHS (inicial) da partição AAP/arquivo de imagem ou VBR/EBR | 3 | |
0x01B2 (434) |
Reservado para tipo de partição AAP (0x00 se não usado) (opcional) |
1 | |
0x01B3 (435) |
Reservado para endereço CHS final no AAP (opcional; o byte no deslocamento 0x01B5 também é usado para a soma de verificação do MBR (PTS DE, BootWizard); 0x000000 se não usado) |
3 | |
0x01B6 (438) |
LBA inicial do arquivo de imagem AAP ou VBR/EBR ou setores relativos da partição AAP (copiado para o deslocamento +01Chex no setor carregado sobre a entrada de "setores ocultos" de um BPB DOS 3.31 (ou emulação dele) para também suportar a inicialização por EBR) |
4 | |
0x01BA (442) |
Reservado para setores no AAP (opcional; 0x00000000 se não usado) |
4 | |
0x01BE (446) |
Entrada de partição №1 | Tabela de partições (para partições primárias) |
16 |
0x01CE (462) |
Entrada de partição №2 | 16 | |
0x01DE (478) |
Entrada de partição №3 | 16 | |
0x01EE (494) |
Entrada de partição №4 | 16 | |
0x01FE (510) |
0x55 |
Assinatura de inicialização[a] | 2 |
0x01FF (511) |
0xAA | ||
| Tamanho total: 428 + 2 + 16 + 4×16 + 2 | 512 | ||
| Endereço | Descrição | Tamanho (bytes) | |
|---|---|---|---|
0x0000 (0) |
JMPS (EBhex) / Tamanho do registro NEWLDR (frequentemente 0x0A/0x16/0x1C para início do código em 0x000C/0x0018/0x001E) |
Registro NEWLDR (opcional) | 2 |
0x0002 (2) |
Assinatura "NEWLDR" |
6 | |
0x0008 (8) |
Unidade física do LOADER e flag de inicialização (0x80–0xFE, 0x00–0x7E, 0xFF, 0x7F) (se não usado, este e os 3 bytes seguintes devem ser todos 0) |
1 | |
0x0009 (9) |
Endereço CHS do setor de inicialização do LOADER ou arquivo de imagem (ex: IBMBIO.LDR) (0x000000 se não usado) |
3 | |
0x000C (12) |
Mínimo permitido para o registrador DL, caso contrário, obtém da tabela de partições (0x80: padrão; 0x00: sempre usar DL; 0xFF: sempre usar entrada da tabela) |
1 | |
0x000D (13) |
Reservado (padrão: 0x000000) |
3 | |
0x0010 (16) |
LBA do setor de inicialização do LOADER ou arquivo de imagem (opcional; 0x00000000 se não usado) |
4 | |
0x0014 (20) |
Deslocamento de correção (patch) da unidade de boot do VBR (padrão 0x0000 se não usado, caso contrário 0024hex ou 01FDhex) |
2 | |
0x0016 (22) |
Soma de verificação (0x0000 se não usada) |
2 | |
0x0018 (24) |
Assinatura do carregador OEM ("MSWIN4" para REAL/32, veja também o deslocamento +0DAhex, corresponde ao rótulo OEM no deslocamento +003hex em VBRs (opcional) |
6 | |
| Varia | Área do código de inicialização (entrada do código em 0x0000) |
Varia | |
0x01AC (428) |
0x78 |
Assinatura AAP (opcional) | 2 |
0x01AD (429) |
0x56 | ||
0x01AE (430) |
Entrada de partição AAP №0 com semântica especial | Registro AAP (opcional) | 16 |
0x01BE (446) |
Entrada de partição №1 | Tabela de partições (para partições primárias) |
16 |
0x01CE (462) |
Entrada de partição №2 | 16 | |
0x01DE (478) |
Entrada de partição №3 | 16 | |
0x01EE (494) |
Entrada de partição №4 | 16 | |
0x01FE (510) |
0x55 |
Assinatura de inicialização[a] | 2 |
0x01FF (511) |
0xAA | ||
| Tamanho total: 30 + 398 + 2 + 16 + 4×16 + 2 | 512 | ||
| Endereço | Descrição | Tamanho (bytes) | |
|---|---|---|---|
0x0000 (0) | Área do código de inicialização | 380 | |
0x017C (380) |
0x5A |
Assinatura AST/NEC (opcional; não se aplica ao SpeedStor) | 2 |
0x017D (381) |
0xA5 | ||
0x017E (382) |
Entrada de partição №8 | Tabela de partições expandida AST/NEC (opcional; também para SpeedStor) |
16 |
0x018E (398) |
Entrada de partição №7 | 16 | |
0x019E (414) |
Entrada de partição №6 | 16 | |
0x01AE (430) |
Entrada de partição №5 | 16 | |
0x01BE (446) |
Entrada de partição №4 | Tabela de partições (para partições primárias) |
16 |
0x01CE (462) |
Entrada de partição №3 | 16 | |
0x01DE (478) |
Entrada de partição №2 | 16 | |
0x01EE (494) |
Entrada de partição №1 | 16 | |
0x01FE (510) |
0x55 |
Assinatura de inicialização[a] | 2 |
0x01FF (511) |
0xAA | ||
| Tamanho total: 380 + 2 + 4×16 + 4×16 + 2 | 512 | ||
| Endereço | Descrição | Tamanho (bytes) | |
|---|---|---|---|
0x0000 (0) | Área do código de inicialização (bootstrap) | 252 | |
0x00FC (252) |
0xAA |
Assinatura DM (opcional) | 2 |
0x00FD (253) |
0x55 | ||
0x00FE (254) |
Entrada de partição | Tabela de partições expandida DM (opcional) |
16 |
0x010E (270) |
Entrada de partição | 16 | |
0x011E (286) |
Entrada de partição | 16 | |
0x012E (302) |
Entrada de partição | 16 | |
0x013E (318) |
Entrada de partição | 16 | |
0x014E (334) |
Entrada de partição | 16 | |
0x015E (350) |
Entrada de partição | 16 | |
0x016E (366) |
Entrada de partição | 16 | |
0x017E (382) |
Entrada de partição | 16 | |
0x018E (398) |
Entrada de partição | 16 | |
0x019E (414) |
Entrada de partição | 16 | |
0x01AE (430) |
Entrada de partição | 16 | |
0x01BE (446) |
Entrada de partição №1 | Tabela de partições (para partições primárias) |
16 |
0x01CE (462) |
Entrada de partição №2 | 16 | |
0x01DE (478) |
Entrada de partição №3 | 16 | |
0x01EE (494) |
Entrada de partição №4 | 16 | |
0x01FE (510) |
0x55 |
Assinatura de inicialização[a] | 2 |
0x01FF (511) |
0xAA | ||
| Tamanho total: 252 + 2 + 12×16 + 4×16 + 2 | 512 | ||
Entradas da tabela de partições
[editar | editar código]| Deslocamento (bytes) | Tamanho do campo | Descrição | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 | 1 byte | Status ou unidade física (o bit 7 definido indica ativa ou inicializável; MBRs antigos só aceitam 0x80, 0x00 significa inativa e 0x01–0x7F representam inválida)[c] | ||||||||||||||||||
| 0x01 | 3 bytes | Endereço CHS do primeiro setor absoluto na partição.[d] O formato é descrito por três bytes, veja as próximas três linhas. | ||||||||||||||||||
| 0x01 | 1 byte |
| ||||||||||||||||||
| 0x02 | 1 byte |
| ||||||||||||||||||
| 0x03 | 1 byte |
| ||||||||||||||||||
| 0x04 | 1 byte | Tipo de partição[14] | ||||||||||||||||||
| 0x05 | 3 bytes | Endereço CHS do último setor absoluto na partição.[d] O formato é descrito por 3 bytes, veja as próximas 3 linhas. | ||||||||||||||||||
| 0x05 | 1 byte |
| ||||||||||||||||||
| 0x06 | 1 byte |
| ||||||||||||||||||
| 0x07 | 1 byte |
| ||||||||||||||||||
| 0x08 | 4 bytes | LBA do primeiro setor absoluto na partição[f] | ||||||||||||||||||
| 0x0C | 4 bytes | Número de setores na partição[g] | ||||||||||||||||||
Como um artefato da tecnologia de discos rígidos da era do PC XT, a tabela de partições subdivide uma mídia de armazenamento usando unidades de cilindros, cabeças e setores (endereçamento CHS). Esses valores já não correspondem aos seus homônimos nas unidades de disco modernas, além de serem irrelevantes em outros dispositivos, como os discos de estado sólido (SSDs), que não possuem fisicamente cilindros ou cabeças.
No esquema CHS, os índices de setores (quase) sempre começaram com o setor 1 em vez do setor 0 por convenção, e devido a um erro em todas as versões do MS-DOS/PC DOS até a 7.10 inclusive, o número de cabeças é geralmente limitado a 255[h] em vez de 256. Quando um endereço CHS é grande demais para caber nesses campos, a tupla (1023, 254, 63) é tipicamente usada hoje em dia, embora em sistemas mais antigos (e com ferramentas de disco antigas) o valor do cilindro frequentemente sofria estouro (wrap around) em módulo na barreira CHS perto de 8 GB, causando ambiguidade e riscos de corrupção de dados. (Se a situação envolver um MBR "de proteção" em um disco com uma GPT, a especificação da Interface de Firmware Extensível da Intel exige o uso da tupla (1023, 255, 63)). O valor do cilindro de 10 bits é registrado em dois bytes para facilitar as chamadas às rotinas de acesso a disco do BIOS INT 13h originais/legadas, onde 16 bits eram divididos em partes de setor e cilindro, e não em limites de bytes.[13]
Devido aos limites do endereçamento CHS,[16][17] foi feita uma transição para o uso de LBA, ou endereçamento de bloco lógico. Tanto o comprimento quanto o endereço inicial da partição são valores de setor armazenados nas entradas da tabela de partições como quantidades de 32 bits. O tamanho do setor costumava ser considerado fixo em 512 (29) bytes, e uma ampla gama de componentes importantes, incluindo chipsets, setores de inicialização, sistemas operacionais, motores de banco de dados, ferramentas de particionamento, utilitários de cópia de segurança e de sistema de arquivos, além de outros softwares, tinham esse valor em código rígido (hard-coded). Desde o final de 2009, estão disponíveis unidades de disco que empregam setores de 4096 bytes (4Kn ou Advanced Format), embora o tamanho do setor para algumas dessas unidades ainda fosse reportado como 512 bytes ao sistema hospedeiro por meio de conversão no firmware do disco rígido, sendo chamadas de unidades de emulação de 512 bytes (512e).
Como os endereços e tamanhos dos blocos são armazenados na tabela de partições de um MBR usando 32 bits, o tamanho máximo, bem como o endereço inicial mais alto de uma partição que utiliza unidades com setores de 512 bytes (reais ou emulados), não pode exceder 2 TiB−512 bytes (2.199.023.255.040 bytes ou 4.294.967.295 (232−1) setores × 512 (29) bytes por setor).[1] Mitigar essa limitação de capacidade foi uma das principais motivações para o desenvolvimento da GPT.
Como as informações de particionamento são armazenadas na tabela de partições do MBR por meio de um endereço de bloco inicial e um comprimento, em teoria seria possível definir partições de tal forma que o espaço alocado para um disco com setores de 512 bytes resultasse em um tamanho total próximo a 4 TiB, se todas as partições menos uma estivessem localizadas abaixo do limite de 2 TiB e a última fosse definida como iniciando no bloco 232−1 ou perto dele, especificando seu tamanho em até 232−1. Isso definiria uma partição que exige 33 em vez de 32 bits para que o endereço do setor seja acessado. No entanto, na prática, apenas certos sistemas operacionais habilitados para LBA-48, incluindo o Linux, FreeBSD e Windows 7,[18] que utilizam internamente endereços de setor de 64 bits, realmente suportam isso. Devido a restrições de espaço de código e à própria natureza da tabela de partições do MBR em suportar apenas 32 bits, os setores de inicialização, mesmo se habilitados para suportar LBA-48 em vez de LBA-28, frequentemente usam cálculos de 32 bits, a menos que sejam projetados especificamente para suportar a faixa completa de endereços do LBA-48 ou se destinem a rodar apenas em plataformas de 64 bits. Qualquer código de inicialização ou sistema operacional que utilize internamente endereços de setor de 32 bits faria com que os endereços sofressem estouro ao acessar essa partição, resultando em uma corrupção grave de dados em todas as partições.
Para discos que apresentam um tamanho de setor diferente de 512 bytes, como unidades externas USB, também existem limitações. Um tamanho de setor de 4096 resulta em um aumento de oito vezes no tamanho de uma partição que pode ser definida usando MBR, permitindo partições de até 16 TiB (232 × 4096 bytes) de tamanho.[19] Versões do Windows mais recentes do que o Windows XP suportam tamanhos de setor maiores, assim como o Mac OS X, e o Linux suporta tamanhos de setor maiores desde a versão 2.6.31[20] ou 2.6.32,[21] mas problemas com carregadores de inicialização, ferramentas de particionamento e implementações de BIOS de computadores apresentam certas limitações,[22] uma vez que frequentemente são programados de forma rígida para reservar apenas 512 bytes para buffers de setor, fazendo com que a memória seja sobrescrita no caso de setores maiores. Isso também pode causar um comportamento imprevisível e, portanto, deve ser evitado quando a compatibilidade e a conformidade com os padrões forem uma prioridade.
Quando um dispositivo de armazenamento de dados foi particionado com o esquema GPT, o registro mestre de inicialização ainda conterá uma tabela de partições, mas seu único propósito é indicar a existência da GPT e evitar que programas utilitários que compreendem apenas o esquema de tabela de partições MBR criem novas partições no que, de outra forma, veriam como espaço livre no disco, apagando acidentalmente a GPT.
Inicialização do sistema (bootstrapping)
[editar | editar código]Em computadores compatíveis com IBM PC, o firmware de inicialização (contido na ROM BIOS) carrega e executa o registro de inicialização mestre.[23] O PC/XT (modelo 5160) utilizava um microprocessador Intel 8088. Para manter a compatibilidade, todos os sistemas com arquitetura de BIOS x86 iniciam com o microprocessador em um modo de operação chamado modo real. O BIOS lê o MBR do dispositivo de armazenamento para a memória física e, em seguida, direciona o microprocessador para o início do código de inicialização. O BIOS colocará o processador em modo real e começará a executar o programa do MBR, portanto, espera-se que o início do MBR contenha código de máquina em modo real.[23]
Como a rotina de inicialização do BIOS carrega e executa exatamente um setor a partir do disco físico, a presença da tabela de partições no MBR junto com o código de inicialização simplifica o design do programa do MBR. Ele contém um pequeno programa que carrega o registro de inicialização do volume (VBR) da partição de destino. O controle é então passado para este código, que fica responsável por carregar o sistema operacional propriamente dito. Esse processo é conhecido como carregamento em cadeia (chain loading).
Programas de código de MBR populares foram criados para inicializar o PC DOS e o MS-DOS, e códigos de inicialização semelhantes continuam em amplo uso. Esses setores de inicialização esperam que o esquema de tabela de partições do FDISK esteja em uso e varrem a lista de partições na tabela embutida do MBR para encontrar a única que está marcada com a flag de ativa.[24] Ele então carrega e executa o registro de inicialização do volume (VBR) da partição ativa.
Existem implementações alternativas de código de inicialização, algumas das quais são instaladas por gerenciadores de inicialização, que operam de diversas maneiras. Alguns códigos de MBR carregam um código adicional para o gerenciador de inicialização a partir da primeira trilha do disco, que assumem ser um espaço "livre" não alocado a nenhuma partição de disco, e o executam. Um programa MBR pode interagir com o usuário para determinar qual partição de qual unidade deve inicializar, podendo transferir o controle para o MBR de uma unidade diferente. Outros códigos de MBR contêm uma lista de locais do disco (frequentemente correspondentes ao conteúdo de arquivos em um sistema de arquivos) do restante do código do gerenciador de inicialização para carregar e executar. (O primeiro método depende de um comportamento que não é universal entre todos os utilitários de particionamento de disco, principalmente aqueles que leem e gravam GPTs. O último exige que a lista embutida de locais de disco seja atualizada sempre que forem feitas alterações que realoquem o restante do código).
Em máquinas que não usam processadores x86, ou em máquinas x86 com firmware que não seja BIOS, como Open Firmware ou firmware Extensible Firmware Interface (EFI), esse design é inadequado, e o MBR não é usado como parte da inicialização do sistema.[25] Em vez disso, o firmware EFI é capaz de compreender diretamente o esquema de particionamento GPT e o formato de sistema de arquivos FAT, carregando e executando programas mantidos como arquivos na partição de sistema EFI.[26] O MBR estará envolvido apenas na medida em que possa conter uma tabela de partições para fins de compatibilidade, caso o esquema de tabela de partições GPT tenha sido utilizado.
Existe algum código de substituição do MBR que emula a inicialização do firmware EFI, o que torna as máquinas não EFI capazes de inicializar a partir de discos que utilizam o esquema de particionamento GPT. Ele detecta uma GPT, coloca o processador no modo de operação correto e carrega o código compatível com EFI do disco para concluir essa tarefa.
Identidade do disco
[editar | editar código]
Além do código de inicialização e de uma tabela de partições, os registros mestres de inicialização podem conter uma assinatura de disco. Trata-se de um valor de 32 bits que se destina a identificar de forma única a mídia de disco (em oposição à unidade de disco — já que as duas coisas não são necessariamente as mesmas para discos rígidos removíveis).
A assinatura de disco foi introduzida pelo Windows NT versão 3.5, mas agora é usada por vários sistemas operacionais, incluindo o núcleo Linux na versão 2.6 e posteriores. Ferramentas do Linux podem usar a assinatura de disco do NT para determinar a partir de qual disco a máquina inicializou.[27]
O Windows NT (e os sistemas operacionais posteriores da Microsoft) usa a assinatura de disco como um índice para todas as partições em qualquer disco que já tenha sido conectado ao computador sob aquele SO; essas assinaturas são mantidas em chaves do Registro do Windows, principalmente para armazenar os mapeamentos persistentes entre as partições de disco e as letras das unidades. Ela também pode ser usada em arquivos BOOT.INI do Windows NT (embora a maioria não o faça), para descrever a localização de partições inicializáveis do Windows NT (ou posterior).[28] Uma chave (entre muitas), onde as assinaturas de disco do NT aparecem no registro do Windows 2000/XP, é:
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\
Se a assinatura de um disco armazenada no MBR fosse A8 E1 B9 D2 (nessa ordem) e sua primeira partição correspondesse à unidade lógica C: sob o Windows, os dados em REG_BINARY sob o valor da chave \DosDevices\C: seriam:
A8 E1 B9 D2 00 7E 00 00 00 00 00 00
Os quatro primeiros bytes são a referida assinatura do disco. (Em outras chaves, esses bytes podem aparecer na ordem inversa da encontrada no setor do MBR). Eles são seguidos por mais oito bytes, formando um inteiro de 64 bits em notação little-endian, que são usados para localizar o deslocamento em bytes desta partição. Neste caso, 00 7E corresponde ao valor hexadecimal 0x7E00 (32.256). Sob a suposição de que a unidade em questão reporte um tamanho de setor de 512 bytes, a divisão desse deslocamento em bytes por 512 resulta em 63, que é o número do setor físico (ou LBA) que contém o primeiro setor da partição (ao contrário da contagem de setores usada no valor de setores das tuplas CHS, que começa a contar a partir de um, o valor do setor absoluto ou LBA começa a contar a partir de zero).
Se este disco tivesse outra partição com os valores 00 F8 93 71 02 após a assinatura do disco (sob, por exemplo, o valor da chave \DosDevices\D:), ela começaria no deslocamento em bytes 0x00027193F800 (10.495.457.280), que também é o primeiro byte do setor físico 20.498.940.
A partir do Windows Vista, a assinatura do disco também é armazenada no repositório de Dados de Configuração da Inicialização (BCD), e o processo de boot depende dela.[29] Se a assinatura do disco mudar, não puder ser encontrada ou apresentar um conflito, o Windows ficará impossibilitado de inicializar.[30] A menos que o Windows seja forçado a usar a parte sobreposta do endereço LBA da entrada da Partição Ativa Avançada como uma pseudo-assinatura de disco, o uso do Windows entra em conflito com o recurso de Partição Ativa Avançada do PTS-DOS 7 e do DR-DOS 7.07, em particular se o código de inicialização deles estiver localizado fora dos primeiros 8 GB do disco, fazendo com que o endereçamento LBA precise ser obrigatoriamente utilizado.
Considerações de programação
[editar | editar código]O MBR originou-se no PC XT.[31] Computadores compatíveis com IBM PC são little-endian, o que significa que o processador armazena valores numéricos que abrangem dois ou mais bytes na memória começando pelo byte menos significativo. O formato do MBR na mídia reflete essa convenção. Assim, a assinatura do MBR aparecerá em um editor de disco como a sequência 55 AA.[a]
A sequência de inicialização no BIOS carregará o primeiro MBR válido que encontrar na memória física do computador no endereço 0x7C00 a 0x7DFF.[31] A última instrução executada no código do BIOS será um "desvio" (jump) para esse endereço, a fim de direcionar a execução para o início da cópia do MBR. A validação primária para a maioria dos BIOSs é a assinatura no deslocamento 0x01FE, embora o desenvolvedor do BIOS possa optar por incluir outras verificações, como verificar se o MBR contém uma tabela de partições válida sem entradas que apontem para setores além da capacidade informada do disco.
Para o BIOS, discos removíveis (ex: disquetes) e fixos são essencialmente a mesma coisa. Para qualquer um deles, o BIOS lê o primeiro setor físico da mídia para a RAM no endereço absoluto 0x7C00, verifica a assinatura nos dois últimos bytes do setor carregado e, se a assinatura correta for encontrada, transfere o controle para o primeiro byte do setor com uma instrução de desvio (JMP). A única distinção real que o BIOS faz é que (por padrão, ou se a ordem de boot não for configurável) ele tenta inicializar a partir do primeiro disco removível antes de tentar inicializar a partir do primeiro disco fixo. Sob a perspectiva do BIOS, a ação do MBR ao carregar um registro de inicialização de volume na RAM é exatamente idêntica à ação do registro de inicialização de volume de um disquete ao carregar o código objeto de um carregador de sistema operacional na RAM. Em ambos os casos, o programa que o BIOS carregou está realizando o trabalho de carregamento em cadeia de um sistema operacional.
Embora o código do setor de inicialização do MBR espere ser carregado no endereço físico 0x0000:0x7C00,[i] toda a memória desde o endereço físico 0x0000:0x0501 (o endereço 0x0000:0x0500 é o último usado por um BIOS Phoenix)[13] até 0x0000:0x7FFF,[31] expandida posteriormente para 0x0000:0xFFFF[32] (e às vezes[j] até 0x9000:0xFFFF) — o final dos primeiros 640 KB — está disponível em modo real.[k] A chamada de interrupção do BIOS INT 12h pode ajudar a determinar quanta memória pode ser alocada com segurança (por padrão, ela simplesmente lê o tamanho da memória base em KB a partir da localização segmento:deslocamento 0x0040:0x0013, mas pode ser interceptada por outros softwares residentes de pré-inicialização, como sobreposições de BIOS, códigos RPL ou vírus, para reduzir a quantidade relatada de memória disponível, evitando que outros softwares de etapas de boot seguintes, como setores de inicialização, os sobrescrevam).
Os últimos 66 bytes do MBR de 512 bytes são reservados para a tabela de partições e outras informações, de modo que o programa do setor de inicialização do MBR deve ser pequeno o suficiente para caber em 446 bytes de memória ou menos.
O código do MBR examina a tabela de partições, seleciona uma partição adequada e carrega o programa que executará a próxima etapa do processo de boot, geralmente fazendo uso de chamadas de interrupção do BIOS INT 13h. O código de inicialização do MBR carrega e executa o código de um registro de inicialização do volume (dependente do carregador de inicialização ou do sistema operacional) localizado no início da partição "ativa". O registro de inicialização do volume caberá dentro de um setor de 512 bytes, mas é seguro para o código do MBR carregar setores adicionais para acomodar carregadores de inicialização mais longos que um setor, desde que eles não façam suposições sobre o tamanho do setor. Na verdade, pelo menos 1 KB de RAM está disponível no endereço 0x7C00 em todas as máquinas das classes IBM XT e AT, de modo que um setor de 1 KB poderia ser usado sem problemas. Assim como o MBR, um registro de inicialização de volume normalmente espera ser carregado no endereço 0x0000:0x7C00. Isso decorre do fato de que o design do registro de inicialização do volume originou-se em mídias não particionadas, onde ele seria diretamente carregado pelo procedimento de boot do BIOS; como mencionado acima, o BIOS trata MBRs e registros de inicialização de volume (VBRs)[l] exatamente da mesma forma. Como essa é a mesma localização onde o MBR é carregado, uma das primeiras tarefas de um MBR é realocar a si mesmo para outro lugar na memória. O endereço de realocação é determinado pelo MBR, mas na maioria das vezes é 0x0000:0x0600 (para códigos de MBR do MS-DOS/PC DOS, OS/2 e Windows) ou 0x0060:0x0000 (maioria dos MBRs do DR-DOS). (Ainda que ambos os endereços segmentados apontem para o mesmo endereço de memória física em modo real, para que o Apple Darwin inicialize, o MBR deve ser realocado para 0x0000:0x0600 em vez de 0x0060:0x0000, pois o código depende do ponteiro DS:SI para a entrada de partição fornecida pelo MBR, mas erroneamente refere-se a ele apenas via 0x0000:SI.[33]) É importante não fazer a realocação para outros endereços na memória porque muitos VBRs assumirão um certo layout de memória padrão ao carregar seu arquivo de boot.
O campo Status em um registro de tabela de partições é usado para indicar uma partição ativa. MBRs em conformidade com os padrões permitirão apenas uma partição marcada como ativa e usarão isso como parte de uma verificação de integridade para determinar a existência de uma tabela de partições válida. Eles exibirão uma mensagem de erro se mais de uma partição tiver sido marcada como ativa. Alguns MBRs não padronizados não tratarão isso como uma condição de erro e apenas usarão a primeira partição marcada na linha.
Tradicionalmente, valores diferentes de 0x00 (não ativa) e 0x80 (ativa) eram inválidos e o programa de inicialização exibia uma mensagem de erro ao encontrá-los. No entanto, a Plug and Play BIOS Specification e a BIOS Boot Specification (BBS) permitiram que outros dispositivos também se tornassem inicializáveis a partir de 1994.[32][34] Consequentemente, com a introdução do MS-DOS 7.10 (Windows 95B) e superiores, o MBR começou a tratar o bit 7 definido como uma flag de ativação e exibia uma mensagem de erro apenas para os valores 0x01..0x7F. Ele continuou a tratar a entrada como a unidade de disco física a ser usada ao carregar o VBR da partição correspondente mais tarde, aceitando assim outras unidades de boot além de 0x80 como válidas; contudo, o MS-DOS não fazia uso dessa extensão por si só. O armazenamento do número real da unidade física na tabela de partições normalmente não causa problemas de compatibilidade retroativa, já que o valor diferirá de 0x80 apenas em unidades que não sejam a primeira (as quais, de qualquer forma, não eram inicializáveis anteriormente). No entanto, mesmo em sistemas habilitados para dar boot a partir de outras unidades, a extensão pode ainda não funcionar universalmente, por exemplo, após a atribuição de unidades físicas pelo BIOS mudar quando unidades são removidas, adicionadas ou trocadas. Portanto, de acordo com a BIOS Boot Specification (BBS),[32] a melhor prática para um MBR moderno que aceita o bit 7 como flag de ativação é repassar o valor DL originalmente fornecido pelo BIOS em vez de usar a entrada da tabela de partições.
Interface BIOS para MBR
[editar | editar código]O MBR é carregado na localização de memória 0x0000:0x7C00 e com os seguintes registradores da CPU configurados quando o carregador de inicialização anterior (normalmente o IPL no BIOS) passa a execução para ele, desviando para 0x0000:0x7C00 no modo real da CPU.
- Algumas BIOS da Compaq erroneamente usam 0x07C0:0x0000. Embora isso aponte para a mesma localização na memória em modo real, não é o padrão e deve ser evitado, pois o código do MBR que assume certos valores de registradores ou que não foi escrito para ser realocável pode não funcionar.
- DL = unidade do disco de inicialização (os discos fixos / unidades removíveis: 0x80 = primeiro, 0x81 = segundo, ..., 0xFE; disquetes / superdisquetes: 0x00 = primeiro, 0x01 = segundo, ..., 0x7E; os valores 0x7F e 0xFF são reservados para ROM / unidades remotas e não devem ser usados em disco).[35][36]
- O registrador DL é suportado pelas BIOS da IBM, bem como pela maioria das outras BIOS. O BIOS do Toshiba T1000 é conhecida por não suportar isso corretamente, e algumas BIOS antigas do Wyse 286 usam valores de DL maiores ou iguais a 2 para discos fixos (refletindo assim os números das unidades lógicas no DOS, em vez dos números das unidades físicas do BIOS). Pen drives USB configurados como unidades removíveis normalmente recebem uma atribuição de DL = 0x80, 0x81, etc. No entanto, algumas BIOS raras erroneamente os apresentavam sob o DL = 0x01, exatamente como se estivessem configurados como superfloppies.
- Um BIOS em conformidade com o padrão atribui números maiores ou iguais a 0x80 exclusivamente a discos fixos / unidades removíveis e, tradicionalmente, apenas os valores 0x80 e 0x00 eram passados como unidades físicas durante a inicialização. Por convenção, apenas discos fixos / unidades removíveis são particionados, portanto, o único valor de DL que um MBR poderia ver tradicionalmente era 0x80. De qualquer forma, muitos MBRs foram escritos para ignorar o valor de DL e trabalhar com um valor fixo no código (normalmente 0x80).
- A Plug and Play BIOS Specification e a BIOS Boot Specification (BBS) permitem que outros dispositivos também se tornem inicializáveis desde 1994.[32][34] Esta última recomenda que o código do MBR e do VBR utilize o registrador DL em vez de valores padrões fixados internamente.[32] Isso também garantirá a compatibilidade com várias atribuições não padronizadas (veja os exemplos acima), no que diz respeito ao código do MBR.
- CD-ROMs inicializáveis que seguem a especificação El Torito podem conter imagens de disco montadas pelo BIOS para aparecerem como disquetes ou superfloppies nesta interface. Os valores de DL 0x00 e 0x01 também podem ser usados pelas extensões de BIOS Protected Area Run Time Interface Extension Services (PARTIES) e Trusted Computing Group (TCG) no modo Confiável (Trusted) para acessar partições PARTIES que, de outra forma, seriam invisíveis, ou arquivos de imagem de disco localizados por meio do Boot Engineering Extension Record (BEER) no último setor físico da Host Protected Area (HPA) de um disco rígido. Embora projetado para emular disquetes ou superfloppies, o código do MBR que aceita esses valores não padronizados de DL permite o uso de imagens de mídias particionadas, pelo menos na etapa de inicialização dos sistemas operacionais.
- DH bit 5 = 0: dispositivo suportado via INT 13h; caso contrário: não importa (deve ser zero). O registrador DH é suportado por algumas BIOS da IBM.
- Alguns dos outros registradores também podem conter tipicamente certos valores (DS, ES, SS = 0x0000; SP = 0x0400) com as BIOS ROM originais da IBM, mas isso não é algo com que se possa contar, pois outras BIOS podem usar outros valores. Por esse motivo, os códigos de MBR da IBM, Microsoft, Digital Research, etc., nunca tiraram vantagem disso. Depender desses valores de registradores nos setores de inicialização também pode causar problemas em cenários de inicialização em cadeia.
Sistemas com suporte a BIOS Plug-and-Play ou BBS fornecerão um ponteiro para os dados PnP além do DL:[32][34]
- DL = unidade do disco de inicialização (veja acima)
- ES:DI = aponta para a estrutura de verificação de instalação "
$PnP"
- Essa informação permite que o carregador de inicialização no MBR (ou no VBR, se repassado) interaja ativamente com o BIOS ou com uma sobreposição de BIOS PnP / BBS residente na memória para configurar a ordem de boot, etc. No entanto, essa informação é ignorada pela maioria dos MBRs e VBRs padrão. O ideal é que ES:DI seja passado para o VBR para uso posterior pelo sistema operacional carregado, mas os sistemas operacionais habilitados para PnP geralmente também possuem métodos de contingência para recuperar o ponto de entrada do BIOS PnP mais tarde, de modo que a maioria dos sistemas operacionais não depende disso.
Interface MBR para VBR
[editar | editar código]Por convenção, um MBR em conformidade com o padrão passa a execução para um VBR carregado com sucesso na localização de memória 0x0000:0x7C00, desviando para 0x0000:0x7C00 no modo real da CPU com os seguintes registradores mantidos ou configurados especificamente:
- CS:IP = 0x0000:0x7C00[m] (constante)
- DL = unidade do disco de inicialização (veja acima)
- Os MBRs do MS-DOS 2.0–7.0 / PC DOS 2.0–6.3 não repassam o valor de DL recebido na entrada; em vez disso, usam a entrada de status de boot na entrada da tabela de partições da partição primária selecionada como a unidade física de boot. Como isso é, por convenção, 0x80 na maioria das tabelas de partições MBR, nada muda, a menos que o BIOS tenha tentado inicializar a partir de um dispositivo físico que não fosse o primeiro disco fixo / unidade removível da fila. Essa também é a razão pela qual esses sistemas operacionais não conseguem inicializar a partir de um segundo disco rígido, etc. Algumas ferramentas do FDISK permitem marcar partições em discos secundários como "ativas" também. Nessa situação, sabendo que esses sistemas operacionais não podem inicializar a partir de outras unidades de qualquer maneira, algumas ferramentas continuam a usar o valor tradicionalmente fixo de 0x80 como marcador de ativação, enquanto outras usam valores correspondentes à unidade física atualmente atribuída (0x81, 0x82), permitindo assim a inicialização a partir de outras unidades, pelo menos em teoria. De fato, isso funcionará com muitos códigos de MBR que aceitam o bit 7 definido da entrada de status de boot como uma flag de ativação, em vez de insistirem em 0x80. Contudo, os MBRs do MS-DOS/PC DOS são programados rigidamente para aceitar apenas o valor fixo de 0x80. O armazenamento do número real da unidade física na tabela de partições também causará problemas quando a atribuição das unidades físicas pelo BIOS mudar, como quando as unidades são removidas, adicionadas ou trocadas. Portanto, para um MBR normal, aceitar o bit 7 como flag de ativação e, no restante, apenas usar e passar para o VBR o valor de DL originalmente fornecido pelo BIOS permite a máxima flexibilidade. Os MBRs do MS-DOS 7.1–8.0 mudaram para tratar o bit 7 como flag de ativação e quaisquer valores 0x01..0x7F como inválidos, mas eles ainda obtêm a unidade física a partir da tabela de partições em vez de usarem o valor de DL fornecido pelo BIOS. Os MBRs estendidos do DR-DOS 7.07 tratam o bit 7 como flag de ativação e usam e passam o valor de DL do BIOS por padrão (incluindo valores não padronizados 0x00..0x01 usados por algumas BIOS também para mídias particionadas), mas eles também fornecem um bloco de configuração especial do NEWLDR para suportar métodos de boot alternativos em conjunto com o LOADER e o REAL/32, bem como para alterar o comportamento detalhado do MBR, de modo que ele também possa funcionar com valores de unidade recuperados da tabela de partições (importante em conjunto com o LOADER e AAPs, veja o deslocamento do NEWLDR
0x000C), traduzir unidades não padronizadas da Wyse 0x02..0x7F para 0x80..0xFD e, opcionalmente, corrigir o valor da unidade (armazenado no deslocamento0x019no Bloco de Parâmetros de BIOS Estendido (EBPB) ou no deslocamento de setor0x01FD) em VBRs carregados antes de passar a execução para eles (veja o deslocamento do NEWLDR0x0014) — isso também permite que outros carregadores de inicialização usem o NEWLDR como um carregador em cadeia, configurem sua imagem em memória dinamicamente e criem um "túnel" para o carregamento de VBRs, EBRs ou AAPs através do NEWLDR.
- O conteúdo de DH e ES:DI deve ser preservado pelo MBR para suporte total ao Plug-and-Play (veja acima), no entanto, muitos MBRs, incluindo os do MS-DOS 2.0–8.0 / PC DOS 2.0–6.3 e Windows NT/2000/XP, não o fazem. (Isso não é uma surpresa, já que essas versões do DOS são anteriores ao padrão de BIOS Plug-and-Play, e os padrões e convenções anteriores não indicavam requisitos para preservar qualquer outro registrador além do DL). Alguns MBRs definem DH como 0.
O código do MBR passa informações adicionais para o VBR em muitas implementações:
- DS:SI = aponta para a entrada de 16 bytes da tabela de partições do MBR (no MBR realocado) correspondente ao VBR ativado. O PC-MOS 5.1 depende disso para inicializar se nenhuma partição na tabela estiver marcada como inicializável. Em conjunto com o LOADER, os setores de inicialização do Multiuser DOS e do REAL/32 usam isso para localizar o setor de inicialização da partição ativa (or outro carregador de inicialização como o IBMBIO.LDR em uma posição fixa no disco) se o arquivo de boot (LOADER.SYS) não pôde ser encontrado. O PTS-DOS 6.6 e o S/DOS 1.0 usam isso em conjunto com o recurso de Partição Ativa Avançada (AAP). Além do suporte para o LOADER e AAPs, o DR-DOS 7.07 pode usar isso para determinar o método de acesso INT 13h necessário ao utilizar seu código VBR duplo CHS/LBA e atualizará o campo da unidade de boot / flag de status na entrada da partição de acordo com o valor de DL efetivamente usado. Os carregadores de inicialização do Darwin (o
boot1h,boot1uda Apple e oboot1fat32de David Elliott) também dependem desse ponteiro, mas, adicionalmente, eles não usam o DS, assumindo que ele esteja definido como 0x0000 em seu lugar.[33] Isso causará problemas se essa suposição estiver incorreta. O código de MBR do OS/2, MS-DOS 2.0 a 8.0, PC DOS 2.0 a 7.10 e Windows NT/2000/XP também fornece essa mesma interface, embora esses sistemas não a utilizem. Os MBRs do Windows Vista/7 não fornecem mais esse ponteiro DS:SI. Enquanto algumas extensões dependem apenas da própria entrada da tabela de partições de 16 bytes, outras extensões podem exigir que toda a tabela de partições de 4 (ou 5 entradas) também esteja presente. - DS:BP = opcionalmente aponta para a entrada de 16 bytes da tabela de partições do MBR (no MBR realocado) correspondente ao VBR ativado. Isso é idêntico ao ponteiro fornecido por DS:SI (veja acima) e é fornecido pelos MBRs do MS-DOS 2.0–8.0, PC DOS 2.0–7.10 e Windows NT/2000/XP/Vista/7. No entanto, não é suportado pela maioria dos MBRs de terceiros.
No DR-DOS 7.07, uma interface estendida pode ser fornecida opcionalmente pelo MBR estendido e em conjunto com o LOADER:
- AX = assinatura mágica indicando a presença desta extensão do NEWLDR (0x0EDC)
- DL = unidade do disco de inicialização (veja acima)
- DS:SI = aponta para a entrada da tabela de partições do MBR de 16 bytes utilizada (veja acima)
- ES:BX = início do setor de inicialização ou da imagem do setor do NEWLDR (tipicamente 0x7C00)
- CX = reservado
Em conjunto com a GPT, uma proposta da Enhanced Disk Drive Specification (EDD) 4 para MBR híbrido recomenda outra extensão para a interface:[37]
- EAX = 0x54504721 ("
!GPT") - DL = unidade do disco de inicialização (veja acima)
- DS:SI = aponta para uma estrutura de transferência do MBR Híbrido, que consiste em uma entrada fictícia de 16 bytes da tabela de partições do MBR (com todos os bits definidos, exceto pela flag de boot no deslocamento 0x00 e o tipo de partição no deslocamento 0x04) seguida por dados adicionais. Isso é parcialmente compatível com a extensão DS:SI mais antiga discutida acima, caso apenas a entrada de partição de 16 bytes, e não a tabela de partições inteira, seja exigida por essas extensões mais antigas.
- Como os sistemas operacionais mais antigos (incluindo seus VBRs) não suportam essa extensão nem são capazes de endereçar setores além do limite de 2 TiB, um carregador de inicialização híbrido compatível com GPT ainda deve emular a entrada fictícia de tabela de partições MBR de 16 bytes se a partição de boot estiver localizada dentro dos primeiros 2 TiB.[n]
- ES:DI = aponta para a estrutura de verificação de instalação "
$PnP" (veja acima)
Editando e substituindo conteúdos
[editar | editar código]Embora seja possível manipular os bytes no setor do MBR diretamente usando vários editores de disco, existem ferramentas para gravar conjuntos fixos de códigos funcionais no MBR. Desde o MS-DOS 5.0, o programa FDISK inclui o parâmetro /MBR, que reescreve o código do MBR.[38] No Windows 2000 e Windows XP, o Console de Recuperação pode ser usado para gravar um novo código de MBR em um dispositivo de armazenamento por meio do comando fixmbr. No Windows Vista e Windows 7, o Ambiente de Recuperação pode ser usado para gravar um novo código de MBR usando o comando BOOTREC /FIXMBR.
Alguns utilitários de terceiros também podem ser usados para editar diretamente o conteúdo das tabelas de partições (sem exigir qualquer conhecimento de hexadecimal ou editores de disco/setores), como o MBRWizard.[o]
O dd é um comando POSIX comumente usado para ler ou gravar em qualquer posição de um dispositivo de armazenamento, incluindo o MBR. No Linux, o ms-sys pode ser usado para instalar um MBR do Windows. Os projetos GRUB e LILO possuem ferramentas para gravar código no setor do MBR, especificamente o grub-install e o lilo -mbr. O console interativo do GRUB Legacy pode gravar no MBR usando os comandos setup e embed, mas o GRUB2 atualmente exige que o grub-install seja executado de dentro de um sistema operacional.
Vários programas são capazes de criar uma "cópia de segurança (backup)" tanto da tabela de partições primárias quanto das partições lógicas na partição estendida.
O comando sfdisk do Linux (em um SystemRescueCD) é capaz de salvar um backup da tabela de partições primárias e estendidas. Ele cria um arquivo que pode ser lido em um editor de texto, ou esse arquivo pode ser usado pelo sfdisk para restaurar a tabela de partições primárias/estendidas. Um exemplo de comando para fazer o backup da tabela de partições é sfdisk -d /dev/hda > hda.out e para restaurar é sfdisk /dev/hda < hda.out. É possível copiar a tabela de partições de um disco para outro dessa forma, o que é útil para configurar espelhamento (mirroring), mas o sfdisk executa o comando sem exibir confirmações/avisos usando sfdisk -d /dev/sda | sfdisk /dev/sdb.[39]
Ver também
[editar | editar código]- Alinhamento de partição
- Amiga rigid disk block (RDB)
- Apple partition map (APM)
- Área protegida do host (HPA)
- Boot engineering extension record (BEER)
- BSD disklabel
- Carregador de inicialização
- Clonagem de disco
- Device configuration overlay (DCO)
- Disco de recuperação
- GNU Parted
- Partição de boot do BIOS
- Partição de sistema EFI
- Registro de inicialização estendido (EBR)
- Registro de inicialização do volume (VBR)
- Tabela de Partição GUID (GPT)
- Volume Table of Contents (VTOC)
Notas
[editar | editar código]- 1 2 3 4 5 6 7 A assinatura no deslocamento 0x01FE em setores de inicialização é
55hex AAhex, isto é, 0x55 no deslocamento 0x01FE eAAhexno deslocamento 0x01FF. Como a representação little-endian deve ser assumida no contexto de máquinas compatíveis com IBM PC, isso pode ser escrito como a palavra de 16 bitsAA55hexem programas para processadores x86 (note a ordem invertida), ao passo que teria que ser escrita como55AAhexem programas para outras arquiteturas de CPU que utilizam uma representação big-endian. Como isso foi confundido inúmeras vezes em livros e até mesmo em documentos de referência originais da Microsoft, este artigo utiliza a representação em disco byte a byte baseada em deslocamento para evitar qualquer possível interpretação incorreta. - ↑ Para garantir a integridade do código do carregador de inicialização do MBR, é importante que os bytes de 0x00DA a 0x00DF nunca sejam alterados, a menos que todos os seis bytes representem um valor igual a 0 ou que todo o código do carregador de inicialização do MBR (exceto pela tabela de partições (estendida)) seja substituído ao mesmo tempo. Isso inclui redefinir esses valores para
00 00 00 00 00 00hex, a menos que o código armazenado no MBR seja conhecido. O Windows adere a essa regra. - ↑ Originalmente, valores de status diferentes de 0x00 e 0x80 eram inválidos, mas os MBRs modernos tratam o bit 7 como uma flag de ativação e usam essa entrada para armazenar a unidade física de boot.
- 1 2 Os campos de setor inicial são limitados a 1023+1 cilindros, 255+1 cabeças e 63 setores; os campos de setor final possuem as mesmas limitações.
- 1 2 3 4 5 O intervalo para o setor é de 1 a 63; o intervalo para o cilindro é de 0 a 1023; o intervalo para a cabeça é de 0 a 255 inclusive.[13]
- ↑ Esta entrada é usada por sistemas operacionais em certas circunstâncias; nesses casos, os endereços CHS são ignorados.[15]
- ↑ O valor zero é reservado e não deve ser usado em entradas de partição normais. Esta entrada é usada por sistemas operacionais em certas circunstâncias; nesses casos, os endereços CHS são ignorados.[15]
- ↑ "Citação: [A maioria das] versões do MS-DOS (incluindo o MS-DOS 7 [Windows 95]) possui um bug que impede a inicialização em discos rígidos com 256 cabeças (FFh), por isso muitas BIOSes modernas fornecem mapeamentos com no máximo 255 (FEh) cabeças." RBIL[40][41]
- ↑ O endereço
0000hex:7C00hexé o primeiro byte do 32º KB de RAM. O carregamento do programa de boot nesse endereço historicamente foi a razão pela qual, embora o tamanho mínimo de RAM de um IBM PC original (modelo 5150) fosse de 16 KB, 32 KB eram necessários para a opção de disco no IBM XT. - ↑ Se houver uma EBDA (Extended BIOS Data Area), a memória disponível termina logo abaixo dela.
- ↑ Máquinas muito antigas podem ter menos de 640 KB (
A0000hexou 655.360 bytes) de memória. Em teoria, apenas 32 KB (até0000hex:7FFFhex) ou 64 KB (até0000hex:FFFFhex) têm garantia de existência; esse seria o caso em uma máquina da classe IBM XT equipada apenas com a quantidade mínima necessária de memória para um sistema de disco. - ↑ Isso se aplica quando o BIOS manipula um VBR, o que ocorre quando ele está no primeiro setor físico de uma mídia não particionada. Caso contrário, o BIOS não tem relação com o VBR. O design dos VBRs é como é porque os VBRs se originaram unicamente em mídias de disquete não particionadas — o IBM PC modelo 5150 originalmente não tinha opção de disco rígido — e o sistema de particionamento usando um MBR foi desenvolvido posteriormente como uma adaptação para colocar mais de um volume, cada um começando com seu próprio VBR já previamente definido, em um único disco fixo. Por esse design, essencialmente o MBR emula a rotina de boot do BIOS, fazendo as mesmas coisas que o BIOS faria para processar esse VBR e configurar o ambiente operacional inicial para ele, exatamente como se o BIOS tivesse encontrado aquele VBR em uma mídia não particionada.
- ↑ O registrador IP é definido como resultado do desvio (jump). O CS pode ser definido como 0 tanto executando um desvio longo (far jump) quanto carregando o valor do registrador explicitamente antes de executar um desvio curto (near jump). (É impossível para o código x86 que recebeu o desvio detectar se um near ou far jump foi usado para alcançá-lo [a menos que o código que realizou o desvio passe essa informação separadamente de alguma forma]).
- ↑ Isso não faz parte da proposta mencionada acima, mas é uma consequência natural de condições pré-existentes.
- ↑ Por exemplo, o PowerQuest's Partition Table Editor (PTEDIT32.EXE), que roda sob sistemas operacionais Windows, ainda está disponível aqui: site FTP da Symantec[ligação inativa].
Referências
[editar | editar código]- 1 2 3 4 «Windows support for hard disks that are larger than 2 TB». 1. Microsoft. 26 de junho de 2013. 2581408. Consultado em 28 de agosto de 2013. Cópia arquivada em 27 de abril de 2017
- 1 2 3 Sedory, Daniel B. (2004). «The Mystery Bytes (or the Drive/Timestamp Bytes) of the MS-Windows 95B, 98, 98SE and Me Master Boot Record (MBR)». Master Boot Records. thestarman.pcministry.com. Consultado em 25 de agosto de 2012. Cópia arquivada em 24 de agosto de 2017
- ↑ Lucas, Michael (2003). Absolute OpenBSD: Unix for the practical paranoid. [S.l.]: No Starch Press. p. 73. ISBN 9781886411999. Consultado em 9 de abril de 2011.
Cada sistema operacional inclui ferramentas para gerenciar partições MBR. Infelizmente, cada sistema operacional lida com partições MBR de uma maneira ligeiramente diferente.
- ↑ Norton, Peter; Clark, Scott (2002). Peter Norton's New Inside the PC. [S.l.]: Sams Publishing. pp. 360–361. ISBN 0-672-32289-7
- ↑ Graves, Michael W. (2004). A+ Guide To PC Hardware Maintenance and Repair. [S.l.]: Thomson Delmar. p. 276. ISBN 1-4018-5230-0
- ↑ Andrews, Jean (2003). Upgrade and Repair with Jean Andrews. [S.l.]: Thomson Course Technology. p. 646. ISBN 1-59200-112-2
- ↑ Boswell, William (2003). Inside Windows Server 2003. [S.l.]: Addison-Wesley Professional. p. 13. ISBN 0-7357-1158-5
- ↑ Smith, Roderick W. (2000). The Multi-Boot Configuration Handbook. [S.l.]: Que Publishing. pp. 260–261. ISBN 0-7897-2283-6
- ↑ Brouwer, Andries Evert (22 de abril de 2004). «Properties of partition tables». Partition types. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017.
Matthias [R.] Paul escreve: "[...] PTS-DOS [usa] uma quinta entrada de partição especial na frente das outras quatro entradas no MBR e o código de bootstrap correspondente do MBR compatível com AAP. [...]"
- ↑ Brouwer, Andries Evert (22 de abril de 2004). «Properties of partition tables». Partition types. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017.
Alguns sistemas OEM, como o AST DOS (tipo
(N.B. As tabelas de partições do NEC MS-DOS 3.30 e AST MS-DOS com oito entradas são precedidas por uma assinatura14hex) e o NEC DOS (tipo24hex) tinham 8 em vez de 4 entradas de partição em seus setores de MBR. (Matthias R. Paul).A55Ahexno deslocamento 0x017C.) - ↑ Sedory, Daniel B. (18 de maio de 2007). «Notes on the Differences in one OEM version of the DOS 3.30 MBR». Master Boot Records. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017.
Quando adicionamos partições a esta tabela da NEC, a primeira foi colocada nos deslocamentos 0x01EE até 0x01FD e a próxima entrada foi adicionada logo acima dela. Portanto, as entradas são inseridas e listadas de trás para frente em relação a uma tabela normal. Assim, ao olhar para tal tabela com um editor de disco ou utilitário de listagem de partições, ela mostraria a primeira entrada em uma tabela de oito entradas da NEC como sendo a última (quarta entrada) em uma tabela de partições normal.
(N.B. Mostra uma tabela de partições de 8 entradas e onde seu código de boot difere do MS-DOS 3.30.) - ↑ «Partition Table». osdev.org. 18 de março de 2017. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017
- 1 2 3 System BIOS for IBM PC/XT/AT Computers and Compatibles. Col: Referência técnica da Phoenix. [S.l.]: Addison-Wesley. 1989. ISBN 0-201-51806-6
- ↑ Brouwer, Andries Evert (2013). «List of partition identifiers for PCs». Partition types. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017
- 1 2 Wood, Sybil (2002). Microsoft Windows 2000 Server Operations Guide. [S.l.]: Microsoft Press. p. 18. ISBN 978-0-73561796-4
- ↑ «An Introduction to Hard Disk Geometry». Tech Juice. 6 de dezembro de 2012. Cópia arquivada em 4 de fevereiro de 2013
- ↑ Kozierok, Charles M. (17 de abril de 2001). «BIOS and the Hard Disk». The PC Guide. Consultado em 19 de abril de 2013. Cópia arquivada em 17 de junho de 2017
- ↑ Smith, Robert (26 de junho de 2011). «Working Around MBR's Limitations». GPT fdisk Tutorial. Consultado em 20 de abril de 2013. Cópia arquivada em 24 de agosto de 2017
- ↑ «More than 2 TiB on a MBR disk». superuser.com. 7 de março de 2013. Consultado em 22 de outubro de 2013. Cópia arquivada em 24 de agosto de 2017
- ↑ «Transition to Advanced Format 4K Sector Hard Drives». Tech Insight. Seagate Technology. 2012. Consultado em 19 de abril de 2013. Cópia arquivada em 24 de agosto de 2017
- ↑ Calvert, Kelvin (16 de março de 2011). «WD AV-GP Large Capacity Hard Drives» (PDF). Western Digital. Consultado em 20 de abril de 2013
- ↑ Smith, Roderick W. (27 de abril de 2010). «Linux on 4KB-sector disks: Practical advice». DeveloperWorks. IBM. Consultado em 19 de abril de 2013. Cópia arquivada em 24 de agosto de 2017
- 1 2 «MBR (x86)». OSDev Wiki. OSDev.org. 5 de março de 2012. Consultado em 20 de abril de 2013. Cópia arquivada em 24 de agosto de 2017
- ↑ Sedory, Daniel B. (30 de julho de 2003). «IBM DOS 2.00 Master Boot Record». The Starman's Realm. Consultado em 22 de julho de 2011. Cópia arquivada em 24 de agosto de 2017
- ↑ Singh, Amit (25 de dezembro de 2009). «Booting Mac OS X». Mac OS X Internals: The Book. Consultado em 22 de julho de 2011
- ↑ de Boyne Pollard, Jonathan (10 de julho de 2011). «The EFI boot process». Frequently Given Answers. Consultado em 22 de julho de 2011. Cópia arquivada em 24 de agosto de 2017
- ↑ Domsch, Matt (22 de março de 2005). «Re: RFC 2.6.0 EDD enhancements». Linux Kernel Mailing List. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017
- ↑ «Windows may use Signature() syntax in the BOOT.INI file». KnowledgeBase. Microsoft
- ↑ McTavish (Fevereiro de 2014). «Vista's MBR Disk Signature». Multibooters: Dual and Multibooting with Vista. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017
- ↑ Russinovich, Mark (8 de novembro de 2011). «Fixing Disk Signature Collisions». Mark Russinovich's Blog. Microsoft. Consultado em 19 de abril de 2013. Cópia arquivada em 24 de agosto de 2017
- 1 2 3 Sakamoto, Masahiko (13 de maio de 2010). «Why BIOS loads MBR into
0x7C00in x86?». Glamenv-Septzen.net. Consultado em 4 de maio de 2011. Cópia arquivada em 24 de agosto de 2017 - 1 2 3 4 5 6 Compaq Computer Corporation; Phoenix Technologies Ltd.; Intel Corporation (11 de janeiro de 1996). «BIOS Boot Specification 1.01» (PDF). 1.01. ACPICA. Consultado em 20 de abril de 2013. Cópia arquivada (PDF) em 24 de agosto de 2017
- 1 2 Elliott, David F. (12 de outubro de 2009). «Why does the "standard" MBR set SI?». tgwbd.org. Consultado em 20 de abril de 2013. Cópia arquivada em 24 de agosto de 2017
- 1 2 3 Compaq Computer Corporation; Phoenix Technologies Ltd.; Intel Corporation (5 de maio de 1994). «Plug and Play BIOS Specification 1.0A» (PDF). 1.0A. Intel. Consultado em 20 de abril de 2013. Cópia arquivada (PDF) em 24 de agosto de 2017
- ↑ Paul, Matthias R. (2 de outubro de 1997). «Caldera OpenDOS 7.01/7.02 Update Alpha 3 IBMBIO.COM - README.TXT and BOOT.TXT - A short description of how OpenDOS is booted». Consultado em 29 de março de 2009. Cópia arquivada em 4 de outubro de 2003
- ↑ Paul, Matthias R. (14 de agosto de 2017). «The continuing saga of Windows 3.1 in enhanced mode on OmniBook 300». MoHPC - the Museum of HP Calculators. Consultado em 1 de maio de 2018. Cópia arquivada em 1 de maio de 2018.
[…] SYS […] /O[:nnn] Substitui a unidade de boot relatada pelo IPL (n=0..126, 128..254). […] Preparando o disco de destino... Escolhendo o Setor de Boot CHS FAT12 (requer que o IPL relate a unidade de boot). Tratando o destino como disquete ou mídia superfloppy (unidade de boot 0). Gravando o novo Setor de Boot... […]
(N.B. O comando SYS grava setores de inicialização de volume (VBR) em vez de master boot records, mas a interface de registradores de entrada deles é semelhante (com extensões), uma vez que ambos podiam ser carregados inicialmente pelo sistema subjacente.) - ↑ Elliott, Robert (4 de janeiro de 2010). «EDD-4 Hybrid MBR boot code annex» (PDF). Hewlett Packard, T13 Technical Committee. e09127r3. Consultado em 20 de abril de 2013. Cópia arquivada (PDF) em 24 de agosto de 2017
- ↑ «FDISK /MBR rewrites the Master Boot Record». Support. 1. Microsoft. 23 de setembro de 2011. 69013. Consultado em 19 de abril de 2013. Cópia arquivada em 8 de fevereiro de 2017
- ↑ «sfdisk(8) – Linux man page». die.net. 2013. Consultado em 20 de abril de 2013. Cópia arquivada em 24 de agosto de 2017
- Brown, Ralf D. (16 de julho de 2000). «Ralf Browns Interrupt List (v61 html)». Delorie Software. Consultado em 3 de novembro de 2016
- Brown, Ralf D. (16 de julho de 2000). «B-1302: INT 13 - DISK - READ SECTOR(S) INTO MEMORY». Ralf Brown's Interrupt List (RBIL) 61 ed. Consultado em 3 de novembro de 2016 (N.B. Veja o arquivo INTERRUP.B dentro do arquivo compactado "INTER61A.ZIP".)
Leitura adicional
[editar | editar código]- Gilbert, Howard (1 de janeiro de 1996). «Partitions and Volumes». PC Lube & Tune. Cópia arquivada em 3 de março de 2016
- Knights, Ray (22 de dezembro de 2004). «Ray's Place». MBR and Windows Boot Sectors (inclui desmontagem de código e explicações sobre o processo de boot). Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017
- Landis, Hale (6 de maio de 2002). «Master Boot Record». How It Works. Cópia arquivada em 1 de julho de 2014
- Sedory, Daniel B. (25 de junho de 2015). «MBRs (Master Boot Records)». Boot Records Revealed. Consultado em 24 de agosto de 2017. Cópia arquivada em 24 de agosto de 2017