stringtranslate.com

llamada al sistema

Una descripción general de alto nivel de la interfaz de llamadas al sistema del kernel de Linux, que maneja la comunicación entre sus diversos componentes y el espacio de usuario.

En informática, una llamada al sistema (comúnmente abreviada como syscall ) es la forma programática en la que un programa de computadora solicita un servicio del sistema operativo [a] en el que se ejecuta. Esto puede incluir servicios relacionados con el hardware (por ejemplo, acceder a una unidad de disco duro o acceder a la cámara del dispositivo), creación y ejecución de nuevos procesos y comunicación con servicios integrales del kernel , como la programación de procesos . Las llamadas al sistema proporcionan una interfaz esencial entre un proceso y el sistema operativo.

En la mayoría de los sistemas, las llamadas al sistema sólo se pueden realizar desde procesos del espacio de usuario , mientras que en algunos sistemas, OS/360 y sus sucesores, por ejemplo, el código del sistema privilegiado también emite llamadas al sistema. [1]

Para los sistemas integrados , las llamadas al sistema normalmente no cambian el modo de privilegio de la CPU.

Privilegios

La arquitectura de la mayoría de los procesadores modernos, a excepción de algunos sistemas integrados, implica un modelo de seguridad . Por ejemplo, el modelo de anillos especifica múltiples niveles de privilegio bajo los cuales se puede ejecutar el software: un programa generalmente está limitado a su propio espacio de direcciones para que no pueda acceder ni modificar otros programas en ejecución o el propio sistema operativo, y generalmente se le impide manipularlo directamente. dispositivos de hardware (por ejemplo, el frame buffer o dispositivos de red ).

Sin embargo, muchas aplicaciones necesitan acceso a estos componentes, por lo que el sistema operativo pone a disposición las llamadas al sistema para proporcionar implementaciones seguras y bien definidas para dichas operaciones. El sistema operativo se ejecuta con el nivel más alto de privilegios y permite que las aplicaciones soliciten servicios mediante llamadas al sistema, que a menudo se inician mediante interrupciones . Una interrupción coloca automáticamente a la CPU en algún nivel de privilegio elevado y luego pasa el control al kernel, que determina si al programa que llama se le debe otorgar el servicio solicitado. Si se concede el servicio, el núcleo ejecuta un conjunto específico de instrucciones sobre las cuales el programa que llama no tiene control directo, devuelve el nivel de privilegio al del programa que llama y luego devuelve el control al programa que llama.

La biblioteca como intermediaria

Generalmente, los sistemas proporcionan una biblioteca o API que se encuentra entre los programas normales y el sistema operativo. En sistemas tipo Unix , esa API suele ser parte de una implementación de la biblioteca C (libc), como glibc , que proporciona funciones contenedoras para las llamadas al sistema, a menudo con el mismo nombre que las llamadas al sistema que invocan. En Windows NT , esa API es parte de la API nativa , en la biblioteca ntdll.dll ; Esta es una API no documentada utilizada por implementaciones de la API normal de Windows y utilizada directamente por algunos programas del sistema en Windows. Las funciones contenedoras de la biblioteca exponen una convención de llamada a función ordinaria (una llamada a subrutina en el nivel de ensamblador ) para usar la llamada al sistema, además de hacer que la llamada al sistema sea más modular . Aquí, la función principal del contenedor es colocar todos los argumentos que se pasarán a la llamada del sistema en los registros apropiados del procesador (y tal vez también en la pila de llamadas ), y también establecer un número de llamada del sistema único para que el kernel llame. . De esta forma, la biblioteca que existe entre el sistema operativo y la aplicación aumenta la portabilidad .

La llamada a la función de la biblioteca en sí no provoca un cambio al modo kernel y suele ser una llamada de subrutina normal (utilizando, por ejemplo, una instrucción ensambladora "CALL" en algunas arquitecturas de conjunto de instrucciones (ISA)). La llamada al sistema real transfiere el control al kernel (y depende más de la implementación y de la plataforma que la llamada a la biblioteca que lo abstrae). Por ejemplo, en sistemas tipo Unix , forky execveson funciones de la biblioteca C que a su vez ejecutan instrucciones que invocan las llamadas al sistema forky exec. Realizar la llamada al sistema directamente en el código de la aplicación es más complicado y puede requerir el uso de código ensamblador incorporado (en C y C++ ), además de requerir conocimiento de la interfaz binaria de bajo nivel para la operación de la llamada al sistema, que puede estar sujeto cambiar con el tiempo y por lo tanto no ser parte de la interfaz binaria de la aplicación ; las funciones de la biblioteca están destinadas a abstraer esto.

En los sistemas basados ​​en exokernel , la biblioteca es especialmente importante como intermediaria. En los exokernels, las bibliotecas protegen las aplicaciones de usuario de la API del kernel de muy bajo nivel y proporcionan abstracciones y gestión de recursos .

