La figura muestra una arquitectura de alto nivel del sistema OS 2200 que identifica los principales componentes de hardware y software. La mayor parte del software de Unisys está incluido en el área de subsistemas y aplicaciones del modelo. Por ejemplo, los administradores de bases de datos son subsistemas y los compiladores son aplicaciones.
Los detalles de la arquitectura del sistema se tratan en el Manual de referencia de programación del procesador de instrucciones 3850 7802 de Unisys. Consulte también la serie UNIVAC 1100/2200 .
La serie 1100 ha utilizado una palabra de 36 bits con caracteres de 6 bits desde 1962. La computación de 36 bits fue impulsada por el deseo de procesar números positivos y negativos de 10 dígitos. Además, los militares necesitaban poder calcular trayectorias precisas, diseñar puentes y realizar otros cálculos científicos y de ingeniería, necesitaban más de 32 bits de precisión. Un número de punto flotante de 32 bits solo proporcionaba alrededor de 6 dígitos de precisión, mientras que un número de 36 bits proporcionaba los 8 dígitos de precisión que se aceptaban como requisito mínimo. Dado que la memoria, el espacio de almacenamiento y los costos impulsaban el sistema, pasar a 64 bits simplemente no era aceptable en general. Estos sistemas usan aritmética de complemento a uno , lo que no era inusual en ese momento. Casi todos los fabricantes de computadoras de la época entregaron sistemas de 36 bits con caracteres de 6 bits, incluidos IBM , DEC , General Electric y Sylvania .
El conjunto de caracteres de 6 bits utilizado por la serie 1100 también es un conjunto exigido por el Departamento de Defensa. Fue definido por el Cuerpo de Señales del Ejército y llamado Fieldata (datos devueltos desde el campo). [1] El 1108 proporcionó un formato de caracteres de 9 bits para admitir ASCII y, más tarde, los conjuntos de 8 bits ISO , pero no se utilizaron ampliamente hasta la década de 1980 nuevamente debido a las limitaciones de espacio.
La arquitectura de la serie 2200 proporciona muchos registros . Los registros base contienen lógicamente una dirección virtual que apunta a una palabra en un código o banco de datos (segmento). Pueden apuntar al comienzo del banco o a cualquier palabra dentro del banco. Los registros de índice son utilizados por instrucciones para modificar el desplazamiento del registro base especificado o supuesto. Se pueden realizar operaciones aritméticas simples (sumar, restar) en todos los registros de índice. Además, los registros de índice constan de una parte de desplazamiento inferior y una parte de incremento superior. Una instrucción puede utilizar el valor de desplazamiento en un registro de índice como parte de una dirección y especificar que el incremento se debe agregar al desplazamiento. Esto permite que se realicen bucles con menos instrucciones, ya que se puede incrementar el índice por el tamaño del paso sin una instrucción separada. Los registros aritméticos permiten el conjunto completo de instrucciones computacionales, incluidas todas las operaciones de punto flotante. Algunas de esas instrucciones funcionan en pares adyacentes de registros para realizar operaciones de doble precisión. No hay restricciones de pares e impares. Se pueden utilizar dos registros cualesquiera como un valor de doble precisión. Cuatro de los registros aritméticos también son registros de índice (los conjuntos se superponen: el registro de índice X12 es el registro aritmético A0). Esto permite que se realice la gama completa de cálculos en índices sin tener que mover los resultados. El resto de los registros, conocidos como registros R, se utilizan como almacenamiento temporal rápido y para ciertas funciones especiales. R1 contiene el recuento de repeticiones para aquellas instrucciones que se pueden repetir (transferencia de bloques, ejecución repetida, etc.). R2 contiene una máscara de bits para algunas instrucciones que realizan una operación lógica bit a bit además de algunas otras funciones (por ejemplo, carga superior enmascarada).
Hay dos conjuntos completos de registros (A, X, R y B). Un conjunto, los registros de usuario, es utilizado por todas las aplicaciones y la mayoría de las partes del sistema operativo. Se guarda y se restaura como parte del estado de la actividad (subproceso). El otro conjunto, los registros Exec, es utilizado por las rutinas de procesamiento de interrupciones y algunas otras partes del sistema operativo que desean evitar tener que guardar y restaurar los registros de usuario. Los registros Exec no son escribibles por las aplicaciones de usuario, aunque algún código de usuario puede leerlos. Como resultado, el Exec está cuidadosamente diseñado para nunca dejar información privada, segura o confidencial en los registros. La interpretación de instrucciones elige el conjunto de registros apropiado para usar en función de un bit en el Registro de estado del procesador. Este bit siempre se establece (se cambia a privilegiado) en una interrupción. Todos los registros también son visibles en el espacio de direcciones, pero la parte Exec está protegida y una referencia por código no privilegiado dará como resultado una interrupción por falla.
La serie 2200 utiliza un espacio de direcciones virtuales segmentado de 36 bits. Más adelante analizaremos la arquitectura de direccionamiento.
La serie 2200 es un sistema de arquitectura CISC . No solo hay una gran cantidad de instrucciones (la cantidad actual es de aproximadamente 245), sino que muchas de ellas tienen variantes de direccionamiento. Algunas de las variantes están codificadas directamente en el formato de instrucción (referencias de palabras parciales) y algunas dependen de la configuración del registro de estado del procesador. Muchas instrucciones también realizan funciones muy complejas, como una que implementa una gran parte del verbo COBOL EDIT.
La figura anterior muestra algunos de los componentes básicos de la arquitectura. "Datos" y "COMUNICACIÓN" son dos de los principales ejemplos de subsistemas de software que se encuentran en un anillo de protección entre el de una aplicación de usuario y el de ejecución. Existen muchos otros subsistemas de este tipo y los usuarios escriben los suyos propios.
Como se mencionó anteriormente, la serie 2200 utiliza una dirección virtual segmentada de 36 bits. La noción original de un espacio segmentado surgió de la primera implementación que enfatizaba la separación de código y datos para el rendimiento y el uso de bancos de código compartidos. Con el paso de los años, esto se amplió para brindar una mayor flexibilidad en los niveles de uso compartido y una protección mucho mayor para la seguridad y la confiabilidad. También se introdujo el acceso controlado a los datos compartidos.
Una dirección virtual consta de tres partes. Los 3 bits de orden superior definen el nivel de compartición. Este es el corazón de todo el esquema de direccionamiento y protección. Cada subproceso tiene ocho tablas de descriptores de bancos (tablas de descriptores de segmentos en la industria) basadas en B16-B23. Las tablas están indexadas por nivel: el nivel 0 se refiere a la tabla de descriptores de bancos (BDT) basada en B16, el nivel 2 a la BDT basada en B18, etc. Las BDT de nivel 0 y nivel 2 son comunes a todos los subprocesos del sistema. Cada ejecución (proceso) tiene su propia BDT de nivel 4, y esa BDT es común a todos los subprocesos de la ejecución. Cada subproceso de usuario tiene su propia BDT de nivel 6 no compartida.
Cada actividad (hilo) en modo extendido siempre tiene seis bancos, segmentos, que son totalmente únicos para ella. Uno es la pila de control de retorno, que contiene información sobre la estructura de llamada, incluidos los cambios de estado y privilegios relevantes para la seguridad. El hilo no puede acceder a ella excepto mediante el uso de las instrucciones CALL, RETURN y similares. Esta es una parte importante del mecanismo de protección y confiabilidad. Las aplicaciones no pueden causar efectos negativos al cambiar las direcciones de retorno o sobrescribir la pila de control de retorno. [2]
Otro banco único es el banco de almacenamiento automático (pila de almacenamiento local de actividad). Los compiladores lo utilizan para guardar las variables locales creadas dentro de un bloque. También se utiliza para guardar todas las listas de parámetros que se pasan en una llamada. Una de las comprobaciones que realiza el sistema operativo, tanto en su propio nombre como cuando se realiza una llamada a un subsistema protegido, es asegurarse de que los operandos se encuentran en la pila local del subproceso y de que el subproceso tiene derecho a acceder a la región de memoria a la que hace referencia cualquier parámetro. Como los parámetros se guardan en el espacio local del subproceso, no hay posibilidad de que algún otro subproceso los cambie durante o después de la validación. Es responsabilidad del procedimiento llamado realizar comprobaciones similares sobre cualquier parámetro secundario que pueda existir en el espacio compartido (es decir, el parámetro principal apunta a una estructura que contiene punteros). Se espera que el procedimiento copie dichos punteros a su propio espacio local antes de validarlos y luego utilice solo ese puntero validado almacenado internamente.
Las actividades pueden crear segmentos adicionales hasta el límite del espacio de direcciones disponible (2 33 palabras = 8 GW o aproximadamente 36 GB). Esta es una forma conveniente para que las aplicaciones multiproceso obtengan grandes cantidades de espacio de memoria sabiendo que es totalmente seguro para los subprocesos y que no están quitando espacio al resto de lo que está disponible para el programa. Cada actividad en un programa tiene su propio espacio independiente, lo que significa que una aplicación con, digamos, 100 actividades puede usar más de 800 GW (>3 TB) de espacio virtual.
Las actividades del modo básico no comienzan con ninguno de estos bancos, ya que los programas del modo básico no conocen el espacio de direcciones virtuales, pero cualquier llamada a subsistemas del modo extendido hará que se creen esos bancos.
OS 2200 no implementa programas exactamente de la misma manera que UNIX , Linux y Windows implementan procesos, pero esa es la analogía más cercana. La diferencia más obvia es que OS 2200 solo permite que se ejecute un solo programa por ejecución (trabajo, sesión) a la vez. Un programa puede tener cientos de subprocesos, pero no puede generar otros programas para que se ejecuten simultáneamente. [ cita requerida ]
Existen varios bancos en el nivel de programa que contienen una mezcla de información de ejecución (trabajo, sesión) e información del programa. Se trata de estructuras de control para el sistema operativo. No tienen acceso o solo tienen acceso de lectura para el programa. Los programas pueden recuperar información de algunas de estas estructuras con fines de depuración o para recuperar elementos como el ID de usuario y el ID de terminal sin la sobrecarga de una llamada al sistema. El programa no puede escribirlos. Contienen elementos como las áreas de guardado del estado del subproceso, los bloques de control de archivos y la información de contabilidad.
El resto de los bancos son utilizados por el programa. Cuando se ejecuta un archivo de objeto de programa, el sistema operativo obtiene la información del banco del archivo y crea bancos según sea necesario y carga el estado inicial del banco desde el archivo. El programa más simple tiene un solo banco que contiene código y datos. Esto se considera muy mal, pero está permitido por compatibilidad con aplicaciones antiguas. Solo se puede crear una aplicación de este tipo con lenguaje ensamblador. Los compiladores estándar crean uno o más bancos de código y uno o más bancos de datos. Normalmente, los bancos de código se marcan como de solo lectura como una ayuda para la depuración y la confiabilidad. No hay problemas de seguridad en ninguno de los dos casos. El programa solo puede afectarse a sí mismo.
Cada programa tiene su propio espacio de direcciones, distinto del resto de programas del sistema. Nada de lo que haga un programa puede cambiar el contenido de la memoria de ningún otro programa. El SO y los subsistemas compartidos están protegidos por otros mecanismos que se analizarán más adelante. Incluso el acceso de lectura a la memoria del SO y del subsistema está prohibido en casi todos los casos desde el código de un programa. Es posible crear un subsistema compartido que, en general, sea legible o incluso escribible por varios programas, pero debe ser instalado explícitamente de esa manera por un administrador de sistema con privilegios. Los programas se crean inicialmente con solo los bancos especificados en el archivo de objeto y con una sola actividad. Pueden usar llamadas del sistema para crear bancos adicionales dentro de su propio nivel de programa y actividades adicionales.
La analogía más cercana a un subsistema compartido es un .dll . Un subsistema es muy parecido a un programa en muchos aspectos, excepto que no tiene ninguna actividad asociada a él. En cambio, otros programas y subsistemas acceden a él normalmente a través de una instrucción CALL. De hecho, un programa es un subsistema más una o más actividades. Cada actividad pertenece a un subsistema "de origen" que es el programa que lo creó. Este concepto de subsistema es importante como una encapsulación de derechos de acceso y privilegios. Dentro de su subsistema de origen, las actividades normalmente comparten derechos de acceso comunes a los bancos de código y datos. Los bancos de código en el subsistema de origen suelen ser de sólo lectura, o incluso de sólo ejecución si no contienen datos constantes, pero todas las actividades tendrán derecho a ejecutarlos. [3]
Los subsistemas también son combinaciones de bancos y pueden contener bancos de datos y de códigos. Todos los subsistemas compartidos globalmente deben ser instalados en el sistema por alguien con los privilegios de administrador adecuados. Los subsistemas también pueden abrir archivos. El administrador de bases de datos es un subsistema que abre todos los archivos de bases de datos para su uso, generalmente con derechos de acceso exclusivos. El sistema operativo adjuntará sus propios bancos a un subsistema para contener las tablas de control de archivos.
El nivel del SO contiene los bancos del Exec. Estos bancos nunca son accesibles directamente ni por programas ni por subsistemas globales. Los puntos de entrada al SO se manejan todos de la misma manera que un subsistema protegido. Las llamadas al SO se hacen siempre a través de "puertas", instrucciones que existen para ese propósito (ER = Executive Request) o a través de interrupciones.
La siguiente parte de la dirección virtual es el BDI o índice de descriptores de banco. El campo Nivel selecciona un registro base de tabla de descriptores de banco en particular (B16-B23). Los registros base B16-B23 son parte del estado de la actividad y son mantenidos por el Exec sin acceso directo por parte de la actividad. Las tablas de descriptores de banco para los niveles de programa y actividad existen dentro de los bancos de nivel de programa que pertenecen al sistema operativo.
El BDI es simplemente un índice en una tabla de descripción de bancos. Cada entrada de la tabla contiene información sobre un banco. Cada una de esas entradas describe hasta 1 MB (256 KW) de espacio de dirección virtual. Cuando se necesita un espacio contiguo mayor, las entradas consecutivas se combinan de manera lógica para crear un banco más grande de hasta un máximo de 230 palabras .
La entrada de la tabla de descriptores de bancos (Bank Descriptor – BD) indica el tamaño del banco (pequeño = hasta 256KW, grande = hasta 16MW, muy grande = hasta 1GW). Un banco pequeño siempre está representado por un solo BD. Los bancos grandes están representados por hasta 64 BD consecutivos y un banco muy grande por hasta 4096 BD. Los bancos grandes y muy grandes no necesitan utilizar los 64 o 4096 BD consecutivos. Solo utilizan tantos como sean necesarios para proporcionar el espacio de dirección virtual requerido. La entrada también contiene límites superiores e inferiores de desplazamientos permitidos dentro del banco. Las direcciones virtuales que están fuera de los límites generan una interrupción por falla. Esto permite que los bancos pequeños, por ejemplo, que contienen un mensaje, tengan solo el espacio virtual reservado para ellos que realmente necesitan y proporciona una comprobación de depuración contra punteros e índices incorrectos.
El BD también contiene un valor de clave y campos de control de acceso. Los campos indican si se concede permiso de lectura, escritura o ejecución al procesador de instrucciones (3 bits). Los permisos de acceso especial (SAP) se aplican solo a las actividades que se ejecutan dentro del subsistema propietario (en realidad, solo aquellas con un valor de clave coincidente). Los permisos de acceso general (GAP) se aplican a todos los demás y, por lo general, son cero (sin acceso). El Exec establece un valor de clave en el estado de cada actividad que puede modificarse mediante transiciones de compuerta e interrupción.
La arquitectura de protección de la serie 2200 utiliza tres elementos de estado de actividad que se reflejan en el estado del hardware: privilegio de procesador (PP), anillo y dominio.
El privilegio de procesador controla la capacidad de ejecutar instrucciones privilegiadas y acceder a registros protegidos y otros estados. El procesador Exec utiliza PP=0 y otorga acceso total a todas las instrucciones y al estado privilegiado. Las actividades de procesador Exec y las actividades de usuario que han utilizado una puerta para acceder a una API de procesador Exec se ejecutan en PP=0.
PP=1 restringe la mayoría de las instrucciones privilegiadas, pero permite la lectura de los relojes diarios y del contenido de algunos de los registros privilegiados. Ninguno de los registros privilegiados contiene información verdaderamente sensible, pero permitir el acceso de lectura general podría fácilmente llevar a errores no detectados en los programas de usuario. Básicamente, en PP=1, las instrucciones que pueden cambiar el entorno de direccionamiento, cambiar los relojes, cambiar el estado de la instrumentación o realizar E/S están todas restringidas. PP=1 rara vez se utiliza.
PP=2 es el modo de usuario normal y es el estado en el que se ejecuta el resto del código. Es una restricción adicional de PP=1.
También existe un PP=3 que restringe aún más las instrucciones que puede ejecutar un programa de usuario, pero actualmente no se utiliza porque muchos programas existentes utilizaban algunas de esas instrucciones. La intención era restringir el acceso a instrucciones que pudieran depender del modelo del sistema.
El mecanismo de dominio es el núcleo del mecanismo de protección. Cada BD (descriptor de banco) tiene un campo de bloqueo que consta de un número de anillo y un número de dominio. También hay un campo de clave en el estado de cada actividad. Si la clave coincide con la cerradura o el anillo de la clave es menor que el anillo de la cerradura, la actividad tiene permiso de acceso especial. De lo contrario, la actividad tiene permiso de acceso general.
Ring permite anular el mecanismo de protección de dominio. Las aplicaciones de usuario se ejecutan en Ring=3. Los subsistemas protegidos se ejecutan en Ring=2. Esto les da acceso a sus propios datos y al mismo tiempo les permite acceder a los parámetros y datos en el espacio del usuario que realiza la llamada. Tenga en cuenta que aún no es posible que un subproceso haga que el subsistema protegido acceda al espacio de otro usuario, ya que solo se utilizan las tablas de descriptores de banco de este subproceso. Ring=0 es utilizado por el SO y le permite acceder a sus propios datos y al mismo tiempo poder acceder a los parámetros que se pasan desde los programas de usuario o los subsistemas protegidos.
Las puertas son otra parte del mecanismo de protección. Una puerta es una estructura de datos que controla las transiciones entre dominios. Una puerta se encuentra en un banco de puertas y el hardware hace cumplir que todas las referencias a las puertas deben ser a direcciones con un desplazamiento adecuado (múltiplo del tamaño de una puerta) dentro de un banco de puertas. Una puerta contiene la dirección de destino, nuevos valores para PP, Ring y Domain, y puede contener un parámetro oculto que se pasará al destino. Los subsistemas protegidos no son directamente accesibles a otros subsistemas. En cambio, un subsistema debe solicitar que se construya una puerta en su banco de puertas para acceder a ese subsistema. Esto permite que el sistema operativo realice cualquier verificación de control de acceso. El sistema de enlace encontrará entonces la dirección de la puerta asociada con un punto de entrada. De hecho, todo el mecanismo suele manejarse de forma transparente dentro del sistema de enlace. El parámetro oculto permite, por ejemplo, que una puerta de E/S de archivo contenga la dirección o el identificador del bloque de control de archivo. Dado que se garantiza que esto es correcto ya que fue creado por el sistema operativo cuando el usuario abrió el archivo, se pueden eliminar muchas comprobaciones de errores de la longitud de la ruta para realizar E/S.
OS 2200 está diseñado para manejar hasta 32 procesadores de instrucciones (o CPU ). A lo largo de los años se ha realizado una gran cantidad de diseño para optimizar este entorno. Por ejemplo, OS 2200 casi no hace uso de secciones críticas en su diseño. Existe una probabilidad demasiado alta de que varios procesadores ejecuten el mismo código. En su lugar, utiliza bloqueos de datos en los datos con la mayor granularidad posible. Generalmente, los bloqueos tratan con una sola instancia de un objeto de datos (por ejemplo, estructura de control de actividad o bloque de control de archivo) y están contenidos dentro de la estructura de datos del objeto. Esto minimiza la probabilidad de conflictos. Cuando se deben establecer más bloqueos globales, como cuando se actualiza una lista de objetos, el bloqueo se establece solo el tiempo que lleva actualizar los enlaces en la lista. Incluso el envío se realiza con bloqueos separados para diferentes niveles de prioridad. Se puede realizar una verificación para un nivel de prioridad vacío sin establecer un bloqueo. El bloqueo solo debe establecerse al agregar o eliminar un elemento de la cola.
El conjunto de registros se encuentra en el espacio de direcciones visible. Los registros parecen existir en las primeras 128 palabras (200 8 ) del banco de instrucciones actual (B0) cuando se hace referencia a ellos como un elemento de datos. Esto impone una restricción a los compiladores para que no coloquen ninguna constante de datos en las primeras 128 palabras de un banco de códigos. El resultado de esto es una expansión del conjunto de instrucciones sin requerir códigos de operación adicionales. Las operaciones de registro a registro se realizan con los códigos de operación de almacenamiento de registros.
Las instrucciones típicas contienen un código de función, el registro de destino (o fuente), un registro de índice, un registro base y un campo de desplazamiento. Cuando el código de función con su calificador indica datos inmediatos, los campos de desplazamiento, base, i y h se combinan para formar un único valor inmediato de 18 bits. Esto permite cargar, sumar, multiplicar, etc. mediante pequeñas constantes para eliminar una referencia de memoria y el almacenamiento asociado.
El estado del procesador, tal como se captura en una pila en el momento de una interrupción, contiene la información necesaria para devolver el control a la actividad interrumpida y determinar el tipo de interrupción. Las interrupciones pueden ocurrir en medio de instrucciones largas y el estado se ocupa de esa posibilidad.
El modo básico es otra forma completa de formatos de instrucciones y direccionamiento. El modo básico proporciona compatibilidad con sistemas anteriores al 1108. Para todos los efectos prácticos, la arquitectura de hardware define las reglas por las cuales las direcciones e instrucciones se convierten a las formas anteriores. La diferencia más obvia en el modo básico es la falta de registros B explícitos en las instrucciones. En su lugar, hay cuatro registros B utilizados implícitamente (B12-B15). Hay un algoritmo complejo que utiliza los límites de los bancos representados por esos registros B, la dirección del operando y el registro B dentro del cual se encuentra la instrucción actual.
Las instrucciones más interesantes del repertorio 2200 son las instrucciones de bloqueo y sincronización. La sustitución condicional es familiar y bastante similar a la comparación y el intercambio en la arquitectura Intel. Estas instrucciones siempre obtienen el uso exclusivo de la línea de memoria/caché que contiene la palabra referenciada. TS y TSS verifican un bit en la palabra referenciada. Si el bit está libre, lo activan y continúan (TS) o saltan (TSS). Si el bit está activado, interrumpen (TS) o pasan a la siguiente instrucción (TSS). En una interrupción TS, el sistema operativo realiza una de varias acciones según la secuencia de instrucciones y la prioridad de la actividad. Las actividades en tiempo real y de ejecución simplemente recuperan el control para permitir el reintento a menos que haya una actividad de prioridad aún mayor esperando. La presunción es que el bloqueo está activado en otro procesador y pronto se desactivará. Si se trata de una actividad de usuario que no se ejecuta en prioridad de tiempo real, es posible que se reduzca temporalmente su prioridad y se vuelva a colocar en las colas de despacho.
Como alternativa, la secuencia de código puede indicar que se está utilizando Test & Set Queuing. En este caso, el SO coloca la actividad en un estado de espera y la encadena al final de la lista de actividades que esperan ese bloqueo en particular. Las actividades que eliminan dicho bloqueo verifican si hay alguna en espera y, de ser así, notifican al SO para que permita que una o más lo intenten nuevamente. Test & Set Queuing se utiliza normalmente para la sincronización dentro de subsistemas como el administrador de bases de datos donde pueden estar ejecutándose actividades de muchos programas.
El resultado de estos mecanismos es una gran eficiencia, baja sobrecarga y sincronización entre actividades.
La arquitectura de colas es otro caso especial interesante. Fue diseñada específicamente para permitir un manejo muy eficiente de la mensajería donde el número de mensajes en espera de procesamiento podría ser casi ilimitado. También está dirigida a reducir uno de los costos primarios de la mensajería, a saber, tener que mover constantemente los mensajes en la memoria. Incluso se elimina el movimiento de los mismos desde el administrador de comunicaciones al subsistema de cola de mensajes y al programa de procesamiento. En cambio, cada mensaje se coloca en un pequeño banco propio. Las instrucciones permiten colocar los descriptores de banco de estos bancos en una cola y eliminarlos de una cola. Cuando un mensaje se coloca en una cola, el programa o subsistema que lo envía ya no tiene acceso a él. Ese banco se elimina de su espacio de direcciones. Cuando se recupera un mensaje de una cola, el banco se convierte en parte del espacio de direcciones del receptor. Las instrucciones de cola también proporcionan funciones de sincronización de actividad (por ejemplo, esperar un mensaje).
Solo se mueven los "punteros" y se mueven de una manera que garantiza la seguridad y la integridad. Una vez movidos, los datos del mensaje solo son visibles para el destinatario.
Toda la E/S en los sistemas de la serie 2200 se maneja mediante procesadores de E/S . Estos procesadores descargan grandes porciones de la longitud de la ruta de E/S y la recuperación, y al aislar completamente el sistema principal de fallas de E/S, interrupciones, errores de bus, etc., mejoran enormemente la confiabilidad y la disponibilidad. Los procesadores de E/S vienen en tres tipos diferentes (almacenamiento, comunicaciones, agrupamiento), pero la única diferencia real es la carga del firmware . [4]
Todos los procesadores de E/S están controlados por el sistema operativo. OS 2200 proporciona un modo básico para E/S llamado "E/S de dispositivo arbitrario", pero incluso en este caso el sistema operativo valida que el programa esté accediendo a un dispositivo permitido y maneja todas las interrupciones y fallas antes de pasar el estado apropiado al programa. El oficial de seguridad debe otorgar privilegios a los programas para acceder a dispositivos en modo arbitrario y tanto el oficial de seguridad como el operador del sistema pueden limitar estos privilegios a dispositivos específicos. No se permite la E/S arbitraria a un dispositivo que también esté en uso por cualquier otro programa o el sistema. El dispositivo debe estar asignado exclusivamente al programa.
El sistema operativo recibe llamadas muy generales de los programas y genera paquetes de comandos con direcciones de memoria y de dispositivo reales que luego se pasan al procesador de E/S. El firmware del procesador de E/S crea los paquetes específicos del dispositivo (por ejemplo, SCSI ), configura el DMA , emite la E/S y atiende las interrupciones.