sistema llamadas llamada interfaz linux operating-system linux-kernel

interfaz - llamadas al sistema linux



Internos de una llamada al sistema Linux (4)

Un curso intensivo en modo kernel en una pila de respuesta de desbordamiento

¡Buena pregunta! (¿Preguntas de entrevista?)

  • ¿Qué sucede (en detalle) cuando un subproceso realiza una llamada al sistema al provocar la interrupción 80?

La operación int $ 80 es vagamente como una llamada de función. La CPU "toma una trampa" y se reinicia en una dirección conocida en modo kernel, generalmente también con un modo MMU diferente. El kernel guardará muchos de los registros, aunque no tiene que guardar los registros que un programa no esperaría que una llamada de función ordinaria guarde.

  • ¿Qué trabajo hace Linux para la pila del hilo y otro estado?

Normalmente, un sistema operativo guardará registros que el ABI promete no cambiar durante las llamadas de procedimiento. La pila permanecerá igual; el kernel se ejecutará en una pila de kernel por hilo en lugar de la pila de usuario por hilo. Naturalmente, algún estado cambiará, de lo contrario no habría ninguna razón para hacer la llamada al sistema.

  • ¿Qué cambios se realizan en el procesador para ponerlo en modo kernel?

Esto suele ser completamente automático. La CPU tiene, genéricamente, una instrucción de interrupción de software que es un poco como una operación de llamada funcional. Provocará el cambio al modo kernel en condiciones controladas. Por lo general, la CPU cambiará algún tipo de bit de protección PSW, guardará el PSW y la PC antiguos, comenzará en una dirección de vector de captura conocida y también puede cambiar a una configuración de mapeo y protección de administración de memoria diferente.

  • Después de ejecutar el controlador de interrupción, ¿cómo se restaura el control al proceso de llamada?

Habrá algún tipo de instrucción de "retorno de interrupción" o "retorno de trampa", que actuará un poco como una instrucción de retorno de función complicada. Algunos procesadores RISC hicieron muy poco automáticamente y requirieron un código específico para realizar la devolución y algunos procesadores CISC como x86 tienen instrucciones (nunca usadas) que ejecutarían docenas de operaciones documentadas en páginas de pseudocódigo de arquitectura manual para ajustes de capacidad.

  • ¿Qué pasa si la llamada al sistema no se puede completar rápidamente: por ejemplo, una lectura del disco? ¿Cómo el controlador de interrupciones abandona el control para que el procesador pueda hacer otras cosas mientras se cargan los datos y cómo obtiene el control nuevamente?

El kernel en sí mismo se enlaza como un programa de usuario con hilos. Simplemente cambia pilas (hilos) y funciona en el proceso de otra persona por un tiempo.

¿Qué sucede (en detalle) cuando un subproceso realiza una llamada al sistema al provocar la interrupción 80? ¿Qué trabajo hace Linux para la pila del hilo y otro estado? ¿Qué cambios se realizan en el procesador para ponerlo en modo kernel? Después de ejecutar el controlador de interrupción, ¿cómo se restaura el control al proceso de llamada?

¿Qué pasa si la llamada al sistema no se puede completar rápidamente: por ejemplo, una lectura del disco? ¿Cómo el controlador de interrupciones abandona el control para que el procesador pueda hacer otras cosas mientras se cargan los datos y cómo obtiene el control nuevamente?


Para responder a la última parte de la pregunta: ¿qué hace el kernel si la llamada del sistema necesita dormir?

Después de una llamada al sistema, el kernel aún se ejecuta de manera lógica en el contexto de la misma tarea que realizó la llamada del sistema (solo está en modo kernel en lugar del modo de usuario) NO es un hilo separado y la mayoría de las llamadas del sistema no invocan la lógica de otro tarea / hilo. Lo que sucede es que el sistema llama a wait_event, o wait_event_timeout o alguna otra función de espera, que agrega la tarea a una lista de tareas que esperan algo, luego pone la tarea en espera, lo que cambia su estado y llama a la programación () para que renuncie La CPU actual.

Después de esto, la tarea no se puede volver a ejecutar hasta que se despierte, generalmente por otra tarea (tarea del kernel, etc.) o el controlador de interrupciones que llama a una función Wake * que activará las tareas en espera de ese evento en particular, lo que significa el programador pronto los programará de nuevo.

Vale la pena señalar que las tareas del espacio de usuario (es decir, los subprocesos) son solo un tipo de tarea y hay algunos otros internos en el kernel que también pueden funcionar, son los subprocesos del kernel y la mitad inferior de los manejadores / tasklets / colas de tareas, etc. no pertenece a ningún proceso de espacio de usuario en particular (por ejemplo, el manejo de la red, por ejemplo, responder a pings) se realiza en estos. Se permite que estas tareas se desactiven, a diferencia de las interrupciones (que no deben invocar al programador)