usar nucleo modificar instalar descargar compilar como c linux compiler-construction

nucleo - instalar kernel linux



¿Cómo se puede compilar el kernel de Linux? (7)

No entiendo muy 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 núcleo 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 compilar el kernel, ¿cómo puede compilarse el compilador sin tener instalado un compilador?

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


¿Cuál estaba allí primero? el pollo o el huevo?

Los huevos han existido desde el tiempo de los dinosaurios ..

... algunos confunden todo diciendo que los pollos son en realidad descendientes de las grandes bestias ... larga historia corta: La tecnología (huevo) existía antes del producto actual (pollo)

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

El primer kernel puede ser lo que quieras (preferiblemente algo sensato que puede crear tu producto final deseado ^ __ ^)

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

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

Lo que sucede con esas instalaciones de Linux sigue la misma idea con complejidad añadida.


Creo que deberías distinguir entre:

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

y

instalar , v: para conectar, configurar o preparar algo para usar [2] .

La compilación produce ejecutables binarios a partir del código fuente. La instalación simplemente pone 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 "cocinar" y "servir", de manera correspondiente.

Ahora, tus preguntas:

  1. El núcleo 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 la fuente y el compilador, y todas las demás herramientas.

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

Entonces, puedes vivir toda tu vida sin compilar kernels, porque los has compilado por otra persona.

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

El compilador no se puede ejecutar si no hay núcleo (SO). Entonces uno tiene que instalar un kernel compilado para ejecutar el compilador, pero no necesita compilar el kernel.

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

Ahora, problema de huevo y pollo. El primer binario es compilado por otra persona ... Vea una excelente respuesta por dmckee.


El kernel no se compila, es compilado por 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 los privilegios que tiene el código actualmente en ejecución. En x86, estos son los bits de nivel de privilegio (CPL) actuales en el registro del segmento de código (CS). Si los bits de CPL son 00, se dice que el código se está ejecutando 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 usan.

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

Ahora, cuando las personas hablan sobre el kernel de un sistema operativo, se refieren a las partes del código del SO que se ejecutan en modo kernel con privilegios elevados. En general, los autores del núcleo intentan mantener el núcleo lo más pequeño posible por razones de seguridad, de modo que el código que no necesita privilegios adicionales no los tiene.

El compilador de C es un ejemplo de este tipo de programa: 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 otros programas.

En el caso de Linux, el núcleo 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 kernel 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 medios físicos (como un CD DVD) o desde la red. El BIOS cargará la imagen (imagen binaria del) gestor de arranque del kernel desde el medio o la red, y luego el gestor de arranque instalará la imagen (imagen binaria del kernel) en su disco duro. Luego, cuando reinicies, el BIOS carga el gestor de arranque del kernel desde tu disco duro, y el gestor de arranque carga el kernel en la memoria, y estás apagado y en funcionamiento.

Si desea recompilar su propio kernel, eso es un poco más complicado, pero se puede hacer.


El término que describe este fenómeno es bootstrapping , es un concepto interesante para leer. Si piensas en el desarrollo integrado, queda claro que muchos dispositivos, como despertadores, microondas, controles remotos, que requieren software no son lo suficientemente potentes como para compilar su propio software. De hecho, este tipo de dispositivos generalmente no tienen recursos suficientes 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: Reflections on Trust Trust ( pdf ), es una lectura clásica y divertida.


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

Los binarios para el primer sistema Linux se construyeron en alguna otra plataforma.

Los archivos binarios para esa computadora pueden rastrear su raíz a un sistema original que fue construido en otra plataforma.

...

Empuje esto lo suficiente, y encontrará compiladores construidos con herramientas más primitivas, que a su vez se crearon 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 "tirarse por las botas".


No son las tortugas todo el camino. Como dices, no puedes compilar un sistema operativo que nunca antes se haya compilado en un sistema que ejecuta ese sistema operativo. Del mismo modo, al menos la primera compilación de un compilador debe hacerse en otro compilador (y generalmente también algunas compilaciones posteriores, si esa primera compilación resulta no ser capaz de compilar su propio código fuente todavía).

Creo que los primeros kernels de Linux fueron compilados en una caja de 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á, el primer compilador casi con certeza estaba escrito en lenguaje ensamblador. Los primeros ensambladores fueron escritos por aquellos pobres que tenían que escribir en código máquina sin procesar.

Es posible que desee consultar el proyecto Linux From Scratch . De hecho, construyes 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 está construido en tu sistema temporal. La forma en que el libro está escrito actualmente, realmente construyes el sistema temporal en otra caja Linux, pero en teoría podrías adaptarlo para construir el sistema temporal en un sistema operativo completamente diferente.


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

Si estuvieras hablando sobre el problema de arranque; dmckee lo resumió bastante bien.

Solo ofreciendo otra posibilidad ...