2.2.1. Biblioteca del sistema
Texto íntegro de la conversión. Las figuras y la disposición de las notas se pueden consultar en el PDF.
2.2.1. Biblioteca del sistema
Desde el punto de vista del programador, el mecanismo de entrada al sistema mediante traps tiene un gran problema: no es portable porque depende del lenguaje máquina propio del procesador. Si queremos facilitar que el código fuente de los programas sea fácilmente portable entre arquitecturas diferentes donde esté instalado el mismo sistema operativo, hay que disponer de una forma independiente del hardware para poder realizar las llamadas al sistema operativo. La solución viene dada por la biblioteca del sistema. Las rutinas de esta biblioteca permiten expresar de forma estándar las llamadas al sistema.
Por ejemplo, la figura 2 muestra la interfaz (en lenguaje C) de la llamada al sistema write del sistema operativo Unix.
"ssize_t write(int fd, const void *buf, size_t count);"
Figura 2. Interfaz de la llamada al sistema write del sistema operativo Linux
Página 16
La rutina write de la biblioteca del sistema Unix para la arquitectura IA-32 invoca la llamada al sistema tal como se hace en esta arquitectura (paso de parámetros a través de registros determinados, instrucción de lenguaje máquina int). La figura 3 (arriba) muestra el código ensamblador de esta rutina.
000001cd : 1cd: push %ebp 1ce: mov %esp,%ebp
1d0: push %ebx 1d1: sub $0x4,%esp
1d4: mov $0x4,%eax 1d9: mov 0x8(%ebp),%ebx 1dc: mov 0xc(%ebp),%ecx
1df: mov 0x10(%ebp),%edx 1e2: int $0x80 1e4: mov %eax,0xfffffff8(%ebp)
1e7: cmpl $0xffffff82,0xfffffff8(%ebp) 1eb: jbe 1f4 <write+0x27> 1ed: movl $0xffffffff,0xfffffff8(%ebp)
1f4: mov 0xfffffff8(%ebp),%eax 1f7: add $0x4,%esp 1fa: pop %ebx
1fb: leave 1fc: ret
__write: 0x120009fd0: addq zero, 0x4, v0 0x120009fd4: call_pal callsys
0x120009fd8: beq a3, 0x120009ff0 0x120009fdc: br gp, 0x120009fe0
0x120009fe0: ldah gp, 0(gp) 0x120009fe4: lda gp, 19472(gp) 0x120009fe8: lda at, 26144(gp)
0x120009fec: br zero, 0x120015210 0x120009ff0: ret zero, (ra), 1
Figura 3. Código de la rutina de biblioteca write de Unix en dos arquitecturas: IA-32 (arriba) y Alpha (abajo)
De esta forma, el programador puede invocar la llamada al sistema write como si fuera una rutina cualquiera del lenguaje C. Como el ejecutable se genera sobre la arquitectura IA-32, se utilizará la biblioteca de sistema correspondiente a la arquitectura IA-32.
La figura 3 (abajo) muestra el código ensamblador de la rutina write de la biblioteca del sistema Unix para la arquitectura Alpha. Como el ejecutable se genera sobre esta arquitectura, se utilizará la biblioteca de sistema de la
Página 17
arquitectura Alpha. De esta forma, el programador no necesita conocer cómo se da la llamada al sistema en lenguaje máquina y puede invocarla de una forma portable.
Los otros dos mecanismos (interrupciones y excepciones) no están a disposición directa del usuario.
Ver fragmento extraído sin normalizar
2.2.1. Biblioteca del sistema
Desde el punto de vista del programador, el mecanismo de entrada al sistema
mediante traps tiene un gran problema: no es portable porque depende del
lenguaje máquina propio del procesador. Si queremos facilitar que el código
fuente de los programas sea fácilmente portable entre arquitecturas diferentes
donde esté instalado el mismo sistema operativo, hay que disponer de una
forma independiente del hardware para poder realizar las llamadas al sistema
operativo. La solución viene dada por la biblioteca del sistema. Las rutinas de
esta biblioteca permiten expresar de forma estándar las llamadas al sistema.
Por ejemplo, la figura 2 muestra la interfaz (en lenguaje C) de la llamada al
sistema write del sistema operativo Unix.
"ssize_t write(int fd, const void *buf, size_t count);"
Figura 2. Interfaz de la llamada al sistema write del sistema operativo Linux
## Página 16
<!-- source-page: 16 -->
GNUFDL • PID_00214804 16 El sistema operativo: una máquina virtual
La rutina write de la biblioteca del sistema Unix para la arquitectura IA-32 in-
voca la llamada al sistema tal como se hace en esta arquitectura (paso de pa-
rámetros a través de registros determinados, instrucción de lenguaje máquina
int). La figura 3 (arriba) muestra el código ensamblador de esta rutina.
000001cd <write>:
1cd: push %ebp
1ce: mov %esp,%ebp
1d0: push %ebx
1d1: sub $0x4,%esp
1d4: mov $0x4,%eax
1d9: mov 0x8(%ebp),%ebx
1dc: mov 0xc(%ebp),%ecx
1df: mov 0x10(%ebp),%edx
1e2: int $0x80
1e4: mov %eax,0xfffffff8(%ebp)
1e7: cmpl $0xffffff82,0xfffffff8(%ebp)
1eb: jbe 1f4 <write+0x27>
1ed: movl $0xffffffff,0xfffffff8(%ebp)
1f4: mov 0xfffffff8(%ebp),%eax
1f7: add $0x4,%esp
1fa: pop %ebx
1fb: leave
1fc: ret
__write:
0x120009fd0: addq zero, 0x4, v0
0x120009fd4: call_pal callsys
0x120009fd8: beq a3, 0x120009ff0
0x120009fdc: br gp, 0x120009fe0
0x120009fe0: ldah gp, 0(gp)
0x120009fe4: lda gp, 19472(gp)
0x120009fe8: lda at, 26144(gp)
0x120009fec: br zero, 0x120015210
0x120009ff0: ret zero, (ra), 1
Figura 3. Código de la rutina de biblioteca write de Unix en dos arquitecturas: IA-32 (arriba)
y Alpha (abajo)
De esta forma, el programador puede invocar la llamada al sistema write como
si fuera una rutina cualquiera del lenguaje C. Como el ejecutable se genera
sobre la arquitectura IA-32, se utilizará la biblioteca de sistema correspondiente
a la arquitectura IA-32.
La figura 3 (abajo) muestra el código ensamblador de la rutina write de la
biblioteca del sistema Unix para la arquitectura Alpha. Como el ejecutable
se genera sobre esta arquitectura, se utilizará la biblioteca de sistema de la
## Página 17
<!-- source-page: 17 -->
GNUFDL • PID_00214804 17 El sistema operativo: una máquina virtual
arquitectura Alpha. De esta forma, el programador no necesita conocer cómo
se da la llamada al sistema en lenguaje máquina y puede invocarla de una
forma portable.
Los otros dos mecanismos (interrupciones y excepciones) no están a disposi-
ción directa del usuario.