LLAMADAS AL SISTEMA SISTEMAS OPERATIVOS 26/05/2013 Ing. Eduardo Cruz Romero [email protected] [email protected] Ing. Eduardo Cruz Romero www.cilred.com LLAMADAS AL SISTEMA Las llamadas al sistema proporcionan la interfaz entre un proceso y el sistema operativo, estas llamadas están disponibles como instrucciones en lenguaje ensamblador, y comúnmente se incluyen en los manuales empleados por los programadores de estos lenguajes, ciertos sistemas permiten que las llamadas al sistema se haga directamente desde un programa en lenguaje de alto nivel, en cuyo caso se asemejan a llamadas a subrutinas o a funciones predefinidas, pueden generar una llamada a una rutina especial en tiempo de ejecución, la cual hace la llamada al sistema, o este producirse directo en línea. Las llamadas al sistema se puede agrupar de manera general en cinco categorías principales: control de procesos, manipulación de archivos, manipulación de dispositivos, mantenimiento información y comunicación. Control de procesos: Terminar, abortar Cargar, ejecutar Crear proceso, terminar proceso Obtener atributos del proceso, establecer atributos del proceso Esperar tiempo Esperar evento, señalar evento Asignar y liberar memoria Administración de archivos: Crear archivos, borrar archivo Abrir, cerrar Leer, escribir, reposicionar Obtener atributos de archivo, establecer atributos de archivo + Documentos libres para descargar http://www.cilred.com/documentos www.cilred.com Ing. Eduardo Cruz Romero Administración de dispositivos: Solicitar dispositivos, liberar dispositivo Leer, escribir, reposicionar Obtener atributos de dispositivo, establecer atributos de dispositivos Conectar o desconectar dispositivo lógicamente Mantenimiento de información: Obtener hora o fecha, establecer hora o fecha Obtener datos del sistema, establecer datos del sistema Obtener atributos de proceso, archivos o dispositivo Establecer atributos de proceso, archivo o dispositivos Comunicaciones: Crear, borrar conexión de comunicación Enviar, recibir mensajes Transferir información de estado Conectar o desconectar dispositivos remotos ¿Qué es una llamada al sistema? Una llamada al sistema es cualquier método que sirva para invocar un proceso para solicitar cierto servicio al sistema operativo. Entre ellos tenemos los más comunes: 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. + Documentos libres para descargar http://www.cilred.com/documentos www.cilred.com Ing. Eduardo Cruz Romero Open: que es usada para obtener un descriptor de un fichero del sistema, ese fichero suele pasarse a write. ¿Quiénes pueden realizar una llamada al sistema? Todos, ya que todos los sistemas operativos proporcionan métodos o funciones que los programas pueden emplear para acceder a dichos recursos. Llamadas al sistema en Windows En el mundo Windows en general, las llamadas al sistema se denominan API (Windows application programming interface), es un conjunto de funciones residentes en bibliotecas (generalmente dinámicas, también llamadas DLL por sus siglas en inglés, término usado para referirse a éstas en Windows) que permiten que una aplicación corra bajo un determinado sistema operativo. Por ejemplo, Windows proporciona una función denominada FlashWindowEx que permite que la barra de título de una aplicación alterne entre un sombreado claro y otro oscuro. Las funciones API se dividen en varias categorías: Depuración y manejo de errores E/S de dispositivos Varias DLL, procesos e hilos Comunicación entre procesos Manejo de la memoria Monitoreo del desempeño Manejo de energía Almacenamiento Información del sistema GDI (interfaz para dispositivos gráficos) de Windows (tales como impresoras) Interfaz de usuario de Windows + Documentos libres para descargar http://www.cilred.com/documentos www.cilred.com Ing. Eduardo Cruz Romero La ventaja de utilizar las API de Windows en el código es que pueden ahorrar tiempo porque contienen numerosas funciones útiles ya escritas y listas para utilizar. La desventaja es que puede resultar difícil trabajar con las API de Windows y pueden ser implacables cuando las cosas van mal. Llamadas al sistema en GNU/Linux Una llamada al sistema está implementada en el núcleo de Linux. Cuando un programa llama a una función del sistema, los argumentos son empaquetados y manejados por el núcleo, el cual toma el control de la ejecución hasta que la llamada se completa. Una llamada al sistema no es una llamada a una función ordinaria, y se requiere un procedimiento especial para transferir el control al núcleo. Sin embargo la librería GNU C encapsula las llamadas al sistema con funciones de manera que pueden ser llamadas de manera sencilla y se confunden con llamadas a funciones ordinarias. Las funciones de entrada/salida como open y read son ejemplos de llamadas al sistema en Linux. Linux tiene más de 300 diferentes llamadas al sistema. Un listado de las llamadas al sistema de tu versión del kernel de linux se puede encontrar en /usr/include/asm/unistd.h actualmente este fichero incluye a otros dos uno para arquitecturas de 32 bits y otro para arquitecturas de 64 bits (unistd_32.h y unistd_64.h respectivamente) Tutorial: llamar a las API de Windows http://msdn.microsoft.com/es-es/library/172wfck9(v=vs.80).aspx Llamadas admitidas al sistema http://technet.microsoft.com/es-es/library/cc754234.aspx + Documentos libres para descargar http://www.cilred.com/documentos Ing. Eduardo Cruz Romero www.cilred.com El dispatcher El dispatcher, que forma parte del SO, se ejecuta cuando se invoca una llamada al sistema. Cuando un proceso hace una llamada al sistema, el dispatcher, se encarga de invocar la llamada que el proceso ha solicitado. Tiene un comportamiento sincronizado, cuando recibe una llamada y se la pasa al sistema operativo hasta que no recibe respuesta no atiende otra llamada. En el caso de x86, el dispatcher consulta el registro eax e invoca a la llamada al sistema identificada con dicha numeración. Ejemplos de llamadas al sistema: C: #include <string.h> #include <fcntl.h> #include <stdlib.h> /* Función strlen() */ /* Modos de apertura y función open()*/ /* Funciones write() y close() */ main ( int argc, char* argv[] ) { /* Cadena que se va a escribir */ const char* cadena = "Hola, mundo"; /* Creación y apertura del fichero */ int fichero = open ("mi_fichero", O_CREAT|O_WRONLY,0644); /* Comprobación de errores */ if (fichero==-1) { perror("Error al abrir fichero:"); exit(1); } /* Escritura de la cadena */ write(fichero, cadena, strlen(cadena)); close(fichero); return 0; } Java: /* * PruebaRuntime.java * * Created on 17 de abril de 2005, 15:43 */ package chuidiang.ejemplos.runtime; import java.io.*; /** * Ejemplo simple de arranque de un programa externo desde java. * @author Chuidiang + Documentos libres para descargar http://www.cilred.com/documentos www.cilred.com Ing. Eduardo Cruz Romero */ public class PruebaRuntime { /** Creates a new instance of PruebaRuntime */ public PruebaRuntime() { try { // Se lanza el ejecutable. Process p=Runtime.getRuntime().exec ("cmd /c dir"); // Se obtiene el stream de salida del programa InputStream is = p.getInputStream(); /* Se prepara un bufferedReader para poder leer la salida más comodamente. */ BufferedReader br = new BufferedReader (new InputStreamReader (is)); // Se lee la primera linea String aux = br.readLine(); // Mientras se haya leido alguna linea while (aux!=null) { // Se escribe la linea en pantalla System.out.println (aux); // y se lee la siguiente. aux = br.readLine(); } } catch (Exception e) { // Excepciones si hay algún problema al arrancar el ejecutable o al leer su salida.*/ e.printStackTrace(); } } /** * Crea la clase principal que ejecuta el comando dir y escribe en pantalla * lo que devuelve dicho comando. * * @param args the command line arguments */ public static void main(String[] args) { new PruebaRuntime(); } } + Documentos libres para descargar http://www.cilred.com/documentos www.cilred.com Ing. Eduardo Cruz Romero Visual Basic: Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ' Stores the return value. Dim RetVal As Integer RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", _ MB_ICONQUESTION Or MB_YESNO) ' Check the return value. If RetVal = IDYES Then MsgBox("You chose Yes") Else MsgBox("You chose No") End If End Sub Ensamblador: cr equ 13 lf equ 10 dades SEGMENT PARA PUBLIC 'data' msg1 DB 'Hola Mundo',cr,lf,'$' dades ENDS codi SEGMENT PARA PUBLIC 'code' MAIN PROC FAR ASSUME cs:codi,DS:dades,SS:pila,ES:dades MOV AX,dades MOV DS,AX MOV ES,AX MOV AH,09H LEA DX,msg1 int 21H MOV AX,4C00H int 21h MAIN ENDP codi ENDS pila SEGMENT PARA STACK 'stack' DB 128 DUP(0) pila ends END MAIN PHP: <?php // imprime el nombre de usuario que tiene control del proceso php/httpd activo // (en un sistema con el ejecutable "whoami" disponible en la ruta) echo exec('whoami'); ?> + Documentos libres para descargar http://www.cilred.com/documentos www.cilred.com Ing. Eduardo Cruz Romero Fuentes Originales: http://1984.lsi.us.es/wiki-ssoo/index.php/Llamadas_al_sistema http://systope.blogspot.mx/2012/06/llamadas-al-sistema-en-windows.html http://msdn.microsoft.com/es-es/library/172wfck9(v=vs.80).aspx http://technet.microsoft.com/es-es/library/cc754234.aspx http://www.novanebula.net/blog/archives/117-Llamadas-al-sistema-linux-linux-system-calls.html http://labsopa.dis.ulpgc.es/prog_c/FICHER.HTM http://www.chuidiang.com/java/ejemplos/Runtime/runtime.php http://wiki.inf.utfsm.cl/index.php?title=Tipos_de_llamadas_al_sistema_y_programas_de_sistema http://php.net/manual/es/function.exec.php Fundamentos de sistemas operativos. A. Silberschatz, P.B. Galvin, G. Gagne, McGraw-Hill, 2006. + Documentos libres para descargar http://www.cilred.com/documentos