procesos - pila de kernel para proceso de linux
ver procesos corriendo en linux (4)
Creo que cada proceso tiene su propia pila de modo kernel. El controlador se está ejecutando en el modo kernel, el proceso a veces se bloqueará mientras se ejecuta la rutina del controlador. y el sistema operativo puede programar otro proceso para ejecutar. El proceso programado puede volver a llamar a la rutina del controlador. Si se comparte la pila del kernel, 2 procesos están usando la pila del kernel, las cosas se mezclarán. Estoy confundido por esta pregunta durante mucho tiempo. Al principio creo que la pila del kernel es compartida, algunos libros dicen eso. Después de leer el desarrollo del kernel de Linux y ver un código de controlador, empiezo a pensar que la pila del kernel no está compartida.
¿Se comparte la pila del núcleo para todos los procesos o hay una pila separada del núcleo para cada proceso? Si está separado para cada proceso, ¿dónde se almacena este puntero de pila? En task_struct?
El libro "Desarrollo del kernel de Linux" de Robert Love tiene una buena explicación sobre el proceso de pila del kernel.
Y sí, cada proceso tiene su propia pila de kernel y si no me equivoco, su puntero se almacena en la estructura thread_info. Pero no estoy muy seguro de ello, y la estructura task_struct se almacena al principio o al final de la pila del núcleo del proceso, dependiendo de la arquitectura de la CPU.
Aclamaciones. Carlos Maiolino
Solo hay una memoria del kernel común. En él, cada proceso tiene su propia task_struct + pila del kernel (por defecto 8K).
En un cambio de contexto, el puntero de pila anterior se guarda en algún lugar y el puntero de pila real se hace para apuntar a la parte superior de la pila (o parte inferior, según la arquitectura del hardware) del nuevo proceso que se ejecutará.
Este artículo anterior dice que cada proceso tiene su propia pila de kernel. Ver comentarios sobre por qué parece ser un muy buen diseño.
Intenté leer la fuente actual para asegurarme, pero como la pila del kernel es "implícita", no está visible en el task_struct
. Esto se menciona en el artículo.
Esta respuesta fue editada para incorporar la sabiduría de los comentarios. Gracias.