La protección que se ofrece en los
sistemas de computación existentes casi siempre se ha logrado con la ayuda del
núcleo de un sistema operativo, que actúa como agente de seguridad que
inspecciona y valida cada intento por acceder a un recurso protegido. Puesto
que la validación de todos los accesos puede dar pie a un gasto extra
considerable, debemos apoyarla con hardware para reducir el costo de cada
validación o bien debemos aceptar que el diseñador del sistema podría
inclinarse por sacrificar los objetivos de la protección. Es difícil satisfacer
todos estos objetivos si los mecanismos de soporte con que se cuenta restringen
la flexibilidad para implementar diversas políticas de protección.
A medida que ha aumentado la
complejidad de los sistemas operativos, sobre todo al trata de ofrecer
interfaces de más alto nivel con el usuario, lo objetivos de la protección se
han vuelto mucho más refinados. En esta refinación observamos que los
diseñadores de los diseñadores de los sistemas de protección se han apoyado
mucho en ideas que se originaron en los lenguajes de programación y
especialmente en los conceptos de tipos de datos abstractos y objetos. Los
sistemas de protección ahora se ocupan no sólo de la identidad de un recurso al
cual se intenta acceder, sino también de la naturaleza funcional de ese acceso.
En los sistemas de protección más nuevos, el interés en la función que se
invocará se extiende más allá de un conjunto de funciones definidas por el
sistema, como los métodos de acceso a archivos estándar, para incluir funciones
que también podrían ser definidas por el usuario.
Las políticas para el uso de recursos
también podrían variar, dependiendo de la aplicación, y podrían cambiar con el
tiempo. Por estas razones, la protección ya no puede considerarse como un
asunto que sólo concierne al diseñador de un sistema operativo; también debe
estar disponible como herramienta que el diseñador de aplicaciones pueda usar
para proteger los recursos de un subsistema de aplicación contra intervenciones
o errores.
Aquí es donde los lenguajes de
programación entran en escena. Especificar el control de acceso deseado a un
recurso compartido en un sistema es hacer una declaración acerca del recurso.
Este tipo de declaración se puede integrar en un lenguaje mediante una
extensión de su mecanismo de tipificación. Si se declara la protección junto
con la tipificación de los datos, el diseñado de cada subsistema puede
especificar sus necesidades de protección así debería darse directamente
durante la redacción del programa, y en el lenguaje en el que el programa mismo
se expresa. Este enfoque tiene varias ventajas importantes:
·
Las necesidades de protección se
declaran de forma sencilla en vez de programarse como una secuencia de llamadas
a procedimientos de un sistema operativo.
·
Las necesidades de protección pueden
expresarse independientemente de los recursos que ofrezca un sistema operativo
en particular.
·
El diseñador de un subsistema no
tiene que proporcionar los mecanismos para hacer cumplir la protección.
·
Una notación declarativa es natural
porque los privilegios de acceso están íntimamente relacionados con el concepto
lingüístico de tipo de datos.
Hay diversas técnicas que una implementación de lenguaje de programación puede utilizar para hacer cumplir la protección, pero cualquiera de ellas deberá depender hasta cierto punto del grado de soporte de una máquina subyacente y su sistema operativo.
Hay diversas técnicas que una implementación de lenguaje de programación puede utilizar para hacer cumplir la protección, pero cualquiera de ellas deberá depender hasta cierto punto del grado de soporte de una máquina subyacente y su sistema operativo.
¿Qué ventajas relativas tiene entonces el cumplimiento
basado exclusivamente en un núcleo, en comparación con el cumplimiento forzado
en gran medida por un compilador?
·
Seguridad: La obligación del cumplimiento por un núcleo ofrece un mayor
grado de seguridad del sistema de protección mismo, que el que ofrece la
generación de código de verificación de protección por un compilador. En un
esquema apoyado por compilador, la seguridad depende de lo correcto que sea el
traductor, de algún mecanismo subyacente de gestión de almacenamiento que
proteja los segmentos desde los cuales se ejecuta el código compilador y, en
última instancia, de la seguridad de los archivos desde los que se carga el
programa.
·
Flexibilidad: Hay límites a la flexibilidad de un núcleo de protección
para implementar una política definida por el usuario, aunque podría
proporcionar recursos suficientes para que el sistema haga cumplir sus propias
políticas. Con un lenguaje de programación, se puede declarar la política de
protección y hacerse cumplir según sea necesario en una implementación.
·
Eficiencia: Se logra la eficiencia máxima cuando hardware apoya
directamente el cumplimiento de la protección. En la medida en que se requiera
soporte de software, el cumplimiento basado en el lenguaje tiene la ventaja de
que es posible verificar el cumplimiento del acceso estático fuera de línea en
el momento de la compilación.
En síntesis, la especificación de la
protección en un lenguaje de programación permite describir un alto nivel de
políticas de asignación y uso de recursos.
No hay comentarios:
Publicar un comentario