pila de núcleo y pila de espacio de usuario


¿Cuál es la diferencia entre la pila del núcleo y la pila del usuario? ¿Por qué se usa kernel stack? Si se declara una variable local en un ISR, ¿dónde se almacenará? ¿Cada proceso tiene su propia pila de kernel ? Entonces, ¿cómo se coordina el proceso entre ambas pilas?

Author: gnat, 2012-10-16

3 answers

  1. ¿Cuál es la diferencia entre la pila del kernel y la pila del usuario ?

En resumen, nada, aparte de usar una ubicación diferente en la memoria (y por lo tanto un valor diferente para el registro stackpointer), y generalmente diferentes protecciones de acceso a la memoria. Es decir, cuando se ejecuta en modo usuario, la memoria del núcleo (parte de la cual es la pila del núcleo) no será accesible incluso si está asignada. Viceversa, sin ser explícitamente solicitado por el código del kernel (en Linux, a través de funciones como copy_from_user()), la memoria de usuario (incluida la pila de usuarios) no suele ser accesible directamente.

  1. ¿Por qué se utiliza [una pila de kernel separada]?

Separación de privilegios y seguridad. Por un lado, los programas de espacio de usuario pueden hacer su pila(puntero) lo que quieran, y generalmente no hay ningún requisito arquitectónico para tener uno válido. Por lo tanto, el núcleo no puede confiar en que el stackpointer del espacio de usuario sea válido ni usable, y por lo tanto requerirá un conjunto bajo su propio control. Diferentes arquitecturas de CPU implementan esto de diferentes maneras; las CPU x86 cambian automáticamente los stackpointers cuando se producen cambios de modo de privilegio, y los valores que se utilizarán para diferentes niveles de privilegio son configurables - por código privilegiado (es decir, solo el núcleo).

  1. Si se declara una variable local en un ISR, ¿dónde se almacenará?

En la pila del núcleo. Núcleo (Es decir, el kernel de Linux) hace no hook ISRs directamente a las puertas de interrupción de la arquitectura x86 sino que delega el despacho de interrupción a un mecanismo común de entrada/salida de interrupción del kernel que guarda el estado de registro previo a la interrupción antes de llamar al (los) manejador (es) registrado (s). La propia CPU al enviar una interrupción puede ejecutar un conmutador de privilegios y / o pila, y esto es usado / configurado por el núcleo para que el código de entrada de interrupción común ya pueda confiar en una pila del núcleo estar presente.
Dicho esto, las interrupciones que ocurren mientras se ejecuta el código del núcleo simplemente (continuarán) usando la pila del núcleo en ese punto. Esto puede, si los manejadores de interrupciones tienen rutas de llamada profundamente anidadas, conducir a desbordamientos de pila (si se interrumpe una ruta de llamada profunda al kernel y el manejador causa otra ruta profunda; en Linux, el código RAID del sistema de archivos / software que se interrumpe por código de red con iptables activo se sabe que desencadena tal en núcleos antiguos no sintonizados ... la solución es aumentar el tamaño de la pila del núcleo para tales cargas de trabajo).

  1. ¿Cada proceso tiene su propia pila de kernel ?

No solo cada proceso - cada hilo tiene su propia pila de kernel (y, de hecho, su propia pila de usuario también). Recuerde que la única diferencia entre procesos y subprocesos (para Linux) es el hecho de que múltiples subprocesos pueden compartir un espacio de direcciones (formando un proceso).

  1. Cómo se coordina el proceso ¿entre estas dos pilas ?

Para nada - no es necesario. La programación (cómo / cuándo se ejecutan diferentes subprocesos, cómo se guarda y restaura su estado) es la tarea del sistema operativo y los procesos no necesitan preocuparse por esto. A medida que se crean los subprocesos (y cada proceso debe tener al menos un subproceso), el núcleo crea pilas de núcleo para ellos, mientras que las pilas de espacio de usuario se crean/proporcionan explícitamente por cualquier mecanismo que se use para crear un subproceso (funciones como makecontext() o pthread_create() permiten al llamador especificar una región de memoria que se utilizará para la pila del subproceso "hijo"), o heredado (por clonación de memoria en acceso, generalmente llamada "copiar al escribir" / VACA, al crear un nuevo proceso).
Dicho esto, el proceso puedeinfluir en la programación de sus hilos y/o influir en el contexto (estado, entre el que se encuentra el stackpointer del hilo). Hay varias maneras para esto: Señales UNIX, setcontext(), pthread_yield() / pthread_cancel(), ... - pero esto es disgustando un poco de la pregunta original.

 145
Author: FrankH.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-31 12:26:56

Mi respuesta se recoge de otras preguntas SO con mis cosas.

What's the difference between kernel stack and user stack?

Como programador del kernel, usted sabe que el kernel debe ser restringido de programas de usuario erróneos. Supongamos que mantiene la misma pila tanto para el kernel como para el espacio de usuario, y luego una simple falla de segmento en la aplicación de usuario bloquea el kernel y necesita reiniciar.

Hay una "pila del núcleo" por CPU como la pila ISR y una "pila del núcleo" por Proceso. Hay una "pila de usuarios" para cada proceso, aunque cada hilo tiene su propio pila, incluyendo los hilos de usuario y del núcleo.

Http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

Así que cuando estamos en modo kernel, el tipo de mecanismo de pila es necesario para tratar con llamadas a funciones, variables locales similares al espacio de usuario.

Http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

Se almacenará en la pila ISR(IRQSTACKSIZE). El ISR se ejecuta en una pila de interrupciones separada solo si el hardware lo soporta. De lo contrario, los marcos de la pila ISR se empujan a la pila del hilo interrumpido.

El espacio de usuario no sabe y francamente no le importa si la interrupción se sirve en la pila del kernel del proceso actual o en una pila ISR separada. Como las interrupciones vienen por cpu, por lo tanto la pila ISR tiene que ser por cpu.

 Does each process has its own kernel stack ?

Sí. Cada proceso tiene su propia pila de kernel.

 Then how the process coordinates between both these stacks?

La respuesta de@FrankH me parece genial.

 15
Author: Jeyaram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-03 00:53:57
  1. ¿Cuál es la diferencia entre la pila del núcleo y la pila del usuario

Tomando como referencia el desarrollo del Kernel Linux de Robert Love, la principal diferencia es el tamaño:

El espacio de usuario puede salirse con la suya asignando estáticamente muchas variables en la pila, incluyendo estructuras enormes y matrices de mil elementos.
Este comportamiento es legal porque el espacio de usuario tiene una pila grande que puede crecer dinámicamente.
La pila del núcleo no es ni grande ni dinámico; es pequeño y de tamaño fijo.
El tamaño exacto de la pila del núcleo varía según la arquitectura.
En x86, el tamaño de pila es configurable en tiempo de compilación y puede ser 4KB u 8KB.
Históricamente, la pila del núcleo consta de dos páginas, lo que generalmente implica que es 8KB en arquitecturas de 32 bits y 16KB en arquitecturas de 64 bits-esto el tamaño es fijo y absoluto.
Cada proceso recibe su propia pila.

También la pila del kernel contiene un puntero a la estructura thread_info contiene información sobre el hilo.

 2
Author: arenard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-06 07:08:45