Escrevendo um carregador de inicialização sem carregador de inicialização

8

Tenho uma pergunta que realmente não consigo encontrar uma resposta direta. Deixe-me começar dizendo que não estou pedindo um tutorial passo a passo, ou mesmo planejando fazer alguma coisa. Eu só estou curioso.

Eu tenho lido o dia todo sobre o desenvolvimento de sistemas operacionais e como eles são construídos a partir do zero. Eu tenho um controle bem firme da teoria disso. No entanto, há um passo para o qual não consigo encontrar uma resposta.

Antes da existência de um sistema operacional cheio de ferramentas, como alguém escreveria um carregador de inicialização simples para um computador que não possui um carregador de inicialização ou qualquer outra coisa nesse setor em seu setor de inicialização? Qual seria o primeiro passo depois de adquirir um computador com o mínimo necessário? (Ou seja, tela, teclado, processador, memória ram, disco rígido, disquete)

usuario
fonte

Respostas:

9

Historicamente, havia várias maneiras:

  • Nenhum sistema operacional. O executável foi carregado do primeiro cartão, arquivo de fita ou qualquer outra coisa.
  • É codificado na memória do núcleo magnético. Os núcleos eram ímãs permanentes em vez de ferrita simples, dependendo da orientação N / S do ímã, era um ou zero. Os computadores das naves Gemini e Apollo tiveram todos os seus programas "tricotados" dessa maneira.
  • Primeiro setor do disco. Isso era bastante comum em computadores "mini", como o PDP-11, o computador era conectado para ler a primeira faixa do primeiro disco e executar o código ao atingir um marcador EOF.
  • Dispositivo de inicialização personalizado. A segunda geração de mainframes da IBM tinha um disquete de 12 polegadas dedicado para carregar em um sistema operacional de "microcódigo". Que então procurou o sistema operacional real no disco em algum lugar. Também vi micros com unidades de fita cassete dedicadas para carregar o sistema operacional. Os operadores foram solicitados a rebobinar ou "virar" a fita.

  • BIOS. Um sistema operacional mínimo é armazenado na ROM e o processador é conectado para executar o código da ROM ao "ligar". A ROM então obtém o sistema operacional real de qualquer lugar. É assim que todos os computadores modernos funcionam. O que a ROM realmente faz varia de processador para processador. As caixas Itel geralmente possuem um programa BIOS muito sofisticado, dedicado a cada "geração" de processador. As caixas do tipo Unix geralmente têm um BIOS muito mais simples. As caixas Sun / Oracle carregam o famoso intérprete "FORTH", que executa um script simples para carregar o Solaris.

James Anderson
fonte
2
Não se esqueça de alternar interruptores! Muitos primeiros computadores tinha uma fileira de comutadores de modo que você pode carregar manualmente um pré-bootloader para ler a partir de disquete ou fita para carregar o bootloader real e OS
Earlz
@Earlz - esqueci disso. Em um pdp-11, você pode definir o endereço binário do dispositivo de inicialização usando os comutadores do painel.
James Anderson
@Earlz Há uma história famosa sobre como Paul Allen (co-fundador da Microsoft) escreveu um gerenciador de inicialização para o intérprete BASIC dele e de Bill Gates para o Altair no avião e depois o trocou manualmente. (Veja en.wikipedia.org/wiki/Altair_BASIC , que não chega a dar os detalhes, mas faz recontar a história.)
Ryan Reich
4

Nos dias realmente antigos (como o IBM 650 ou PDP1), era necessário inserir valores na memória usando os comutadores do painel frontal. Observando fotos de computadores realmente antigos, você viu duas filas de luzes - Endereço e Dados. Em um computador de 16 bits, havia 16 deles em execução, geralmente codificados por cores em grupos de três ou quatro para octal ou hex, respectivamente.

O botão 'Redefinir' definiria o contador 'Endereço' para zero. Pode-se então definir os interruptores no barramento de dados para o valor desejado e alternar o botão 'gravação de dados'. Isso gravaria as configurações da chave na memória no endereço 0. Havia chaves de alternância de cima para baixo para permitir a passagem para o endereço seguinte ou anterior. Você também pode definir as opções para o endereço e clicar em 'gravação de endereço'. O que quer que estivesse naquele novo endereço seria exibido nas 16 luzes de dados.

Normalmente, é possível alternar, usando essa técnica, um loop de leitura para ler valores de um leitor de cartão ou fita de papel. Isso seria suficiente para carregar um bloco de código maior para prosseguir com o carregamento do SO ou do aplicativo. Naquela época, esses computadores tinham palavras entre 4K e 16K (ou 8K a 32K bytes); portanto, esses carregadores eram minúsculos para os padrões modernos. Um loop de leitura pode conter apenas três ou cinco palavras de 16 bits.

Ilustração do painel frontal

Meredith Poor
fonte
3

Você precisa de alguma maneira de criar um chip ROM ou EEPROM que possa ser instalado na placa-mãe e que contenha o carregador de inicialização. Realmente há uma série de etapas de inicialização, começando com verificações internas dos vários chips (CPU, placa de vídeo etc.), seguidas pela ativação e descoberta de barramento (o controlador de barramento PCI-e localiza tudo conectado a ele e atribui IDs etc.). Em seguida, a placa-mãe procura uma ROM de inicialização e executa esse código, que, por sua vez, encontra a ordem de inicialização do BIOS, procura um dispositivo correspondente e carrega o inicializador a partir dele. Por sua vez, carrega um sistema operacional.

A cadeia de inicialização original estava trocando interruptores que formavam a ROM e, posteriormente, usando interruptores para programar a RAM, e assim por diante, até os carregadores de inicialização modernos de vários estágios.

Móż
fonte