¿Cómo puede compilarse el kernel de Linux?

88

No entiendo bien el proceso de compilación del kernel de Linux cuando instalo un sistema Linux en mi máquina.

Aquí hay algunas cosas que me confundieron:

  1. El kernel está escrito en C, sin embargo, ¿cómo se compiló el kernel sin un compilador instalado?
  2. Si el compilador de C está instalado en mi máquina antes de que se compile el kernel, ¿cómo se puede compilar el compilador mismo sin un compilador instalado?

Estuve tan confundido por un par de días, gracias por la respuesta.

MainID
fuente
que yo sepa, el compilador C fue escrito en una especie de asaltante por gente loca e inteligente en los laboratorios de AT&T para compilar UNIX para una computadora determinada (tenga en cuenta que la historia comienza con UNIX, no con Linux, así que me temo que te pierdas un capítulo ... ¡o varios de ellos!). La historia corta es que no hubo necesidad de reescribir el kernel de Unix para diferentes computadoras siempre que esas computadoras tuvieran un compilador adecuado para el lenguaje C. Esos compiladores se escribieron en el ensamblador específico de las computadoras de destino. Refrán tosco: "Primer compilador escrito en el ensamblador de la computadora dada, luego UNIX escrito en C"
Victor

Respuestas:

208

La primera ronda de binarios para su caja de Linux se construyó en alguna otra caja de Linux (probablemente).

Los binarios del primer sistema Linux se crearon en otra plataforma.

Los binarios de esa computadora pueden rastrear su raíz hasta un sistema original que se construyó en otra plataforma.

...

Empuje esto lo suficiente y encontrará compiladores construidos con herramientas más primitivas, que a su vez se construyeron en máquinas distintas de su host.

...

Siga presionando y encontrará computadoras construidas para que sus instrucciones puedan ingresarse configurando interruptores en el panel frontal de la máquina .

Cosas muy interesantes.

La regla es "construir las herramientas para construir las herramientas para construir las herramientas ...". Muy parecido a las herramientas que ejecutan nuestro entorno físico. También conocido como "levantarse con las botas".

dmckee --- ex-gatito moderador
fuente
3
No necesariamente inmundo. Simplemente no optimizado. el primer compilador estará optimizado para trabajar en 386, pero la versión recompilada optimizada para cualquier arquitectura que tenga.
Breton
1
Puede agregar una tercera etapa, si todo está bien, la salida de la segunda etapa debe ser igual a la salida de la tercera etapa.
Ismael
27
No es solo software, es hardware. No hay forma de que se pueda construir algo como un P4 (o incluso un 486) sin una computadora.
BCS
1
@BCS: Oh, sí. Hemos llegado al punto en el que las herramientas de software y hardware están profundamente interconectadas y son interdependientes.
dmckee --- ex-moderador gatito
4
"Un sistema complejo que funciona invariablemente ha evolucionado a partir de un sistema simple que funciona". en.wikipedia.org/wiki/Gall's_law
ajuc
33

Creo que deberías distinguir entre:

compilar , v: Usar un compilador para procesar el código fuente y producir código ejecutable [1] .

y

install , v: Para conectar, configurar o preparar algo para su uso [2] .

La compilación produce ejecutables binarios a partir del código fuente. La instalación simplemente coloca esos ejecutables binarios en el lugar correcto para ejecutarlos más tarde. Por lo tanto, la instalación y el uso no requieren compilación si los binarios están disponibles. Piense en "compilar" e "instalar" como en "cocinar" y "servir", en consecuencia.

Ahora, sus preguntas:

  1. El kernel está escrito en C, sin embargo, ¿cómo se compiló el kernel sin un compilador instalado?

El kernel no se puede compilar sin un compilador, pero se puede instalar desde un binario compilado.

Por lo general, cuando instala un sistema operativo, instala un kernel precompilado (ejecutable binario). Fue compilado por otra persona. Y solo si desea compilar el kernel usted mismo, necesita el código fuente y el compilador, y todas las demás herramientas.

Incluso en distribuciones "basadas en fuentes" como gentoo, se empieza ejecutando un binario compilado.

Por lo tanto, puede vivir toda su vida sin compilar núcleos, porque los ha compilado otra persona.

  1. Si el compilador de C está instalado en mi máquina antes de que se compile el kernel, ¿cómo se puede compilar el compilador mismo sin un compilador instalado?

El compilador no se puede ejecutar si no hay kernel (SO). Así que uno tiene que instalar un kernel compilado para ejecutar el compilador, pero no es necesario que compile el kernel él mismo.

Nuevamente, la práctica más común es instalar binarios compilados del compilador y usarlos para compilar cualquier otra cosa (incluido el propio compilador y el núcleo).

Ahora, problema del huevo y la gallina. El primer binario lo compila otra persona ... Vea una excelente respuesta de dmckee.

Sastanin
fuente
14

El término que describe este fenómeno es bootstrapping , es un concepto interesante para leer. Si piensa en el desarrollo integrado, queda claro que muchos dispositivos, como relojes de alarma, microondas, controles remotos, que requieren software no son lo suficientemente potentes para compilar su propio software. De hecho, este tipo de dispositivos no suelen tener suficientes recursos para ejecutar de forma remota algo tan complicado como un compilador.

Su software se desarrolla en una máquina de escritorio y luego se copia una vez que se ha compilado.

Si este tipo de cosas te interesan, un artículo que me viene a la mente es: Reflexiones sobre la confianza en la confianza ( pdf ), es un clásico y una lectura divertida.

