INSTITUTO TECNOLOGICO SUPERIOR DE COATZACOALCOS
LENGUAJES DE INTERFAZ
REPORTE 1.5 LLAMADAS A SERVICIO DEL SISTEMA
PROFE. ING. TED ECHEVERRIA DIONISIO
ALUMNOS: KARIM PEREZ SALDIVAR RAFAEL MORALES SANTIAGO JUAN ANTONIO AQUINO MEZA GERARDO LURIA LOPEZ PEDRO ANTONIO HUERVO OROPEZA
GRUPO Y GRADO: 6 “B”
INDICE LLAMADAS AA SERVICIO DEL SISTEMA 1.- INTRODUCIÓN…………………………………………………….3 2.- DESARROLLO…………………………………………………….4 3.- CONCLUSIÓN……………………………………………………..10 4.- BIBLIOGRAFIA……………………………………………………11
Página | 2
INTRODUCCIÓN En esta investigación veremos lo que es una llamada al sistema como sabemos existen varios tipo de llamadas al sistema como: kernel entre otros, como sabemos una llamada al sistema es cuando el CPU le da órdenes al procesador para realizar una actividad para el usuario. También encontraremos conceptos útiles como: El espacio kernel: En este espacio residen todas las subrutinas que forman parte del kernel tales como módulos o drivers y cualquier otra que tenga que ver con la interfaz kernel. El espacio de usuario: En este espacio se encuentran los programas que utiliza el usuario final, tales como shell y cualquiera de los programas que he estado programando de ejemplos en ensamblador.
Página | 3
LLAMADAS AL SISTEMA Una llamada al sistema es cuando un programa llama a un servicio del Kernel del sistema operativo. Generalmente estos servicios se encuentran disponibles como instrucciones de lenguaje ensamblador pero algunas veces también pueden llamarse (sin tener conocimiento de ello) desde lenguajes de alto nivel.
Kernel
o
núcleo
Este se considera el principal componente de los sistemas operativos sirve de interfaz entre aplicaciones y el proceso de los datos de bajo nivel hecho por el hardware del equipo. Entre sus funciones están administrar los recursos del sistema como memoria, uso de CPU por las aplicaciones o acceso a interfaces de entrada y salida del equipo. Ejemplos de esto son:
Exit: Para terminar la ejecución de un programa. Fork: Para crear hilos de ejecución. Time: Para ver la hora actual. Open: Para abrir archivos Close: para cerrar archivos Como puede observarse estas son funciones muy utilizadas en cualquier lenguaje de programación pero sin darnos cuenta estas son administradas por el núcleo del sistema operativo.
Llamadas al sistema en linux Conceptos útiles:
El espacio kernel: En este espacio residen todas las subrutinas que forman parte del kernel tales como módulos o drivers y cualquier otra que tenga que ver con la interfaz kernel.
Página | 4
El espacio de usuario: En este espacio se encuentran los programas que utiliza el usuario final, tales como shell y cualquiera de los programas que he estado programando de ejemplos en ensamblador.
[imagen obtenida de: http://www.rootkitanalytics.com/images/KernelWorking1.png]
Existen diferentes implementaciones en el mundo Linux en los procesadores x86 más antiguos se utilizaban interrupciones para migrar de un espacio de usuario a un espacio Kernel ( lo cuál es un objetivo intermedio de las llamadas al sistema). En Linux en las llamadas al sistema se utiliza el registro "%eax" para identificar la llamada al sistema que se quiere invocar, la cual se especifica en una biblioteca de Ansi C. Para empezar la llamada al sistema se invoca al vector de interrupción de Linux (0x80) que contiene las direcciones de memoria de los controladores de interrupciones. Cuando una llamada al sistema es generada, el sistema operativo salva el estado de ejecución del proceso y empieza la ejecución del controlador de llamadas al sistema en el vector de interrupciones.
Una vez esto el controla de llamadas al sistema provoca la ejecución de la función "system_call", esta función controla todas las llamadas al sistema, y toma como parámetro el valor contenido en el registro %eax para identificar la llamada en especifico. Una vez realizadas una serio de verificaciones se invoca la llamada Página | 5
real al sistema utilizando la funcion "system_call_table" y el indice en "%eax". Una vez que el kernel termina su ejecución invoca ala función "system_call_exit" y se llama a las transiciones de resumen "resume_userspace" nuevamente para regresar al espacio de usuario para regresar a la aplicación del usuario.
[imagen obtenida de. http://www.ibm.com/developerworks/ssa/linux/library/lsystem-calls/figure1.gif]
Por último en la página que esta abajo encontré la lista de llamadas al sistema implementadas en el Kernel de Linux, que utilicé como guía para mi ejemplo de este tema.
Ejemplo de llamada al sistema en ensamblador x86
Parametros En la tabla de llamadas al sistema de linux se puede ver que en a partir de la tercera columna se encabezan nombres de registros y en las celdas tipos de variables. Esto es por que estos registros se utilizan como parámetros para las funciones de llamadas al sistema, el primer parámetro va en el registro "%ebx" el segundo va en "%ecx", el tercero en "%edx" y el cuatro en "%esi", el quinto en "%edi" y el sexto y ultimo en "%ebp". Página | 6
Hilos usando llamadas al sistema Como ejemplo de una llamada al sistema decidí implementar la llamada al sistema numero dos del kernel de linux con el que cuento, esta de lo que se encarga es de partir nuestro proceso en dos y crear una copia exacta del mismo que corre de manera independiente del proceso del cual fue creado. Lo que imprimió en la terminal es lo siguiente:
Como puede observarse cada impresión en la terminal se hace de forma asíncrona entre las dos funciones, ademas de que a pesar de que parece que comparten la misma dirección de memoria como contador, eso no es verdad pues como vemos la misma variable tiene valores diferentes para cada thread , lo cual nos dice que el kernel nos asigna un nuevo stack de memoria exclusivo para el nuevo thread .
Página | 7
Las llamadas al sistema Ya se ha comentado que el sistema operativo es una interfaz que oculta las peculiaridades del hardware. Para ello ofrece una serie de servicios que constituyen una máquina virtual más fácil de usar que el hardware básico. Estos servicios se solicitan mediante llamadas al sistema. La forma en que se realiza una llamada al sistema consiste en colocar una serie de parámetros en un lugar específico (como los registros del procesador), para después ejecutar una instrucción del lenguaje máquina del procesador denominada trap (en castellano, trampa). La ejecución de esta instrucción máquina hace que el hardware guarde el contador de programa y la palabra de estado del procesador (PSW, Processor Status Word) en un lugar seguro de la memoria, cargándose un nuevo contador de programa y una nueva PSW. Este nuevo contador de programa contiene una dirección de memoria donde reside una parte (un programa) del sistema operativo, el cual se encarga de llevar a cabo el servicio solicitado. Cuando el sistema operativo finaliza el servicio, coloca un código de estado en un registro para indicar si hubo éxito o fracaso, y ejecuta una instrucción return from trap, esta instrucción provoca que el hardware restituya el contador de programa y la PSW del programa que realizó la llamada al sistema, prosiguiéndose así su ejecución. Normalmente los lenguajes de alto nivel tienen una (o varias) rutinas de biblioteca por cada llamada al sistema. Dentro de estos procedimientos se aísla el código (normalmente en ensamblador ) correspondiente a la carga de registros con parámetros, a la instrucción trap, y a obtener el código de estado a partir de un registro. La finalidad de estos procedimientos de biblioteca es ocultar los detalles de la llamada al sistema, ofreciendo una interfaz de llamada al procedimiento. Como una llamada al sistema depende del hardware (por ejemplo, del tipo de registros del procesador), la utilización de rutinas de biblioteca hace el código portable. El número y tipo de llamadas al sistema varía de un sistema operativo a otro. Existen, por lo general, llamadas al sistema para ejecutar ficheros que contienen programas, pedir más memoria dinámica para un programa, realizar labores de E/S (como la lectura de un carácter de un terminal), crear un directorio, etc. Ejemplos de rutinas de biblioteca que realizan llamadas al sistema en un entorno del sistema operativo C-UNIX son: read, write, malloc, exec, etc. .
Página | 8
El intérprete de órdenes Cuando un usuario se conecta a un ordenador se inicia un intérprete de órdenes (en entornos UNIX llamados shells). El intérprete de órdenes es un programa que muestra un indicador (prompt) formado por algunos caracteres, que pueden incluir el directorio de trabajo (un posible indicador en MS DOS es C:\>), que indica al usuario que es posible introducir una orden. El usuario escribirá una orden , por ejemplo C:\> copy fich fich2 y pulsará la tecla return. En un entorno UNIX, o MS DOS, la primera palabra es el nombre de un fichero que contiene un programa, siendo el resto de la línea una serie de argumentos, separados por espacios, que toma dicho programa. Una excepción a esto son las órdenes internas, que el intérprete implementa como rutinas suyas, y que no tienen, por tanto, un programa asociado guardado en disco. El intérprete de órdenes realiza entonces una o varias llamadas al sistema para ejecutar dicho programa. Cuando el programa finalice (al realizar una llamada al sistema exit ) el control vuelve al programa que lo lanzó (el intérprete de órdenes), mostrando éste otra vez el indicador, y repitiéndose el ciclo. Así pues, el intérprete de órdenes es un programa que sirve de interfaz entre el sistema operativo y un usuario, utilizándolo este último para ejecutar programas. A diferencia de un programador, un "usuario final" realiza todas las llamadas al sistema indirectamente, a través de las llamadas al sistema de los programas que ejecuta. En muchos sistemas se ha optado por sustituir el intérprete de órdenes por un programa que utiliza ventanas. En estos programas aparecen iconos que el usuario puede seleccionar mediante un ratón. Cuando el usuario selecciona un icono que representa un programa se realizan llamadas al sistema para ejecutar un fichero, asociado al icono, que contiene el programa. Por lo tanto, se sustituye la interfaz del usuario para ejecutar programas, pero la interfaz con el sistema operativo no cambia. Es el momento de hacer una aclaración. Existen una serie de programas muy importantes (como traductores, editores de texto, ensambladores, enlazadores e intérpretes de órdenes) que ayudan al programador a realizar sus programas, y que vienen en el lote con cualquier sistema operativo. Estos programas, que forman parte de los programas de sistema o software de sistemas, utilizan llamadas al sistema , pero no son parte del sistema operativo. El sistema operativo es el código que acepta llamadas al sistema, y realiza un procesamiento para satisfacer dichas llamadas. El sistema operativo es el programa de sistema más importante.
Página | 9
CONCLUCIÓN En esta investigación encontramos lo que es una llamada al sistema como sabemos existen varios tipo de llamadas al sistema como: kernel entre otros, como sabemos una llamada al sistema es cuando el CPU le da órdenes al procesador para realizar una actividad para el usuario. También vimos algunos conceptos útiles como: El espacio kernel: En este espacio residen todas las subrutinas que forman parte del kernel tales como módulos o drivers y cualquier otra que tenga que ver con la interfaz kernel. El espacio de usuario: En este espacio se encuentran los programas que utiliza el usuario final, tales como shell y cualquiera de los programas que he estado programando de ejemplos en ensamblador.
Página | 10
BIBLIOGRAFIA http://maxkalavera.blogspot.mx/2012/05/llamadas-al-sistema.html http://wwwdi.ujaen.es/~lina/TemasSO/INTRODUCCION/3Interfacesconelsistemao perativo.htm
Página | 11