MBR: Como o BIOS decide se uma unidade é inicializável ou não?

12

Enquanto tentava responder a essa pergunta no askubuntu: Como desinstalar o GRUB , li o artigo da Wikipedia sobre MBR e também a resposta perfeita para uma pergunta um pouco relacionada aqui no Superuser, no entanto, uma coisa ainda não está clara para mim:

O que exatamente faz o BIOS decidir se uma unidade é inicializável ou não? Como a sequência de inicialização pula da unidade 1 e continua tentando inicializar a partir da unidade 2 se mais de uma unidade estiver instalada no sistema?

Meu entendimento é que a única coisa que o BIOS normalmente verifica em um MBR é sua assinatura no final do setor de 512 bytes, e depois transfere o controle para o gerenciador de inicialização inicial situado nos primeiros 446 bytes do setor de inicialização.

Isso implica que os primeiros 446 bytes do setor de inicialização DEVEM conter algum código significativo do carregador de inicialização, mesmo que o disco não seja inicializável?

Depois que o BIOS transferiu o controle para o carregador de inicialização na unidade nº 1, que não possuía partições "inicializáveis" - como é invocado exatamente o carregador de inicialização na segunda unidade?

Desculpe se isso é muito técnico :) A pergunta curta é: "Como exatamente o BIOS pula uma unidade e prossegue para tentar inicializar a partir da próxima?"

Sergey
fonte

Respostas:

16

O que exatamente faz o BIOS decidir se uma unidade é inicializável ou não?

O BIOS decide se uma unidade é inicializável com base no registro da partição de 16 bytes, presente após a área de código do MBR (mantida em uma tabela iniciada no 446 th byte). O primeiro byte em cada registro de partição representa o status inicializável da unidade (e é definido como 0x80se inicializável, ou0x00 não). Alguns BIOS podem verificar outras partes do MBR (por exemplo, tipos de partições, somas de verificação), mas o requisito básico é o sinalizador de inicialização.

Como a sequência de inicialização pula da unidade 1 e continua tentando inicializar a partir da unidade 2 se mais de uma unidade estiver instalada no sistema?

Isso depende da implementação e é por isso que você precisa selecionar corretamente uma ordem de inicialização. Na maioria dos casos, o BIOS examinará cada meio de armazenamento na ordem que você definir e determinará se ele pode inicializar a partir desse dispositivo (através dos dados MBR). Se puder, ele faz - se não, continua repetindo os outros dispositivos (novamente, na ordem que você selecionou).

Depois que o BIOS transferiu o controle para o carregador de inicialização na unidade nº 1, que não possuía partições "inicializáveis" - como é invocado exatamente o carregador de inicialização na segunda unidade?

Depois que um dispositivo de inicialização válido é encontrado (ou seja, o sinalizador inicializável é definido e outras verificações adicionais passam), o BIOS copia o setor MBR na RAM. O BIOS então muda o ponteiro de instruções para o início desse local (usando umJUMP instrução), onde o segmento de código MBR está localizado, e o computador é iniciado.

Se o BIOS suportar a Especificação de inicialização do BIOS , o código MBR poderá retornar o controle ao BIOS com uma determinada instrução, sinalizando uma falha de inicialização e solicitando que você tente o próximo dispositivo. Os BIOS mais antigos apenas imprimem uma mensagem de erro. Uma boa dica se o BIOS suportar é se você pode inicializar a partir do USB.

Meu entendimento é que a única coisa que o BIOS normalmente verifica em um MBR é sua assinatura no final do setor de 512 bytes, e depois transfere o controle para o gerenciador de inicialização inicial situado nos primeiros 446 bytes do setor de inicialização.

Isso está correto, embora se deva observar que a maioria dos BIOS modernos também procurará uma tabela de partição GUID, bem como a tabela convencional de estilo MBR mais antiga.

Isso implica que os primeiros 446 bytes do setor de inicialização DEVEM conter algum código significativo do carregador de inicialização, mesmo que o disco não seja inicializável?

Não , mas a unidade deve ter uma tabela de partição MBR ou GUID válida - caso contrário, ela não será detectada pelo computador. Embora a parte do código do MBR possa realmente estar vazia, o primeiro setor da unidade deve ter um MBR / GPT bem formado.

Avanço
fonte
Obrigado pela resposta muito detalhada. Portanto, o critério para um dispositivo inicializável válido é a presença de uma partição inicializável na tabela de partições e algumas "outras verificações adicionais"? Estou um pouco confuso porque, na pergunta original no AskUbuntu, o autor mostra que todas as partições na unidade não são inicializáveis ​​e ele ainda vê o erro causado pelo GRUB quebrado - o que não deveria ter sido invocado pela BIOS. porque a unidade não atende aos critérios "inicializáveis", o BIOS deveria ter pulado a unidade e passado para a próxima
Sergey
@ Emery, olhei para essa pergunta e não tenho certeza. É possível que o MBR esteja corrompido ou o sinalizador inicializável esteja definido como um valor inválido (não sei como fdisklidar com esses casos, embora a versão original tenha sinalizado cabeçalhos de MBR inválidos). Aconselhei o OP a postar o cabeçalho bruto do MBR, mas ele / ela também pode "ativar / desativar" o sinalizador inicializável (para definir / redefinir o sinalizador manualmente).
Breakthrough
Lembre-se de que o código do BIOS não é genérico. É bastante específico para cada placa principal, portanto, sabe que tipo de unidades podem estar conectadas a quais portas.
LatinSuD
Esta resposta não está totalmente correta. FWIU, verificar uma partição ativa e outros enfeites é algo que o código de inicialização MBR "padrão" faz, não o BIOS. O NeoSmart apresenta uma descrição mais plausível: “Nos PCs compatíveis com IBM (basicamente, tudo), os dois bytes finais do MBR de 512 bytes são chamados de assinatura de inicialização e são usados ​​pelo BIOS para determinar se a unidade de inicialização selecionada é realmente inicializável ou não. não." A última parte está errada. O BIOS herdado pode inicializar a partir da GPT (com o código de inicialização do BIOS apropriado), porque é essencialmente uma inicialização de "estilo livre".
Daniel B
@DanielB, essas duas coisas são abordadas diretamente na resposta: "O BIOS normalmente verifica em um MBR sua assinatura no final do setor de 512 bytes e depois transfere o controle para o gerenciador de inicialização inicial situado nos primeiros 446 bytes do setor de inicialização " e " os BIOS mais modernos também procurarão uma tabela de partição GUID, bem como a tabela convencional de estilo MBR mais antiga " .
Breakthrough