OS/360 , DOS/360 y TSS/360 de IBM implementan la mayoría de las llamadas al sistema a través de una biblioteca de macros en lenguaje ensamblador , [b] aunque hay algunos servicios con un enlace de llamadas. Esto refleja su origen en una época en la que la programación en lenguaje ensamblador era más común que el uso de lenguajes de alto nivel . Por lo tanto, las llamadas al sistema IBM no eran ejecutables directamente mediante programas de lenguaje de alto nivel, sino que requerían una subrutina contenedora en lenguaje ensamblador invocable. Desde entonces, IBM ha agregado muchos servicios a los que se puede llamar desde lenguajes de alto nivel, por ejemplo, z/OS y ​​z/VSE . En la versión más reciente de MVS/SP y en todas las versiones posteriores de MVS, algunas macros de llamadas al sistema generan llamadas de programa (PC).

Ejemplos y herramientas

En Unix , sistemas operativos similares a Unix y otros sistemas operativos compatibles con POSIX , las llamadas al sistema populares son open, read, write, close, wait, exec, fork, exity kill. Muchos sistemas operativos modernos tienen cientos de llamadas al sistema. Por ejemplo, Linux y OpenBSD tienen cada uno más de 300 llamadas diferentes, [2] [3] NetBSD tiene cerca de 500, [4] FreeBSD tiene más de 500, [5] Windows tiene cerca de 2000, divididos entre win32k (gráfico) y ntdll llamadas al sistema (central) [6] mientras que el Plan 9 tiene 51. [7]

Herramientas como strace , ftrace y truss permiten que un proceso se ejecute desde el inicio e informan todas las llamadas al sistema que invoca el proceso, o pueden conectarse a un proceso que ya se está ejecutando e interceptar cualquier llamada al sistema realizada por dicho proceso si la operación no viola los permisos. del usuario. Esta capacidad especial del programa normalmente también se implementa con llamadas al sistema como ptrace o llamadas al sistema en archivos en procfs .

Implementaciones típicas

La implementación de llamadas al sistema requiere una transferencia de control del espacio del usuario al espacio del kernel, lo que implica algún tipo de característica específica de la arquitectura. Una forma típica de implementar esto es utilizar una interrupción o trampa de software . Las interrupciones transfieren el control al kernel del sistema operativo , por lo que el software simplemente necesita configurar algún registro con el número de llamada del sistema necesario y ejecutar la interrupción del software.

Esta es la única técnica proporcionada por muchos procesadores RISC , pero las arquitecturas CISC como x86 admiten técnicas adicionales. Por ejemplo, el conjunto de instrucciones x86 contiene las instrucciones SYSCALL/ SYSRETy SYSENTER/ SYSEXIT(estos dos mecanismos fueron creados de forma independiente por AMD e Intel , respectivamente, pero en esencia hacen lo mismo). Estas son instrucciones de transferencia de control "rápidas" que están diseñadas para transferir rápidamente el control al kernel para una llamada al sistema sin la sobrecarga de una interrupción. [8] Linux 2.5 comenzó a usar esto en x86 , donde esté disponible; anteriormente usaba la INTinstrucción, donde el número de llamada del sistema se colocaba en el EAX registro antes de que se ejecutara la interrupción 0x80. [9] [10]

Un mecanismo más antiguo es la puerta de llamada ; utilizado originalmente en Multics y posteriormente, por ejemplo, consulte puerta de llamada en Intel x86 . Permite que un programa llame a una función del kernel directamente utilizando un mecanismo de transferencia de control seguro, que el sistema operativo configura de antemano. Este enfoque ha sido impopular en x86, presumiblemente debido al requisito de una llamada lejana (una llamada a un procedimiento ubicado en un segmento diferente al segmento de código actual [11] ) que utiliza la segmentación de memoria x86 y la resultante falta de portabilidad que causa. y la existencia de las instrucciones más rápidas mencionadas anteriormente.

Para la arquitectura IA-64 , EPCse utiliza la instrucción (Ingresar código privilegiado). Los primeros ocho argumentos de llamada al sistema se pasan en registros y el resto se pasan en la pila.

En la familia de mainframes IBM System/360 y sus sucesores, una instrucción de llamada de supervisor ( SVC ), con el número en la instrucción en lugar de en un registro, implementa una llamada al sistema para instalaciones heredadas en la mayoría de los sistemas operativos propios de IBM . y para todas las llamadas al sistema en Linux. En versiones posteriores de MVS, IBM utiliza la instrucción Program Call (PC) para muchas instalaciones más nuevas. En particular, la PC se utiliza cuando la persona que llama puede estar en modo Bloqueo de solicitud de servicio (SRB).

La minicomputadora PDP-11 utilizó las instrucciones EMT , TRAP e IOT , que, de manera similar a IBM System/360 SVC y x86 INT , pusieron el código en la instrucción; generan interrupciones a direcciones específicas, transfiriendo el control al sistema operativo. El sucesor VAX de 32 bits de la serie PDP-11 utilizó las instrucciones CHMK , CHME y CHMS para realizar llamadas al sistema a código privilegiado en varios niveles; el código es un argumento de la instrucción.

