2009-05-20 26 views
21

¿Se comparte la pila del kernel para todos los procesos o hay una pila de kernel separada para cada proceso? Si está separado para cada proceso, ¿dónde está almacenado este puntero de pila? En task_struct?kernel stack for linux process

Respuesta

17

Solo hay una memoria común del kernel. En él, cada proceso tiene su propia task_struct + stack de kernel (por defecto 8K).

En un cambio de contexto, el puntero de la pila anterior se guarda en algún lugar y el puntero de la pila real apunta a la parte superior (o inferior según la arquitectura del hardware) del nuevo proceso que se va a ejecutar.

+1

¿dónde se almacena este puntero de pila? – suresh

+2

En un cambio de contexto, el viejo valor del puntero de la pila se almacena en la task_struct del proceso que se está reemplazando por un nuevo proceso y el puntero de la pila para el nuevo proceso se lee del task_struct de este nuevo proceso. –

12

This old article dice que cada proceso tiene su propia pila de kernel. Vea los comentarios de por qué ese parece ser un muy buen diseño.

Probé reading the current source para estar seguro, pero como la pila del núcleo está "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.

+3

Tengo serias dudas de que esto pueda cambiarse. La pila kernel es un espacio no compartido donde las llamadas al sistema pueden poner sus datos. Si los compartes entre procesos, varias rutinas del kernel podrían usar la misma pila al mismo tiempo -> corrupción de datos. –

+1

Creo que cada proceso necesita su propia pila de kernel, porque varios procesos diferentes podrían estar ejecutando llamadas al sistema simultáneamente y no querría que se mezclaran. –

+0

Cada proceso tiene su propia pila de kernel y cada pila de kernel tiene su proceso asociado. Nunca ha sido cambiado. Es por eso que hay algo parecido a un pseudo proceso en "ps". –

2

El libro "Linux kernel Development" de Robert Love tiene una buena explicación sobre la pila de kernel de proceso.

Y sí, cada proceso tiene su propia pila de kernel y, si no estoy equivocado, su puntero se almacena en la estructura thread_info. Pero no estoy muy seguro al respecto, y la struct task_struct se almacena al principio o al final del proceso kernel stack, dependiendo de la arquitectura de la CPU.

Saludos. Carlos Maiolino

+2

Desde el núcleo de Linux 2.6 en adelante, la estructura 'thread_info' se almacena al final de la pila del kernel de cada proceso y no de la estructura task_struct. La estructura 'thread_info' contiene el puntero a la estructura' task_struct' –

1

Creo que cada proceso tiene su propia pila de modo kernel. El controlador se está ejecutando en el modo kernel, el proceso algunas veces se bloqueará mientras se ejecuta la rutina del controlador. y el sistema operativo puede programar otro proceso para ejecutar. El proceso programado puede llamar a la rutina del controlador nuevamente. Si se comparte la pila del kernel, 2 procesos están usando la pila del núcleo, las cosas se mezclarán. Estoy desconcertado por esta pregunta por mucho tiempo. Al principio creo que la pila kernel es compartida, algunos libros dicen eso. Después de leer el desarrollo del núcleo de Linux y ver algún código de controlador, empiezo a pensar que la pila del núcleo no está compartida.