AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 532422
Accepted
quixotrykd
quixotrykd
Asked: 2019-07-28 00:37:31 +0800 CST2019-07-28 00:37:31 +0800 CST 2019-07-28 00:37:31 +0800 CST

Como o bootloader do BIOS sabe qual disco usar?

  • 772

Pelo que entendi, o bootloader GRUB em um sistema BIOS (e a maioria dos outros bootloaders) são compostos de 3 partes. A primeira parte (estágio 1) é armazenada nos primeiros 448bytes, que é responsável por passar o controle para o chamado estágio 1.5, localizado um pouco mais adiante na memória. Este estágio finalmente carrega o estágio 2 da pasta /boot e transfere o controle para ele.

Como o estágio 1 sabe em qual estágio de disco 1.5 reside? Uma vez que o código no estágio 1 começa a ser executado, não há como ele saber de qual disco foi carregado (a menos que essa informação seja de alguma forma passada para o estágio 1 ou o próprio BIOS também carregue o estágio 1.5 na memória?)

Do estágio 1.5 ao estágio 2, novamente, como o estágio 1.5 sabe em qual disco (e em qual partição) o diretório /boot reside?

grub uefi
  • 2 2 respostas
  • 971 Views

2 respostas

  • Voted
  1. telcoM
    2019-07-28T02:08:50+08:002019-07-28T02:08:50+08:00

    A primeira parte (estágio 1) é armazenada nos primeiros 448 bytes, que é responsável por passar o controle para o chamado estágio 1.5, localizado um pouco mais adiante na memória. Este estágio finalmente carrega o estágio 2 da pasta /boot e transfere o controle para ele.

    Os nomes "stage1", "stage1.5" e "stage2" pertencem ao GRUB Legacy, ou seja, versões 0.xx do GRUB. Quando o estágio 1 é gravado no MBR (ou PBR), o instalador também gravará nele o número do bloco de disco real onde o início do próximo estágio estará localizado. O primeiro bloco do próximo estágio conterá mais código de programa e uma lista de bloqueios descrevendo onde o restante do estágio está localizado. As entradas da lista de bloqueio são do formato "carregar X blocos começando do bloco de disco #Y". Se o próximo estágio foi gravado no disco como um arquivo contíguo (não fragmentado), geralmente era necessária apenas uma entrada da lista de bloqueio.

    O stage1.5 era na verdade opcional: era perfeitamente possível não instalar o stage1.5 e apenas fazer com que o stage1 carregasse o stage2 diretamente. O estágio 1.5 conteria código suficiente para poder entender um único tipo de sistema de arquivos; stage2 conteria todos os drivers de sistema de arquivos suportados, o que o tornaria muito maior. Dessa forma, stage1.5 pode ser embutido no espaço normalmente não utilizado entre o MBR e o início da primeira partição.

    (Os discos particionados por MBR modernos agora iniciam a primeira partição exatamente a 1 MiB do início do primeiro disco, ou seja, no bloco #2048, para permitir um alinhamento de dados ideal para grandes sistemas de armazenamento. Isso deixa muito mais espaço não utilizado entre o MBR e o início da primeira partição do que a antiga convenção para iniciar a primeira partição em C/H/S 0/1/1.)

    Tanto o stage1.5 quanto o stage2 tinham um espaço pré-alocado dentro deles, para o instalador gravar um identificador de disco GRUB e um nome de caminho. No caso do stage1.5, isso identificaria a partição e o nome do arquivo em que o stage2 real estava localizado; no caso do stage2, ele identificaria a localização do arquivo de configuração do GRUB.

    GNU GRUB (ou seja, GRUB versões 1.xx e acima) em sua forma compatível com BIOS pula totalmente o estágio 1.5 e usa nomes diferentes:

    • o que era stage1é agoraboot.img
    • o que era stage2é agoracore.img

    Ainda são 448 bytes que são incorporados ao boot.imgMBR, mas core.imgsão construídos dinamicamente no momento da instalação do GRUB kernel.imge um conjunto de módulos GRUB.

    Eu posso ver essas informações sendo codificadas no estágio 1.5, mas como isso lida com unidades sendo montadas em ordens diferentes (há garantia de que (hd0) e (hd1) sempre serão a mesma unidade, então codificar algo assim parece uma estratégia frágil.

    A convenção padrão de fato do BIOS era que qualquer disco selecionado do BIOS como o disco para inicializar seria atribuído ao ID 0x80 para funções de acesso ao disco do BIOS, e esse ID seria mapeado diretamente para o GRUB (hd0). (O antigo MS-DOS também sempre mapeava o ID de disco do BIOS 0x80 para a unidade C:.)

    Felizmente, o BIOS geralmente era bastante determinista em como enumerava os diferentes controladores de disco. Portanto, desde que a configuração de hardware e as configurações do BIOS fossem mantidas as mesmas, a ordem de detecção do disco permaneceria a mesma de uma inicialização para a próxima.

    Mas sim, essa definitivamente era uma estratégia frágil; infelizmente, não havia uma maneira padrão onipresente de passar as informações de detecção de disco do BIOS das rotinas do BIOS de 16 bits para um sistema operacional que usa programação em modo protegido de 32 bits (ou mesmo 64 bits). Como resultado, todos os sistemas operacionais de 32 bits ou melhores detectarão novamente seus discos do zero após alternar do carregador de inicialização baseado em BIOS para o modo completo de 32 bits ou 64 bits.

    Sim, o BIOS Enhanced Disk Drive Services (EDD para abreviar) inclui uma extensão do BIOS que pode ser usada para relatar os detalhes essenciais da detecção de disco do BIOS para um sistema operacional em modo protegido... parte era opcional , então sua disponibilidade está longe de ser garantida.

    Em sistemas baseados em BIOS com mais de um controlador de disco, isso era basicamente uma dor de cabeça padrão.

    A estratégia vencedora geralmente seria testar as configurações de inicialização do BIOS completamente ao encontrar um modelo de hardware específico pela primeira vez (possivelmente fazendo várias instalações de teste do sistema operacional) e, uma vez encontrada uma boa configuração, anote-a e não toque no BIOS configurações de inicialização depois disso.

    O GNU GRUB moderno inclui o searchcomando que pode ser usado para selecionar partições de disco por seu rótulo, UUID e/ou pela presença de um arquivo específico. Em um grub-mkconfigarquivo de configuração GRUB 2.xx gerado moderno, os identificadores fixos geralmente devem ser a opção de último recurso, a serem usados ​​somente se os searchcomandos anteriores falharem.

    A tabela de partição GPT inclui UUIDs exclusivos para cada disco e partição como padrão, e as variáveis ​​UEFI NVRAM realmente especificam a localização do carregador de inicialização usando o UUID da partição do ESP + o nome do caminho do carregador de inicialização dentro da partição ESP. Isso permite uma configuração muito mais robusta. Há também uma interface padrão para o sistema operacional em execução para ler as informações de inicialização do firmware UEFI e modificar as configurações de inicialização, se necessário.

    • 3
  2. Best Answer
    Janka
    2019-07-28T01:14:40+08:002019-07-28T01:14:40+08:00

    Se você olhar as fontes do GRUB, disponíveis aqui , você descobrirá que stage1 está realmente definido em grub/grub-core/boot/i386/pc/boot.S.

    Ele pode executar uma inicialização por disquete se configurado. Ele inicializa a partir de um disco rígido configurado e precisa saber de qual C/H/S deve carregar o stage1.5. A única função automática que possui é determinar de qual unidade o setor de inicialização foi carregado, se não estiver configurado de outra forma. Um BIOS funcional carregará esse valor no DL antes de passar o controle para o stage1. Alguns não e o grub volta para o primeiro disco rígido.

    stage1.5 já é capaz de entender partições e sistemas de arquivos, então ele não depende mais de valores C/H/S. A unidade que carrega ainda é a mesma acima.

    • 2

relate perguntas

  • Inicialização de rede (PXE) do BIOS/EFI

  • A atualização da distro gera novas e diferentes imagens de inicialização

  • Red Hat 7.4: Como injetar o arquivo kickstart na mídia USB para o sistema somente UEFI?

  • entradas de variável efi em /sys/firmware/efi/efivars/

  • GRUB - NÃO inicialização dupla, por que ainda aparece por padrão?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve