Sistemas operativos modernos

sistema es como efectuar una llamada a un procedimiento especial, sólo que las llamadas al sis­ tema entran en el kernel y las llamadas a procedimientos no. A fin de aclarar mejor el mecanismo de llamadas al sistema, demos un vistazo a la llama­ da read. Como ya dijimos, tiene tres parámetros: el primero especifica el archivo, el segundo apunta al búfer y el tercero indica el número de bytes a leer. Al igual que casi todas las llama­ das al sistema, se invoca desde programas en C llamando a un procedimiento de biblioteca que tiene el mismo nombre que la llamada al sistema: read. Una llamada desde un programa en C podría tener este aspecto: cuenta = read(fd, buffer, nbytes) La llamada al sistema (y el procedimiento de biblioteca) devuelven en cuenta el número de by­ tes que se leyeron en verdad. Normalmente este valor es igual a nbytes, pero podría ser menor si, por ejemplo, se llegó al final del archivo durante la lectura. Si no puede ejecutarse la llamada al sistema, sea por un parámetro no válido o por un error de disco, se asigna -1 a cuenta y el número del error se coloca en una variable global, ermo. Los programas siempre deben verificar los resultados de una llamada al sistema para ver si hu­ bo un error o no. Las llamadas al sistema se ejecutan en una serie de pasos. Para aclarar este concepto, exa­ minemos otra vez la llamada read. Como preparación para invocar el procedimiento de biblio­ teca read, que es el que en realidad emite la llamada al sistema read, el programa invocador mete los parámetros en la pila, como se muestra en los pasos 1-3 de la figura 1-17. Los com­ piladores de C y C++ meten los parámetros en la pila en orden inverso por razones históricas (que tienen que ver con lograr que el primer parámetro de printf, la cadena de formato, quede en el tope de la pila). El primer y tercer parámetros se pasan por valor, pero el segundo pará­ metro se pasa por referencia, lo que significa que se pasa la dirección del búfer (indicada por «fe), no su contenido. Luego viene la llamada al procedimiento de biblioteca propiamente dicha (paso 4). Ésta es la instrucción normal de llamada al sistema que se utiliza para invocar todos los procedimientos. El procedimiento de biblioteca, posiblemente escrito en lenguaje ensamblador, suele colo­ car el número de llamada al sistema en donde el sistema operativo espera hallarlo, p>or ejem­ plo, en un registro (paso 5). Luego ejecuta una instrucción TRAP para cambiar del modo de usuario al modo de kemel e iniciar la ejecución en una dirección fija dentro del kemel (paso 6). El código de kemel iniciado examina el número de llamada al sistema y determina cuál es el manejador de llamadas al sistema correcto, por lo regular utilizando una tabla de apuntado­ res, manejadores de llamadas al sistema indizada por el número de llamada al sistema (paso 7). Luego se ejecuta el manejador de llamadas al sistema (paso 8). Cuando el manejador termina, el control podría devolverse al procedimiento de biblioteca en el espacio de usuario, en la ins­ trucción que sigue a la instrucción TRAP (paso 9). Entonces el procedimiento regresa al pro­ grama de usuario, como lo hacen por lo general las llamadas a procedimientos (paso 10). Por último, el programa de usuario tiene que limpiar la pila, como lo hace después de cual­ quier llamada a procedimiento (paso 11). Suponiendo que la pila crece hacia abajo, como sue­ le hacerlo, el código compilado incrementará el apuntador de la pila exactamente lo suficiente

RkJQdWJsaXNoZXIy MjI4NDcx