Como o kernel do Linux pode se compilar?

88

Não entendo muito bem o processo de compilação do kernel Linux quando instalo um sistema Linux em minha máquina.

Aqui estão algumas coisas que me confundiram:

  1. O kernel é escrito em C, entretanto, como o kernel foi compilado sem um compilador instalado?
  2. Se o compilador C for instalado em minha máquina antes do kernel ser compilado, como o próprio compilador pode ser compilado sem um compilador instalado?

Fiquei tão confuso por alguns dias, obrigado pela resposta.

MainID
fonte
pelo que se sabe, o compilador C foi escrito em algum tipo de assambler por alguns caras malucos e espertos dos laboratórios da AT&T para compilar UNIX para um determinado computador (observe que a história começa com UNIX, não Linux, então, receio que você perca um capítulo ... ou vários deles!). A história curta é que não houve necessidade de reescrever o kernel unix para computadores diferentes, desde que esses computadores tenham um compilador adequado para a linguagem C. Esses compiladores foram escritos no assambler específico dos computadores de destino. Rude ditado "Primeiro compilador escrito em umambler do computador fornecido, depois UNIX escrito em C"
Victor

Respostas:

208

A primeira rodada de binários para sua máquina Linux foi construída em alguma outra máquina Linux (provavelmente).

Os binários para o primeiro sistema Linux foram construídos em alguma outra plataforma.

Os binários desse computador podem rastrear sua raiz até um sistema original que foi construído em outra plataforma.

...

Empurre isso longe o suficiente e você encontrará compiladores construídos com ferramentas mais primitivas, que por sua vez foram construídas em máquinas diferentes de seu host.

...

Continue pressionando e você encontrará computadores construídos de forma que suas instruções possam ser inseridas ajustando-se os interruptores no painel frontal da máquina .

Coisas muito legais.

A regra é "construir as ferramentas para construir as ferramentas para construir as ferramentas ...". Muito parecido com as ferramentas que executam nosso ambiente físico. Também conhecido como "puxando-se para cima pelos bootstraps".

dmckee --- gatinho ex-moderador
fonte
3
Não necessariamente sujo. Simplesmente não otimizado. o primeiro compilador será otimizado para funcionar no 386, mas a versão recompilada será otimizada para qualquer arquitetura que você tenha.
bretão
1
Você pode adicionar um terceiro estágio, se tudo estiver ok, a saída do segundo estágio deve ser igual à saída do terceiro estágio.
Ismael
27
Não é apenas software, é hardware para. Nada como um P4 (ou mesmo um 486) poderia ser construído sem um computador.
BCS
1
@BCS: Oh, sim. Chegamos ao ponto em que as ferramentas de software e hardware estão profundamente interligadas e interdependentes.
dmckee --- ex-moderador gatinho
4
“Um sistema complexo que funciona invariavelmente evoluiu de um sistema simples que funcionava”. en.wikipedia.org/wiki/Gall's_law
ajuc
33

Acho que você deve distinguir entre:

compilar , v: Para usar um compilador para processar código-fonte e produzir código executável [1] .

e

instalar , v: Para conectar, configurar ou preparar algo para uso [2] .

A compilação produz executáveis ​​binários a partir do código-fonte. A instalação simplesmente coloca esses executáveis ​​binários no lugar certo para executá-los mais tarde. Portanto, a instalação e o uso não requerem compilação se os binários estiverem disponíveis. Pense em “compilar” e “instalar” como em “cozinhar” e “servir”, correspondentemente.

Agora, suas perguntas:

  1. O kernel é escrito em C, entretanto, como o kernel foi compilado sem um compilador instalado?

O kernel não pode ser compilado sem um compilador, mas pode ser instalado a partir de um binário compilado.

Normalmente, ao instalar um sistema operacional, você instala um kernel pré-compilado (executável binário). Foi compilado por outra pessoa. E apenas se você deseja compilar o kernel sozinho, você precisa do código-fonte e do compilador, e todas as outras ferramentas.

Mesmo em distribuições "baseadas em código-fonte" como o gentoo, você começa executando um binário compilado.

Assim, você pode viver toda a sua vida sem compilar kernels, porque você os compilou por outra pessoa.

  1. Se o compilador C for instalado em minha máquina antes do kernel ser compilado, como o próprio compilador pode ser compilado sem um compilador instalado?

O compilador não pode ser executado se não houver kernel (SO). Portanto, é necessário instalar um kernel compilado para rodar o compilador, mas não é necessário compilar o kernel sozinho.

Novamente, a prática mais comum é instalar binários compilados do compilador e usá-los para compilar qualquer outra coisa (incluindo o próprio compilador e o kernel).

Agora, o problema do ovo e da galinha. O primeiro binário foi compilado por outra pessoa ... Veja uma excelente resposta de dmckee.

sastanina
fonte
14

O termo que descreve esse fenômeno é bootstrapping , é um conceito interessante para ler. Se você pensar em desenvolvimento embarcado, ficará claro que muitos dispositivos, como despertadores, micro-ondas, controles remotos, que requerem software, não são poderosos o suficiente para compilar seu próprio software. Na verdade, esses tipos de dispositivos normalmente não têm recursos suficientes para executar algo remotamente tão complicado quanto um compilador.

O software é desenvolvido em uma máquina desktop e copiado assim que compilado.

Se esse tipo de coisa interessa a você, um artigo que vem à mente de cima da minha cabeça é: Reflexões sobre confiança em confiança ( pdf ), é um clássico e uma leitura divertida.

