2009-01-31 17 views
30

Cuando invoco una llamada al sistema en modo de usuario, ¿cómo se procesa la llamada en el sistema operativo?¿Cómo se implementa la llamada al sistema en Linux?

¿Invoca algún binario ejecutable o alguna biblioteca estándar?

En caso afirmativo, ¿qué tipo de cosas necesita para completar la llamada?

Respuesta

2

Ampliamente simplificado, pero lo que sucede es que se produce una interrupción cuando intenta acceder a una dirección de memoria reservada. La interrupción cambia el contexto al modo kernel y ejecuta el código del kernel (llamada al sistema real) en nombre del usuario. Una vez que se completa la llamada, el control se devuelve al código de usuario.

+0

¿Cómo es el código de kernel, ejecutable binario, ensamblado o biblioteca dinámica enlazada? – MainID

+0

El núcleo es el kernel en ejecución en su sistema, es decir, la imagen del sistema operativo en la memoria. – tvanfosson

29

Echa un vistazo a this.

partir de la versión 2.5, Linux kernel introdujo un nuevo mecanismo de entrada de llamada al sistema en los procesadores Pentium II + procesadores. Debido a problemas de rendimiento en los procesadores Pentium IV con método de interrupción de software existente, un mecanismo llamada al sistema alternativo de entrada se llevó a cabo siguiendo las instrucciones SYSENTER/SYSEXIT disponibles en los procesadores Pentium II + procesadores. Este artículo explora este nuevo mecanismo . La discusión está limitada a la arquitectura x86 y todas las listas del código fuente se basan en el núcleo de Linux 2.6.15.6.

  1. ¿Qué son las llamadas al sistema?

    Las llamadas al sistema proporcionan userland procesa una forma de solicitar los servicios del kernel. ¿Qué tipo de servicios ? Los servicios que se administran por sistema operativo como almacenamiento, memoria, red, administración de proceso etc. Por ejemplo, si un proceso de usuario quiere leer un archivo, tendrá que hacer llamadas al sistema 'abrir' y 'leer'. Generalmente, las llamadas al sistema no se llaman por procesos directamente. La biblioteca C proporciona una interfaz para todas las llamadas al sistema .

  2. ¿Qué sucede en una llamada al sistema?

    Un fragmento de código de kernel se ejecuta en solicitud de un proceso de usuario. Este código se ejecuta en el anillo 0 (con el privilegio actual nivel -CPL- 0), que es el nivel más alto de privilegio en la arquitectura x86 . Todos los procesos de usuario ejecutan en el anillo 3 (CPL 3).

    Así, para implementar mecanismo de llamada al sistema, lo que necesitamos es

    1) una manera de llamar anillo 0 Código del anillo 3.

    2) un cierto código del kernel para atender la solicitud.

  3. buena vieja manera de hacer que

    Hasta hace algún tiempo, Linux utiliza para implementar sistema de pide a todos x 86 plataformas utilizando interrupciones de software. Para ejecutar una llamada al sistema, el proceso de usuario copiará el número de llamada del sistema deseado a% eax y ejecutará 'int 0x80'. Esto generará la interrupción 0x80 y una rutina de servicio de interrupción será llamada. Para la interrupción 0x80, esta rutina es una rutina llamada "todo el sistema llama a ". Esta rutina ejecutar en el anillo 0. Esta rutina, como definido en el archivo /usr/src/linux/arch/i386/kernel/entry.S, guardará el estado actual y llamar a base gestor de llamadas sistema apropiado en el valor en% eax.

  4. Nueva forma brillante de hacerlo

    Se encontró que este método de interrupción de software fue mucho más lento en procesadores Pentium IV. Para resolver este problema , Linus implementó un mecanismo de llamada de sistema alternativo al para aprovechar las instrucciones SYSENTER/SYSEXIT proporcionadas por todos los procesadores Pentium II +. Antes de ir más allá con esta nueva forma de hacerlo, vamos a familiarizarnos más con estas instrucciones.

3

pasa por glibc, que emite una interrupción 0x80 después de llenar registros con parámetros. El controlador de interrupciones del kernel busca el syscall en la tabla syscall e invoca la función sys _ *() relevante.

10

