2011-11-18 12 views
5

Estoy investigando con la arquitectura MIPS y me preguntaba cómo se implementan los sistemas operativos con las instrucciones limitadas y la protección de memoria que ofrece mips. Me pregunto específicamente cómo un sistema operativo evitará que se ejecuten ciertos rangos de direcciones. Por ejemplo, ¿cómo podría un sistema operativo limitar la PC para operar en un rango particular? En otras palabras, ¿evitar algo como ejecutar desde la memoria asignada dinámicamente?Prevención de ejecución de memoria MIPS

Lo primero que se me viene a la mente es con los TLB, pero los TLB solo ofrecen protección de escritura de memoria (y no se ejecutan).

No entiendo muy bien cómo podría ser manejado por el SO, porque eso implicaría que cada instrucción daría lugar a una excepción y luego MUCHOS ciclos se grabarían simplemente comprobando si la PC estaba en una dirección correcta distancia.

Si alguien sabe, ¿cómo se hace normalmente? ¿Se maneja de alguna manera por el hardware durante la inicialización (por ejemplo, tiene un rango de direcciones y se aplica una excepción si está fuera de rango?)

Respuesta

2

La mayoría de las comprobaciones de protección se realizan en hardware, por la CPU y no necesitan mucha participación desde el lado del sistema operativo.

El sistema operativo configura algunas tablas especiales (tablas de páginas o descriptores de segmentos o algo así) donde los rangos de memoria tienen permisos de lectura, escritura, ejecución y usuario/kernel asociados que la CPU almacena en caché internamente.

La CPU luego en cada instrucción comprueba si los accesos a la memoria cumplen o no con los permisos establecidos por el sistema operativo y si todo está bien, continúa. Si hay un intento de violar esos permisos, la CPU genera una excepción (una forma de interrupción similar a las externas a los dispositivos de E/S de la CPU) que maneja el sistema operativo. En la mayoría de los casos, el sistema operativo simplemente finaliza la aplicación ofensiva cuando recibe dicha excepción.

En algunos otros casos, trata de manejarlos y hacer que el código aparentemente roto funcione. Uno de estos casos es el soporte para memoria virtual en disco. El sistema operativo marca una región como no presente/inaccesible cuando no está respaldada por la memoria física y sus datos están en algún lugar del disco. Cuando la aplicación intenta usar esa región, el sistema operativo detecta una excepción de la instrucción que intenta acceder a esta región de memoria, respalda la región con memoria física, la rellena con datos del disco, la marca como presente/accesible y reinicia el instrucción que ha causado la excepción. Cuando el sistema operativo tiene poca memoria, puede descargar datos de ciertos rangos al disco, marcar esos rangos como no representados/inaccesibles nuevamente y reclamar la memoria de esas regiones para otros fines.

También puede haber códigos específicos codificados por los rangos de memoria de la CPU inaccesibles para el software que se ejecuta fuera del núcleo del sistema operativo y la CPU puede hacer una comprobación aquí también.

Este parece ser el caso de MIPS (from "Application Note 235 - Migrating from MIPS to ARM"):

3.4.2 Protección de memoria MIPS ofrece protección de memoria sólo en la medida descritos anteriormente es decir, direcciones en el 2GB superior del espacio de direcciones no están permitidos cuando está en modo de usuario. No es posible un régimen de protección de grano más fino.

enter image description here

This document listas "MEM - página falla en recuperación de datos, acceso a la memoria desalineadas;-protección de memoria violación" entre las otras excepciones MIPS.

Si una versión particular de la CPU MIPS no tiene más controles de protección detallados, solo pueden ser emulados por el sistema operativo y a un costo significativo. El sistema operativo necesitaría ejecutar instrucciones de código por instrucción o traducirlo a un código casi equivalente con direcciones insertadas y verificaciones de acceso y ejecutarlo en lugar del código original.

2

De hecho, esto se hace con TLB. No Execute Bits (NX bits) se hizo popular hace solo unos años, por lo que los procesadores MIPS más antiguos no lo admiten. La última versión de MIPS architecture (versión 3) y SmartMIPS Application-Specific Extension la admiten como una función opcional con el nombre XI (Inhibir ejecución).

Si tiene un chip sin esta función no tiene suerte. Como Alex ya dijo, no hay una manera simple de emular esta característica.