una solicita sistema operativo llamadas llamada interfaz como linux-kernel arm embedded-linux

linux-kernel - solicita - llamadas al sistema linux



Llamada al sistema Linux (2)

Puedo obtener la ejecución de invocación de llamadas al sistema y su procesamiento en Kernel. Pero algunas cosas aún no están claras para mí. Al ingresar a la rutina swi, Kernel guarda los registros del modo Usuario en la pila. La pregunta es-

  1. ¿Quién es stack es? (Como el manejo swi y la rutina de llamada del sistema correspondiente necesita el marco de pila para trabajar)

  2. Si es la propia pila de Kernel, ¿de dónde se asignará la pila ...? ¿Comenzará a usar la pila de la corriente? Si es así, entonces actual puede ser cualquier proceso que pueda estar ejecutándose en ese momento en Kernel. ¿Esto no agota la pila de corriente?

  3. Si utiliza la pila del proceso de usuario que se está ejecutando actualmente en el controlador SWI, este será el espacio de direcciones de usuario al que accederá ahora el kernel. es posible? Como la memoria direccionable del kernel está dentro de 1GB (si la relación de espacio de direcciones Kernel-to-User de 1: 3 se usa en un sistema de memoria RAM de 4GB).


La mayoría de los modos ARM tienen una pila separada. Las pilas generalmente se configuran poco después del controlador de reinicio. Desde arch / arm / kernel / setup.c:

/* * setup stacks for re-entrant exception handlers */ __asm__ ( "msr cpsr_c, %1/n/t" "add sp, %0, %2/n/t" "msr cpsr_c, %3/n/t" "add sp, %0, %4/n/t" "msr cpsr_c, %5/n/t" "add sp, %0, %6/n/t" "msr cpsr_c, %7" : : "r" (stk), "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE), "I" (offsetof(struct stack, irq[0])), "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE), "I" (offsetof(struct stack, abt[0])), "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE), "I" (offsetof(struct stack, und[0])), "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE) : "r14");

PS SVC es el nombre actual de lo que se llamó SWI.


Es cierto que la pila es específica de los modos ARM.

Esta es la ruta rápida de retorno de syscall. Hacemos lo menos posible aquí, y esto incluye guardar de nuevo en la pila de SVC.

Las líneas anteriores se indican en entry-common.S . Entonces la pila es pila SVC. (Nota: swi es reemplazado por svc).