Академический Документы
Профессиональный Документы
Культура Документы
Llamadas al Sistema
Juan Carlos Perez y Sergio Saez
Table of Contents
Tema 4. Llamadas al Sistema............................................................................................................................1
4.1 Introduccin.......................................................................................................................................1
4.2 Estructura de un proceso en Linux.....................................................................................................1
4.3 Interfaz con el sistema operativo.......................................................................................................2
4.3.1 Interfaz ofrecida por el ncleo...........................................................................................2
4.3.2 Interfaz ofrecida al programador (API).............................................................................3
4.4 Ejemplo de invocacin.......................................................................................................................4
4.5 Biblioteca de llamadas al sistema......................................................................................................5
4.5.1 La biblioteca de llamadas glibc.........................................................................................6
4.5.2 Cdigo de retorno..............................................................................................................7
4.6 Entrando en el ncleo.........................................................................................................................7
4.6.1 Dentro de system_call........................................................................................................8
4.6.2 Recogida de parmetros.....................................................................................................9
4.7 Ejecucin de la llamada al sistema....................................................................................................9
4.8 Saliendo del ncleo: ret_from_syscall.............................................................................................10
4.9 Resumen...........................................................................................................................................10
jcperez@disca.upv.es
ssaez@disca.upv.es
4.1 Introduccin
Estudio detallado del mecanismo mediante el cual Linux implementa las llamadas al sistema en una
arquitectura i386.
Un sistema operativo est definido por los servicios que ofrece en relacin con el acceso a
entrada/salida, procesos, manejo de memoria, envio de seales, tiempo, etc.
A los servicios del S.O. se accede a travs de las llamadas al sistema: open, read, fork,
mmap, kill, time, etc.
La llamada al sistema la invoca un proceso de usuario (o mejor dicho un proceso en modo usuario) y
es servida por el ncleo.
Una llamada al sistema implica pasar o saltar del cdigo del usuario al cdigo del ncleo. Este
salto conlleva un cambio en el modo del funcionamiento del procesador. El procesador debe pasar de
modo usuario (acceso restringido a los recursos) a modo supervisor o privilegiado (recordemos que
no tiene nada que ver con el superusario root).
arg
arg
arg
arg
arg
1
2
3
4
5
VALORES DE SALIDA
En el registro eax se devuelve el cdigo de retorno.
KILL(2)
NAME
kill send signal to a process
SYNOPSIS
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
DESCRIPTION
The kill system call can be used to send any signal to any pro
cess group or process.
If pid is positive, then signal sig is sent to pid.
If pid equals 0, then sig is sent to every process in the process
group of the current process.
If pid equals 1, then sig is sent to every process except for
process 1 (init), but see below.
If pid is less than 1, then sig is sent to every process in
process group pid.
the
On
error,
is
returned,
and
ERRORS
EINVAL An invalid signal was specified.
ESRCH
EPERM
En la figura se muestra la utilizacin del espacio de direcciones por parte de un proceso de usuario.
El cdigo del usuario puede utilizar las direcciones lgicas desde 0 a 3GB y el ncleo desde 3GB a
4GB.
con la opcin x en lugar de t se puede extraer un fichero de la biblioteca. Para extraer el fichero
kill.o, que contiene la llamada al sistema kill(2) la orden sera:
# ar x /usr/lib/libc.a kill.o
Con la utilidad objdump(1) se puede desensamblar cualquier cdigo objeto o ejecutable. El
siguiente fragmento de cdigo representa la llamada al sistema kill.
# objdump d kill.o
kill.o:
mov
mov
mov
%ebx,%edx
0x8(%esp,1),%ecx
0x4(%esp,1),%ebx
b8
cd
89
3d
0f
c3
25 00 00 00
80
d3
01 f0 ff ff
83 fc ff ff ff
mov
int
mov
cmp
jae
ret
$0x25,%eax
$0x80
%edx,%ebx
$0xfffff001,%eax
1a <__kill+0x1a>
Con la utilidad strace(1) se puede ver cmo los programas hacen uso de las llamadas al sistema.
Acepta como parmetro el nombre de un ejecutable y lo ejecuta volcando en la salida estndar de
error todas las llamadas al sistema que ste realiza con sus respectivos parmetros.
# strace ls
execve("/bin/ls", ["ls"], %[/* 34 vars */]) = 0
uname({sys="Linux", node="viver", ...}) = 0
brk(0)
= 0x8053448
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
1, 0) = 0x40017000
...
open("/lib/i586/libc.so.6", O_RDONLY)
= 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\264\313"...,
1024) = 1024
...
open(".", O_RDONLY|O_NONBLOCK|0x10000) = 3
...
write(1, "11introduccion\t\t21arranque\t."..., 81) = 81
...
_exit(0)
b8 25 00 00 00
cd 80
mov
int
$0x25,%eax
$0x80
4.9 Resumen
1. La biblioteca mete en los registros del procesador los parmetros de la llamada.
2. Se produce la interrupcin software (trap) 0x80. El descriptor de interrupcin. 0x80 apunta a la
rutina system_call.
3. Se guardan el registro %eax. El resto de los registros con SAVE_ALL.
4. Se verifica que el nmero de llamada al sistema corresponde con una llamada vlida.
5. Se salta a la funcin que implementa el servicio pedido:
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
6. Si mientras se atenda la llamada al sistema se ha producido algn evento que requiera llamar al
planificador, se llama en este punto.
7. Si el proceso al que se va a retornar tiene seales pendientes, se le envan ahora.
8. Se restauran los valores de los registros con RESTORE_ALL y se vuelve de la interrupcin software.
4.8 Saliendo del ncleo: ret_from_syscall
10
11