Estoy aprendiendo controladores de dispositivos y programación de Kernel. Según el libro de Jonathan Corbet, no hay main()
función en los controladores de dispositivos.
Entonces yo dos preguntas:
- ¿Por qué no necesitamos una
main()
función en los controladores de dispositivo? - ¿El núcleo en sí tiene una
main()
función?
¿Alguien puede explicarme esto?
linux-kernel
drivers
alguien
fuente
fuente
Respuestas:
En los programas de espacio de usuario,
main()
es el punto de entrada al programa al que se llama el código de inicialización de libc cuando se ejecuta el binario. El código del kernel no tiene el lujo de confiar en libc, ya que libc se basa en la interfaz syscall del kernel para la asignación de memoria, E / S, gestión de procesos, etc.Dicho esto, el equivalente del
main()
código del núcleo esstart_kernel()
, que es llamado por el gestor de arranque después de haber cargado la imagen del núcleo, descomprimirla en la memoria y configurar el hardware esencial y la paginación de la memoria.start_kernel()
realiza la mayoría de la configuración del sistema y finalmente genera el proceso de inicio.El punto de entrada a los módulos del kernel de Linux es una función init que se registra con el kernel llamando a la
module_init()
macro. La función de inicio del módulo registrado se llama mediante el código del núcleo a través de lado_initcalls()
función durante el inicio del núcleo.fuente
main
método en C. (Es una idea errónea muy común que el sistema operativo hace una llamada directamain
, lo cual no es el caso y es aún menos el caso, por ejemplo, en C ++). Te daría otro voto positivo si pudiera por eso.El kernel no tiene una
main
función.main
Es un concepto del lenguaje C. El núcleo está escrito en C y ensamblado. El código de entrada del núcleo se escribe por ensamblado.La secuencia de arranque se organiza de la siguiente manera:
initrd
). Luego se ejecuta el código en alguna dirección.init
proceso), cambia el contexto de la CPU del anillo 0 al anillo 3 e inicia el proceso de inicio (el ID del proceso es 1). ¡Ahora el arranque del kernel ha terminado!init
programa ejecuta todos los scripts de inicio. Todos los servicios se inician. Se llama Shell. Los usuarios pueden iniciar sesión.La
main
función es una función C. En realidad, el método principal no es el punto de entrada de los programas en C. El tiempo de ejecución C llama muchas funciones antesmain
. GCC tiene una característica extendida: constructores. Las funciones declaradas "constructor" se llaman antesmain
.Por ejemplo:
Esta macro es del proyecto qemu.
fuente
initrd.img
NO ES la imagen del núcleo. Es un conjunto de módulos cargados por el núcleo en el arranque. Las imágenes del núcleo generalmente tienen nombres que comienzan con "vmlinuz" pero difieren de una distribución a otra.Hay, por ejemplo, una función main () en arch / x86 / boot / main.c para preparar el sistema para cambiar del modo real al modo protegido, pero otras arquitecturas no tienen dicho código. Hay una buena visión general de cómo funciona el arranque del kernel de Linux 2.6.x en la plataforma x86. Realmente vale la pena leerlo.
Según el documento CÓMO hacer el desarrollo del kernel de Linux , el kernel de Linux es
lo que según el estándar C BTW significa que
fuente