2.1. Mecanismos directos (traps, excepciones e interrupciones)
Texto íntegro de la conversión. Las figuras y la disposición de las notas se pueden consultar en el PDF.
2.1. Mecanismos directos (traps, excepciones e interrupciones)
Hay tres mecanismos básicos mediante los cuales se puede transferir la ejecución al sistema operativo:
-
Llamadas al sistema operativo (también llamadas system calls o traps): las llamadas al sistema son provocadas por las aplicaciones de usuario cuando piden un servicio al sistema operativo. En un punto concreto del código de usuario se hace una transferencia explícita del control al sistema operativo mediante la ejecución de la instrucción del lenguaje máquina que permite hacerlo (en el caso de los procesadores Intel es la instrucción int). Desde este punto de vista, son acontecimientos síncronos. También pueden recibir el nombre de interrupciones de software. El sistema operativo define cuáles son los parámetros de entrada y de salida de cada llamada al sistema, así como la forma de pasar estos parámetros (por registros o por la pila, entre otros).
-
Interrupciones: las interrupciones son provocadas por los dispositivos del hardware cuando quieren informar de algún cambio de estado (por ejemplo, la pulsación de una tecla o la finalización de una operación de entrada/salida). Normalmente, son éxitos asíncronos ajenos al proceso en ejecución. Típicamente reciben el nombre de interrupciones hardware.
-
Excepciones: las excepciones se producen cuando el hardware detecta algún tipo de anomalía. Por ejemplo, si el procesador está ejecutando la instrucción de lenguaje máquina dividir y el denominador tiene el valor 0, el procesador genera una excepción porque esta operación no está definida. Las excepciones son rupturas de secuencia no previstas; de hecho son interrupciones, pero provocadas directamente por la ejecución del código mismo del usuario en curso.
A pesar de estas diferencias, el tratamiento que reciben estos acontecimientos es muy similar:
- Salvar el estado del proceso de usuario en ejecución: en el momento de producirse el acontecimiento que causa la llamada al sistema / interrupción / excepción, lo más probable es que haya algún proceso de usuario
Página 14
en ejecución. Con el fin de poder ejecutar la rutina de atención del sistema operativo, hay que detener la ejecución de este proceso de usuario. Ahora bien, lo más probable es que, una vez ejecutada esta rutina, haya que reanudar la ejecución del proceso. Para poder hacerlo, hay que salvar el estado del proceso (contenido de los registros del procesador, por ejemplo) y "tomar una foto" del proceso, de forma que más adelante éste pueda continuar su ejecución como si nada hubiera pasado.
-
Determinar qué rutina del sistema operativo tiene que tratar este acontecimiento: existen diversas alternativas para realizar esta determinación. Linux resuelve este problema en tiempo de ejecución (cada vez que se produce un trap/interrupción/excepción) mediante un vector de interrupciones que almacena en cada posición una posición de memoria, que es la posición donde se encuentra el comienzo de la rutina de atención asociada a aquella interrupción. Cada posible excepción e interrupción tiene asociada una posición fija de este vector. Cuando se produce una interrupción o una excepción, el hardware consulta la entrada correspondiente del vector de interrupciones y determina adónde se tiene que transferir el control. El caso de las llamadas al sistema es ligeramente diferente. Como el número de llamadas al sistema ofrecidas por un sistema operativo puede ser muy grande (337 en el caso de la versión 2.6.32 de Linux), se ha optado por un mecanismo híbrido hardware-software. Todas las llamadas al sistema tienen asociada la misma entrada del vector de interrupciones (la 0x80); la rutina de atención en el trap 0x80 es la que determina adónde hay que transferir el control en función de un registro del procesador que contiene el identificador de llamada al sistema que se quiere ejecutar.
-
Ejecutar la rutina de atención: se transfiere el control a la rutina del sistema operativo asociada a este acontecimiento. – En el caso de las llamadas al sistema, esta rutina implementará el servicio pedido por el usuario (por ejemplo, leer del teclado o ejecutar un programa).
– En el caso de las interrupciones, la rutina de atención actúa en consecuencia (por ejemplo, si se ha pulsado una tecla, guarda el carácter leído en una memoria intermedia o, si ha finalizado una lectura de disco, informa al proceso que lo estaba esperando).
– En el caso de las excepciones, la rutina de atención intentará solucionar el problema. A partir de aquí no se puede generalizar, ya que a veces el sistema puede solucionar el problema y a veces no queda más alternativa que abortar la ejecución del proceso.
- Continuar la ejecución de un proceso de usuario: en algunos casos será el mismo que estaba en ejecución antes de producirse el acontecimiento,
Página 15
mientras que en otros casos será otro proceso. Para hacerlo, hay que restaurar el estado (que previamente ha sido salvado) y continuar su ejecución.
Aunque estos mecanismos puedan recordar las rutinas convencionales (hay que salvar el estado, se produce una ruptura de la secuenciación implícita), existen unas diferencias muy importantes:
-
El código de la rutina de atención en los traps/interrupciones/excepciones no forma parte de los ejecutables de usuario, sino que forma parte del núcleo del sistema operativo.
-
La dirección de memoria donde se encuentra el código de la rutina de atención se determina en tiempo de ejecución (en el caso de las rutinas convencionales, la dirección de la rutina es un parámetro de la instrucción de lenguaje máquina que invoca una rutina).
-
Otra diferencia tiene que ver con el modo de ejecución y la veremos más adelante en este módulo. Todas estas rutinas de atención forman parte del núcleo del sistema operativo y tienen acceso completo al hardware; en cambio, las rutinas escritas por el usuario no tendrán acceso a determinadas partes del hardware.
Ver fragmento extraído sin normalizar
2.1. Mecanismos directos (traps, excepciones e interrupciones)
Hay tres mecanismos básicos mediante los cuales se puede transferir la ejecu-
ción al sistema operativo:
• Llamadasalsistemaoperativo (también llamadas system calls o traps): las
llamadas al sistema son provocadas por las aplicaciones de usuario cuando
piden un servicio al sistema operativo. En un punto concreto del código
de usuario se hace una transferencia explícita del control al sistema ope-
rativo mediante la ejecución de la instrucción del lenguaje máquina que
permite hacerlo (en el caso de los procesadores Intel es la instrucción int).
Desde este punto de vista, son acontecimientos síncronos. También pue-
den recibir el nombre de interrupciones de software. El sistema operativo
define cuáles son los parámetros de entrada y de salida de cada llamada al
sistema, así como la forma de pasar estos parámetros (por registros o por
la pila, entre otros).
• Interrupciones: las interrupciones son provocadas por los dispositivos del
hardware cuando quieren informar de algún cambio de estado (por ejem-
plo, la pulsación de una tecla o la finalización de una operación de entra-
da/salida). Normalmente, son éxitos asíncronos ajenos al proceso en eje-
cución. Típicamente reciben el nombre de interrupciones hardware.
• Excepciones: las excepciones se producen cuando el hardware detecta al-
gún tipo de anomalía. Por ejemplo, si el procesador está ejecutando la ins-
trucción de lenguaje máquina dividir y el denominador tiene el valor 0,
el procesador genera una excepción porque esta operación no está defini-
da. Las excepciones son rupturas de secuencia no previstas; de hecho son
interrupciones, pero provocadas directamente por la ejecución del código
mismo del usuario en curso.
A pesar de estas diferencias, el tratamiento que reciben estos acontecimientos
es muy similar:
• Salvarelestadodelprocesodeusuarioenejecución: en el momento de
producirse el acontecimiento que causa la llamada al sistema / interrup-
ción / excepción, lo más probable es que haya algún proceso de usuario
## Página 14
<!-- source-page: 14 -->
GNUFDL • PID_00214804 14 El sistema operativo: una máquina virtual
en ejecución. Con el fin de poder ejecutar la rutina de atención del siste-
ma operativo, hay que detener la ejecución de este proceso de usuario.
Ahora bien, lo más probable es que, una vez ejecutada esta rutina, haya
que reanudar la ejecución del proceso. Para poder hacerlo, hay que salvar
el estado del proceso (contenido de los registros del procesador, por ejem-
plo) y "tomar una foto" del proceso, de forma que más adelante éste pueda
continuar su ejecución como si nada hubiera pasado.
• Determinarquérutinadelsistemaoperativotienequetrataresteacon-
tecimiento: existen diversas alternativas para realizar esta determinación.
Linux resuelve este problema en tiempo de ejecución (cada vez que se pro-
duce un trap/interrupción/excepción) mediante un vector de interrupcio-
nes que almacena en cada posición una posición de memoria, que es la
posición donde se encuentra el comienzo de la rutina de atención asocia-
da a aquella interrupción.
Cada posible excepción e interrupción tiene asociada una posición fija
de este vector. Cuando se produce una interrupción o una excepción, el
hardware consulta la entrada correspondiente del vector de interrupciones
y determina adónde se tiene que transferir el control.
El caso de las llamadas al sistema es ligeramente diferente. Como el núme-
ro de llamadas al sistema ofrecidas por un sistema operativo puede ser muy
grande (337 en el caso de la versión 2.6.32 de Linux), se ha optado por
un mecanismo híbrido hardware-software. Todas las llamadas al sistema
tienen asociada la misma entrada del vector de interrupciones (la 0x80);
la rutina de atención en el trap 0x80 es la que determina adónde hay que
transferir el control en función de un registro del procesador que contiene
el identificador de llamada al sistema que se quiere ejecutar.
• Ejecutarlarutinadeatención: se transfiere el control a la rutina del sis-
tema operativo asociada a este acontecimiento.
– En el caso de las llamadas al sistema, esta rutina implementará el ser-
vicio pedido por el usuario (por ejemplo, leer del teclado o ejecutar
un programa).
– En el caso de las interrupciones, la rutina de atención actúa en con-
secuencia (por ejemplo, si se ha pulsado una tecla, guarda el carácter
leído en una memoria intermedia o, si ha finalizado una lectura de
disco, informa al proceso que lo estaba esperando).
– En el caso de las excepciones, la rutina de atención intentará solucio-
nar el problema. A partir de aquí no se puede generalizar, ya que a
veces el sistema puede solucionar el problema y a veces no queda más
alternativa que abortar la ejecución del proceso.
• Continuarlaejecucióndeunprocesodeusuario: en algunos casos será
el mismo que estaba en ejecución antes de producirse el acontecimiento,
## Página 15
<!-- source-page: 15 -->
GNUFDL • PID_00214804 15 El sistema operativo: una máquina virtual
mientras que en otros casos será otro proceso. Para hacerlo, hay que restau-
rar el estado (que previamente ha sido salvado) y continuar su ejecución.
Aunque estos mecanismos puedan recordar las rutinas convencionales (hay
que salvar el estado, se produce una ruptura de la secuenciación implícita),
existen unas diferencias muy importantes:
• El código de la rutina de atención en los traps/interrupciones/excepciones
no forma parte de los ejecutables de usuario, sino que forma parte del
núcleo del sistema operativo.
• La dirección de memoria donde se encuentra el código de la rutina de
atención se determina en tiempo de ejecución (en el caso de las rutinas
convencionales, la dirección de la rutina es un parámetro de la instrucción
de lenguaje máquina que invoca una rutina).
• Otra diferencia tiene que ver con el modo de ejecución y la veremos más
adelante en este módulo. Todas estas rutinas de atención forman parte del
núcleo del sistema operativo y tienen acceso completo al hardware; en
cambio, las rutinas escritas por el usuario no tendrán acceso a determina-
das partes del hardware.