Sistemas operativos modernos

to construía un kernel que contenía controladores para los dispositivos de E/S, y ya. Si el año si­ guiente compraba un nuevo disco, volvía a enlazar el kernel. Nada del otro mundo. Con la llegada de Linux en la plataforma de PC, todo eso cambió de repente. El número de dispositivos de E/S con que cuentan las PCs es órdenes de magnitud mayor que en cualquier minicomputadora. Además, aunque todos los usuarios de Linux tienen (o pueden obtener con facilidad) el código fuente completo, lo más probable es que la mayoría de ellos tendría consi­ derables dificultades para añadir un controlador, actualizar cdevsw o bdevsw, volver a enlazar el kemel y luego instalarlo como el sistema arrancable (para no mencionar las secuelas de la construcción de un kemel que no quiere arrancar). Linux resolvió este problema con el concepto de módulos cargables. Éstos son fragmen­ tos de código que pueden cargarse en el kemel mientras se está ejecutando el sistema. Por lo regular, tales módulos son controladores de dispositivos de caracteres o de bloques, pero tam­ bién pueden ser sistemas de archivos enteros, protocolos de red, herramientas para supervisar el desempeño, o cualquier otra cosa que se desee. Cuando se carga un módulo, deben suceder varias cosas. Primera, el módulo debe reubi- carse sobre la marcha, durante la carga. Segunda, el sistema debe verificar si están disponibles los recursos que el controlador necesita (por ejemplo, niveles de solicitud de interrupción) y, en tal caso, marcarlos como en uso. Tercera, habrá que preparar los vectores de interrupción que vayan a necesitarse. Cuarta, hay que actualizar la tabla de conmutación de controladores apropiada para manejar el nuevo fipo de disposifivo principal. Por úlfimo, se permite que el controlador se ejecute para que realice cualquier iniciación específica del dispositivo que ne­ cesite. Una vez terminados todos estos pasos, el controlador estará cabalmente instalado, igual que cualquier controlador instalado en forma estática. En la actualidad, algunos sistemas UNIX modernos también manejan módulos cargables. 10.5.4 Flujos Puesto que los archivos especiales de caracteres manejan flujos de caracteres y no transfieren bloques de información entre la memoria y el disco, no utilizan el caché de búfer. En vez de ello, en las primeras versiones de UNIX cada controlador de dispositivo de caracteres efectua­ ba todo el trabajo necesario para su dispositivo. Sin embargo, con el paso del tiempo, se hizo evidente que muchos controladores tenían código que también estaba presente en otros contro­ ladores, como el código para uso de búferes, control de flujo y protocolos de red. Se desarrolla­ ron dos soluciones distintas para estructurar y modularizar los controladores de caracteres. A continuación las examinaremos en forma breve. La solución de BSD se basa en estructuras de datos presentes en los sistemas UNIX clási­ cos, llamadas listas C, que se muestran como cuadritos pequeños en la figura 10-22. Cada una es un bloque de hasta 64 caracteres, más una cuenta y un apuntador al siguiente bloque. A me­ dida que llegan caracteres de las terminales y otros dispositivos de caracteres, se colocan de manera temporal en una cadena de estos bloques. Cuando un proceso de usuario lee de /dev/tty (por ejemplo, la entrada estándar), los carac­ teres no se pasan de manera directa de la lista C al proceso. En vez de eso, pasan por un frag­ mento de código del kemel llamado disciplina de líneas, que actúa como filtro aceptando el

RkJQdWJsaXNoZXIy MjI4NDcx