a2800276
fuente
1
Estás confundiendo la compilación cruzada con el bootstrapping. El primero involucra un compilador que existe solo en una PC y que crea códigos de operación para la arquitectura de destino. Obviamente, no puede hacer eso sin otra computadora, así que hay un dilema del huevo y la gallina. La respuesta al dilema es el bootstrapping, donde se utiliza un compilador simple escrito a mano o preexistente para generar un compilador más complejo.
Kevin Vermeer
12

El kernel no se compila solo, lo compila un compilador de C en el espacio de usuario. En la mayoría de las arquitecturas de CPU, la CPU tiene una cantidad de bits en registros especiales que representan qué privilegios tiene el código que se está ejecutando actualmente. En x86, estos son los bits de nivel de privilegio (CPL) actuales en el registro de segmento de código (CS). Si los bits de CPL son 00, se dice que el código se ejecuta en el anillo de seguridad 0 , también conocido como modo kernel . Si los bits de CPL son 11, se dice que el código se está ejecutando en el anillo de seguridad 3 , también conocido como modo de usuario . Las otras dos combinaciones, 01 y 10 (anillos de seguridad 1 y 2 respectivamente) rara vez se utilizan.

Las reglas sobre lo que el código puede y no puede hacer en el modo de usuario frente al modo de kernel son bastante complicadas, pero basta con decir que el modo de usuario tiene privilegios muy reducidos.

Ahora, cuando la gente habla del kernel de un sistema operativo, se refiere a las partes del código del sistema operativo que se ejecutan en modo kernel con privilegios elevados. Generalmente, los autores del kernel intentan mantener el kernel lo más pequeño posible por razones de seguridad, de modo que el código que no necesita privilegios adicionales no los tenga.

El compilador de C es un ejemplo de un programa de este tipo: no necesita los privilegios adicionales que ofrece el modo kernel, por lo que se ejecuta en modo de usuario, como la mayoría de los demás programas.

En el caso de Linux, el kernel consta de dos partes: el código fuente del kernel y el ejecutable compilado del kernel. Cualquier máquina con un compilador de C puede compilar el núcleo desde el código fuente en la imagen binaria. La pregunta, entonces, es qué hacer con esa imagen binaria.

Cuando instala Linux en un sistema nuevo, está instalando una imagen binaria precompilada, generalmente desde un medio físico (como un CD DVD) o desde la red. El BIOS cargará la (imagen binaria del) cargador de arranque del kernel desde el medio o la red, y luego el cargador de arranque instalará la (imagen binaria del) kernel en su disco duro. Luego, cuando reinicia, el BIOS carga el cargador de arranque del kernel desde su disco duro, y el cargador de arranque carga el kernel en la memoria y usted está listo y funcionando.

Si desea recompilar su propio núcleo, es un poco más complicado, pero se puede hacer.

Adam Rosenfield
fuente
5

¿Cuál fue primero? la gallina o el huevo?

Los huevos han existido desde la época de los dinosaurios.

..algunos confunden todo al decir que los pollos son en realidad descendientes de las grandes bestias .. en pocas palabras: la tecnología (huevo) existía antes del producto actual (pollo)

Necesitas un kernel para construir un kernel, es decir, construyes uno con el otro.

El primer núcleo puede ser cualquier cosa que desee (preferiblemente algo sensato que pueda crear el producto final deseado ^ __ ^)

Este tutorial de Bran's Kernel Development le enseña a desarrollar y construir un kernel más pequeño que luego puede probar con una máquina virtual de su elección.

Significado: escribe y compila un kernel en algún lugar y lo lee en una máquina virtual vacía (sin SO).

Lo que sucede con esas instalaciones de Linux sigue la misma idea con mayor complejidad.

Ric Tokio
fuente
5

No son tortugas hasta el final. Tal como dice, no puede compilar un sistema operativo que nunca se haya compilado antes en un sistema que ejecuta ese sistema operativo. De manera similar, al menos la primera compilación de un compilador debe realizarse en otro compilador (y generalmente también en algunas compilaciones posteriores, si esa primera compilación resulta que todavía no puede compilar su propio código fuente).

Creo que los primeros kernels de Linux se compilaron en una caja Minix, aunque no estoy seguro de eso. GCC estaba disponible en ese momento. Uno de los primeros objetivos de muchos sistemas operativos es ejecutar un compilador lo suficientemente bien como para compilar su propio código fuente. Yendo más allá, es casi seguro que el primer compilador se escribió en lenguaje ensamblador. Los primeros ensambladores fueron escritos por aquellos pobres que tenían que escribir en código de máquina sin procesar.

Es posible que desee consultar el proyecto Linux From Scratch . En realidad, construiste dos sistemas en el libro: un "sistema temporal" que se basa en un sistema que no construiste tú mismo, y luego el "sistema LFS" que se construye en tu sistema temporal. De la forma en que el libro está escrito actualmente, en realidad construye el sistema temporal en otra caja de Linux, pero en teoría podría adaptarlo para construir el sistema temporal en un sistema operativo completamente diferente.

El Spooniest
fuente
1

Si entiendo tu pregunta correctamente. El kernel no se "compila solo" en estos días. La mayoría de las distribuciones de Linux actuales proporcionan la instalación del sistema a través de un Live CD de Linux. El núcleo se carga desde el CD a la memoria y funciona como lo haría normalmente, como si estuviera instalado en el disco. Con un entorno Linux en funcionamiento en su sistema, es fácil enviar los archivos necesarios a su disco.

Si estaba hablando del problema del bootstrapping; dmckee lo resumió bastante bien.

Solo ofreciendo otra posibilidad ...

in70x
fuente