Depende de lo que quiera decir con una llamada al sistema. ¿Te refieres a una llamada a la biblioteca C (a través de glibc) o una llamada al sistema real? Las llamadas a la biblioteca C siempre terminan usando llamadas al sistema al final.

La forma antigua de hacer llamadas al sistema era mediante una interrupción de software, es decir, la instrucción int. Windows tenía int 0x2e mientras que Linux tenía int 0x80. El sistema operativo configura un controlador de interrupción para 0x2e o 0x80 en la tabla de descriptores de interrupción (IDT). Este manejador luego realiza la llamada al sistema. Copia los argumentos desde el modo de usuario al modo kernel (esto está controlado por una convención específica del sistema operativo). En Linux, los argumentos se pasan usando ebx, ecx, edx, esi y edi. En Windows, los argumentos se copian de la pila. El manejador luego realiza algún tipo de búsqueda (para encontrar la dirección de la función) y ejecuta la llamada al sistema. Después de que se completa la llamada al sistema, la instrucción iret vuelve al modo de usuario.

La nueva forma es sysenter y sysexit. Estas dos instrucciones básicamente hacen todo el trabajo de registro para usted. El sistema operativo establece las instrucciones a través de los Registros específicos del modelo (MSR). Después de eso, es prácticamente lo mismo que usar int.

+0

"C las llamadas a la biblioteca siempre terminan usando llamadas al sistema al final". - ¿Alguna referencia a eso? –

+0

@MywikiWitwiki No * cualquier * C llamada a la biblioteca, pero las llamadas a 'leer',' escribir', etc. Las únicas razones por las que podrían no, si es que existen, se deben a optimizaciones extremadamente especializadas. Puede suponer que siempre cruzan al modo núcleo, a menos que sea un experto en kernel con ideas innovadoras. –

2

int X en el conjunto se traduce en un número de llamada del sistema n.
El syscall de lectura ex puede tener un número 4.
Al iniciar el sistema, OS crea una tabla de indicadores llamada tabla de descriptores de interrupción (IDT) que tiene una lista de direcciones para llamadas al sistema junto con el privilegio necesario para ejecutarlas.
El Nivel de privilegio actual (CPL) se guarda en uno de los bits del registro CS (técnicamente 2 bits en x86).
Estos son los pasos seguidos por una instrucción int:
• Obtener el enésimo descriptor del IDT, donde n es el argumento de int.
• Compruebe que CPL en% cs es < = DPL, donde DPL es el nivel de privilegio en el descriptor.
• De lo contrario, el usuario no tiene suficiente privilegio para ejecutar esto y dará como resultado la ejecución de una instrucción int 13 (error de protección general), (el usuario no tuvo suficiente privilegio)
• En caso afirmativo, el código de usuario suficiente privilegio para hacer esta llamada al sistema, el contexto de ejecución actual se guarda (registros, etc.), porque ahora cambiamos al modo kernel.
La información incluye registros, banderas porque cuando la llamada del sistema finaliza, queremos continuar la ejecución desde donde nos fuimos. • Los parámetros de la llamada al sistema se guardan en la pila del kernel, porque la llamada al sistema se ejecuta en modo kernel.

VSYSCALL (SISTEMA RÁPIDO DE LLAMADA)
Cada llamada al sistema vez que se ejecuta por el usuario, el sistema operativo guarda el estado actual de la máquina (es decir, el registro, puntero de pila, etc.) y cambia al modo de núcleo para la ejecución . Para algunas llamadas al sistema, no es necesario guardar todo el registro. La llamada al sistema de tiempo de salida ex lee la hora actual y regresa la llamada del sistema. Por lo tanto, algunas llamadas al sistema se implementan a través de lo que se denomina vsyscalls. Aquí, cuando se realiza una llamada al sistema, se ejecuta en el espacio del usuario mismo sin cambiar al kernel. Entonces el tiempo se guarda.
Ver aquí para más detalles sobre vsyscall http://www.trilithium.com/johan/2005/08/linux-gate/
y aquí Anyone can understand how gettimeofday works?

0

Una llamada al sistema se hace de una instrucción de trampa especial, un número de llamada al sistema y los argumentos.

  1. La instrucción especial trampa se utiliza para cambiar de modo de usuario al modo kernel que tiene el privilegio ilimitado.
  2. El número de syscall y los argumentos se pasan por el registro.
Cuestiones relacionadas