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:
- O kernel é escrito em C, entretanto, como o kernel foi compilado sem um compilador instalado?
- 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.
c
linux
compiler-construction
MainID
fonte
fonte
Respostas:
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".
fonte
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:
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.
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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 ...
fonte