Categorías de llamadas al sistema

Las llamadas al sistema se pueden agrupar aproximadamente en seis categorías principales: [12]

  1. Control de procesos
  2. Gestión de archivos
    • crear archivo, eliminar archivo
    • abierto cerrado
    • leer, escribir, reposicionar
    • obtener/establecer atributos de archivo
  3. Gestión de dispositivos
    • solicitar dispositivo, liberar dispositivo
    • leer, escribir, reposicionar
    • obtener/establecer atributos del dispositivo
    • conectar o desconectar dispositivos lógicamente
  4. Mantenimiento de información
    • obtener/configurar información total del sistema (incluyendo hora, fecha, nombre de la computadora, empresa, etc.)
    • obtener/establecer metadatos de proceso, archivo o dispositivo (incluido el autor, el abridor, la fecha y hora de creación, etc.)
  5. Comunicación
    • crear, eliminar conexión de comunicación
    • enviar, recibir mensajes
    • información del estado de la transferencia
    • conectar o desconectar dispositivos remotos
  6. Proteccion
    • obtener/establecer permisos de archivos

Modo de procesador y cambio de contexto.

Las llamadas al sistema en la mayoría de los sistemas tipo Unix se procesan en modo kernel , lo que se logra cambiando el modo de ejecución del procesador a uno más privilegiado, pero no es necesario ningún cambio de contexto de proceso , aunque sí se produce un cambio de contexto de privilegios . El hardware ve el mundo en términos del modo de ejecución según el registro de estado del procesador , y los procesos son una abstracción proporcionada por el sistema operativo. Una llamada al sistema generalmente no requiere un cambio de contexto a otro proceso; en cambio, se procesa en el contexto de cualquier proceso que lo haya invocado. [13] [14]

En un proceso multiproceso , las llamadas al sistema se pueden realizar desde varios subprocesos . El manejo de dichas llamadas depende del diseño del núcleo del sistema operativo específico y del entorno de ejecución de la aplicación. La siguiente lista muestra los modelos típicos seguidos por sistemas operativos: [15] [16]

Ver también

Notas

  1. ^ En sistemas operativos tipo UNIX , las llamadas al sistema se usan solo para el kernel
  2. ^ En muchos casos, pero no en todos, IBM documentó, por ejemplo, el número SVC y los registros de parámetros.
  3. ^ Los componentes CP de CP-67 y VM utilizan la instrucción Diagnóstico (DIAG) como LLAMADA de hipervisor (HVC) desde una máquina virtual al CP.

Referencias

  1. ^ IBM (marzo de 1967). "Escribir rutinas SVC". Guía del programador del sistema del sistema operativo IBM System/360 (PDF) . Tercera edicion. págs. 32–36. C28-6550-2.
  2. ^ "syscalls(2) - página del manual de Linux".
  3. ^ OpenBSD (14 de septiembre de 2013). "Nombres de llamadas del sistema (kern/syscalls.c)". Referencia cruzada de BSD .
  4. ^ NetBSD (17 de octubre de 2013). "Nombres de llamadas del sistema (kern/syscalls.c)". Referencia cruzada de BSD .
  5. ^ "FreeBSD syscalls.c, la lista de nombres e ID de llamadas al sistema".
  6. ^ Mateusz "j00ru" Jurczyk (5 de noviembre de 2017). "Tabla de llamadas del sistema Windows WIN32K.SYS (NT/2000/XP/2003/Vista/2008/7/8/10)".{{cite web}}: Mantenimiento CS1: nombres numéricos: lista de autores ( enlace )
  7. ^ "Plan 9 sys.h, la lista de nombres e ID de llamadas al sistema".
  8. ^ "SYSENTER (wiki de OSDev)".
  9. ^ Anónimo (19 de diciembre de 2002). "Linux 2.5 obtiene vsyscalls y compatibilidad con sysenter". Trampa del núcleo . Consultado el 1 de enero de 2008 .
  10. ^ Manu Garg (2006). "Mecanismo de llamada al sistema basado en Sysenter en Linux 2.6".
  11. ^ "Liberación: referencia del conjunto de instrucciones x86". renejeschke.de . Consultado el 4 de julio de 2015 .
  12. ^ Silberschatz, Abraham (2018). Conceptos del sistema operativo . Peter B. Galvin; Greg Gagne (10ª ed.). Hoboken, Nueva Jersey: Wiley. pag. 67.ISBN _ 9781119320913. OCLC  1004849022.
  13. ^ Bach, Maurice J. (1986), El diseño del sistema operativo UNIX , Prentice Hall, págs.
  14. ^ Elliot, Juan (2011). "Discusión sobre la implementación de llamadas al sistema en ProgClub, incluida una cita de Bach 1986".
  15. ^ "Hilos".
  16. ^ "Modelos de enhebrado" (PDF) .

enlaces externos