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)
fonte
Respostas:
Historicamente, havia várias maneiras:
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.
fonte
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
fonte
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.
fonte