Diferencia entre revisiones de «Llamadas al sistema»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
m (2.4.2 El punto de entrada)
(mejoras)
Línea 1: Línea 1:
 
= 2.4. Llamadas al sistema =
 
= 2.4. Llamadas al sistema =
Una llamada al sistema es una petición que hace un proceso al sistema operativo para obtener cualquier tipo de servicio. La interfaz que el sistema operativo presenta a los programas se denomina API, donde constan todas las llamadas al sistema de las que dispone.
 
Cada sistema operativo implementa su propia API (por eso normalmente un programa diseñado para un cierto sistema operativo no funciona en otro sistema operativo diferente).
 
  
Los programas se hacen independientes de la maquina, aunque dependientes del API. Por ello, existen APIs estandarizadas, como [http://es.wikipedia.org/wiki/POSIX POSIX].
+
== Definición ==
  
== 2.4.1. Compatibilidad hacia atrás y hacia delante==
+
Una llamada al sistema es el mecanismo que puede emplear un proceso para solicitar un cierto servicio al sistema operativo. Todo sistema operativo ofrece una conjunto de llamadas al sistema que viene determinado por una cierta API. En el caso de Linux, su version 3.0, ofrece un total de 345 llamadas al sistemas. Toda llamada al sistema se identifica de manera únivoca mediante un valor númerico que debe permanecer el mismo a lo largo de la vida del sistema operativo para evitar que se rompa la compatibilidad hacia atrás.
  
En un sistema operativo bien diseñado, la interfaz de las llamadas al sistema ha de ser estable a lo largo del tiempo, de forma que la modificación de su funcionamiento interno no repercuta en el funcionamiento externo de éstas y así asegurar la compatibilidad hacia atrás ([http://en.wikipedia.org/wiki/Backward_compatibility Backward compatibility]). Además, aquellas llamadas que queden obsoletas o en desuso han de ser conservadas para, de la misma manera, asegurar el funcionamiento de programas antiguos ([http://en.wikipedia.org/wiki/Legacy_system?=Legacy_support Legacy Support]).
+
Algunos ejemplos de llamadas al sistema son las siguientes:
  
En ocasiones los sistemas operativos pueden incluir en su diseño criterios de compatibilidad hacia adelante ([http://en.wikipedia.org/wiki/Forward_compatibility Fordward compatibility]). Un ejemplo de este tipo de sistemas son aquellos capaces de mostrar información detallada al usuario de aquello que no pueden comprender o los sistemas ignorantes, que son aquellos que sólo ejecutan lo que pueden comprender y obvian el resto.
+
* '''time''', que permite obtener la fecha y hora del sistema.
 +
* '''write''', que se emplea para escribir un dato en un cierto dispositivo de salida, tales como una pantalla o un disco magnético.
 +
* '''read''', que es usada para leer de un dispositivo de entrada, tales como un teclado o un disco magnético.
  
== 2.4.2 El punto de entrada ==
+
Cada sistema operativo implementa su propia API, por eso normalmente un programa diseñado para un cierto sistema operativo no funciona en otro sistema operativo diferente. No obstante, existen APIs estandarizadas, como [http://es.wikipedia.org/wiki/POSIX POSIX], que tienden a ser implementadas por los fabricantes de sistemas operativos.
  
Llamamos punto de entrada a la posicion de memoria desde la cual es posible solicitarle servicios al sistema operativo, normalmente hay un único punto de entrada.
+
= Ejemplo de llamada al sistema=
En algunos sistemas operativos el acceso al punto de entrada se realiza mediante llamadas a subprogramas.
 
La direccion de memoria del punto de entrada puede cambiar si se modifica el sistema operativo (lo que invalida a todos los programas ejecutables existentes antes del cambio, que no podran solicitar servicios al no conocer la posicion del punto de entrada).
 
Algunos sistemas operativos evitan este problema utilizando una direccion fija, mientras que otros lo hacen manteniendo una referencia a dicha direccion.
 
  
== Ejemplo de llamada al sistema en lenguaje ensamblador ==
+
El siguiente ejemplo muestra el código en ensamblador de x86 para invocar a la llamada al sistema '''write''' que permite escribir un dato en cualquier dispositivo. En concreto, se va a escribir una cadena por el dispositivo de salida '''pantalla''', que se identifica mediante el descriptor de fichero número 1.
  
 
<source lang="asm">
 
<source lang="asm">
 
 
section .text
 
section .text
 
     global _start
 
     global _start
 
_start:
 
_start:
     mov eax, 4        ;cargamos un 4 en el registro eax para llamar a print
+
     mov eax, 4        ;cargamos el número de la llamada al sistema en el regitro eax
     mov ebx, 1        ;cargamos un 1 para la salida estandar
+
     mov ebx, 1        ;cargamos el descriptor de fichero sobre el que queremos escribir
     mov ecx, string    ;Se guarda el mensaje
+
     mov ecx, string    ;cargamos en ecx la dirección de la cadena a imprimir
     mov edx, lenght    ;El tamaño del mensaje
+
     mov edx, lenght    ;cargamos en edx el tamaño de la cadena a imprimir
     int 80h            ;La llamada al sistema
+
     int 80h            ;se invoca al de
  
 
     mov eax, 1
 
     mov eax, 1
Línea 38: Línea 34:
 
     string: db "Hola Mundo", 0x0A
 
     string: db "Hola Mundo", 0x0A
 
     lenght: equ 13
 
     lenght: equ 13
 +
</source>
 +
 +
La instrucción ''int'' forma parte del conjunto de instrucciones de procesadores x86. Esta instrucción emite una interrupción por software cuyo tratamiento es realizado por una rutina. En el caso de las llamadas al sistema, la rutina que se encarga del tratamiento de la interrupción por software número 80 es el ''dispatcher''.
  
 +
== El ''dispatcher'' ==
  
</source>
+
Se trata de la parte del sistema operativo que se ejecuta cuando se invoca una llamada al sistema. Básicamente, se encarga de invocar a la llamada al sistema correspondiente que el proceso ha solicitado. En el caso de x86, el dispatcher consulta el registro eax e invoca a la llamada al sistema identificada con dicha numeración.

Revisión del 11:44 25 oct 2011

2.4. Llamadas al sistema

Definición

Una llamada al sistema es el mecanismo que puede emplear un proceso para solicitar un cierto servicio al sistema operativo. Todo sistema operativo ofrece una conjunto de llamadas al sistema que viene determinado por una cierta API. En el caso de Linux, su version 3.0, ofrece un total de 345 llamadas al sistemas. Toda llamada al sistema se identifica de manera únivoca mediante un valor númerico que debe permanecer el mismo a lo largo de la vida del sistema operativo para evitar que se rompa la compatibilidad hacia atrás.

Algunos ejemplos de llamadas al sistema son las siguientes:

  • time, que permite obtener la fecha y hora del sistema.
  • write, que se emplea para escribir un dato en un cierto dispositivo de salida, tales como una pantalla o un disco magnético.
  • read, que es usada para leer de un dispositivo de entrada, tales como un teclado o un disco magnético.

Cada sistema operativo implementa su propia API, por eso normalmente un programa diseñado para un cierto sistema operativo no funciona en otro sistema operativo diferente. No obstante, existen APIs estandarizadas, como POSIX, que tienden a ser implementadas por los fabricantes de sistemas operativos.

Ejemplo de llamada al sistema

El siguiente ejemplo muestra el código en ensamblador de x86 para invocar a la llamada al sistema write que permite escribir un dato en cualquier dispositivo. En concreto, se va a escribir una cadena por el dispositivo de salida pantalla, que se identifica mediante el descriptor de fichero número 1.

section .text
    global _start
_start:
    mov eax, 4         ;cargamos el número de la llamada al sistema en el regitro eax
    mov ebx, 1         ;cargamos el descriptor de fichero sobre el que queremos escribir
    mov ecx, string    ;cargamos en ecx la dirección de la cadena a imprimir
    mov edx, lenght    ;cargamos en edx el tamaño de la cadena a imprimir
    int 80h            ;se invoca al de

    mov eax, 1
    mov ebx, 0
    int 80h

section .data
    string: db "Hola Mundo", 0x0A
    lenght: equ 13

La instrucción int forma parte del conjunto de instrucciones de procesadores x86. Esta instrucción emite una interrupción por software cuyo tratamiento es realizado por una rutina. En el caso de las llamadas al sistema, la rutina que se encarga del tratamiento de la interrupción por software número 80 es el dispatcher.

El dispatcher

Se trata de la parte del sistema operativo que se ejecuta cuando se invoca una llamada al sistema. Básicamente, se encarga de invocar a la llamada al sistema correspondiente que el proceso ha solicitado. En el caso de x86, el dispatcher consulta el registro eax e invoca a la llamada al sistema identificada con dicha numeración.