a2800276
fonte
1
Você está confundindo compilação cruzada com bootstrapping. O primeiro envolve um compilador que existe apenas em um PC e que cria opcodes para a arquitetura de destino. Obviamente, você não pode fazer isso sem outro computador, então há um dilema da galinha e do ovo. A resposta para o dilema é a inicialização, em que um compilador simples escrito à mão ou preexistente é usado para gerar um compilador mais complexo.
Kevin Vermeer
12

O kernel não compila a si mesmo - ele é compilado por um compilador C no espaço do usuário. Na maioria das arquiteturas de CPU, a CPU possui um número de bits em registros especiais que representam quais privilégios o código atualmente em execução possui. No x86, esses são os bits de nível de privilégio (CPL) atuais no registro de segmento de código (CS). Se os bits CPL forem 00, o código será executado no anel de segurança 0 , também conhecido como modo kernel . Se os bits CPL forem 11, o código será executado no anel de segurança 3 , também conhecido como modo de usuário . As outras duas combinações, 01 e 10 (anéis de segurança 1 e 2 respectivamente) raramente são usadas.

As regras sobre o que o código pode e não pode fazer no modo de usuário versus modo kernel são bastante complicadas, mas basta dizer que o modo de usuário tem privilégios severamente reduzidos.

Agora, quando as pessoas falam sobre o kernel de um sistema operacional, elas estão se referindo às partes do código do sistema operacional que podem ser executadas no modo kernel com privilégios elevados. Geralmente, os autores do kernel tentam manter o kernel o menor possível por razões de segurança, de forma que o código que não precisa de privilégios extras não os tenha.

O compilador C é um exemplo de tal programa - ele não precisa dos privilégios extras oferecidos pelo modo kernel, então ele é executado no modo de usuário, como a maioria dos outros programas.

No caso do Linux, o kernel consiste em duas partes: o código-fonte do kernel e o executável compilado do kernel. Qualquer máquina com um compilador C pode compilar o kernel do código-fonte na imagem binária. A questão, então, é o que fazer com essa imagem binária.

Ao instalar o Linux em um novo sistema, você está instalando uma imagem binária pré-compilada, geralmente de uma mídia física (como um CD-DVD) ou da rede. O BIOS irá carregar o (imagem binária do) bootloader do kernel da mídia ou rede, e então o bootloader irá instalar o (imagem binária do) kernel em seu disco rígido. Então, quando você reinicializar, o BIOS carrega o carregador de inicialização do kernel do seu disco rígido, e o carregador de inicialização carrega o kernel na memória, e você está pronto e funcionando.

Se você quiser recompilar seu próprio kernel, isso é um pouco mais complicado, mas pode ser feito.

Adam Rosenfield
fonte
5

Qual estava lá primeiro? A galinha ou o ovo?

Os ovos existem desde a época dos dinossauros.

..alguns confundem tudo dizendo que as galinhas são, na verdade, descendentes das grandes bestas .. curta a história: A tecnologia (Ovo) já existia antes do produto Atual (Galinha)

Você precisa de um kernel para construir um kernel, ou seja, você constrói um com o outro.

O primeiro kernel pode ser o que você quiser (de preferência algo sensato que possa criar o produto final desejado ^ __ ^)

Este tutorial de Bran's Kernel Development ensina você a desenvolver e construir um kernel pequeno que você pode testar com uma máquina virtual de sua escolha.

Significado: você escreve e compila um kernel em algum lugar e o lê em uma máquina virtual vazia (sem sistema operacional).

O que acontece com essas instalações do Linux segue a mesma ideia com complexidade adicional.

Ric Tokyo
fonte
5

Não são tartarugas lá embaixo. Assim como você disse, você não pode compilar um sistema operacional que nunca foi compilado antes em um sistema que está executando esse sistema operacional. Da mesma forma, pelo menos a primeira compilação de um compilador deve ser feita em outro compilador (e geralmente algumas compilações subsequentes também, se aquela primeira compilação não for capaz de compilar seu próprio código-fonte ainda).

Acho que os primeiros kernels do Linux foram compilados em uma caixa Minix, embora não tenha certeza disso. O GCC estava disponível na época. Um dos objetivos iniciais de muitos sistemas operacionais é executar um compilador bem o suficiente para compilar seu próprio código-fonte. Indo mais longe, o primeiro compilador foi quase certamente escrito em linguagem assembly. Os primeiros montadores foram escritos por aquelas pessoas pobres que tinham que escrever em código de máquina bruto.

Você pode querer verificar o projeto Linux From Scratch . Na verdade, você constrói dois sistemas no livro: um "sistema temporário" que é construído em um sistema que você não construiu sozinho, e então o "sistema LFS" que é construído em seu sistema temporário. Da maneira como o livro está escrito atualmente, você realmente constrói o sistema temporário em outra máquina Linux, mas em teoria você poderia adaptá-lo para construir o sistema temporário em um sistema operacional completamente diferente.

O mais colher
fonte
1

Se estou entendendo sua pergunta corretamente. O kernel não está "compilando a si mesmo" atualmente. A maioria das distribuições do Linux hoje oferece instalação de sistema por meio de um live cd linux. O kernel é carregado do CD para a memória e opera normalmente, como se estivesse instalado no disco. Com um ambiente Linux instalado e funcionando em seu sistema, é fácil apenas enviar os arquivos necessários para o seu disco.

Se você estava falando sobre o problema de bootstrap; dmckee resumiu muito bem.

Apenas oferecendo outra possibilidade ...

in70x
fonte