Escribir un sistema operativo multitarea para un procesador sin MMU

9

He estado pensando en escribir un sistema operativo para algunos de los procesadores ARM. Hay muchas computadoras populares de placa única con ARM MPU, por lo que simplemente quería comprar una de ellas (elegir una con más documentación abierta). Me sorprendí cuando descubrí que incluso las placas con suficiente memoria no tienen MPU con la Unidad de administración de memoria.

Como siempre he estado trabajando con procesadores i386 + y nunca con nada más (excepto algunos PIC de Microchip), ahora estoy confundido y no estoy seguro de si se puede escribir un sistema operativo que funcione y cuya funcionalidad no se vea limitada cuando se compara con los sistemas operativos escritos para MPU con MMU.

Podría pensar en algunas soluciones para "reemplazar" o "simular" MMU y tengo algunas preguntas:

  • En los procesadores Intel en modos de 16 y 32 bits, hay una forma de usar segmentos y selectores de segmentos para usar diferentes bloques de memoria para diferentes tareas. Eso significa que podría cambiar el espacio de memoria al cambiar el contenido de los registros de segmento al hacer un cambio de tarea en x86. ¿Hay algún concepto general para la segmentación de memoria que pueda usarse en la arquitectura ARM?
  • Al cargar un archivo de objeto vinculado en lugar de ejecutable, podría usar reubicaciones (arreglos) o posicionar código independiente para apuntar tareas en piezas de memoria de la misma manera que si asignara la memoria usando estructuras de paginación. ¿Sería esto lo suficientemente efectivo?
  • También he leído algo sobre Unidades de protección de memoria en procesadores ARM. ¿Podrían ser útiles?

¿Hay alguna forma "habitual" de administrar tareas en sistemas sin MMU?

usuario35443
fuente

Respuestas:

16

En realidad, no es tan difícil diseñar un sistema operativo que no requiera una MMU. Hay algunas comodidades de las que tendrá que prescindir, pero nada insuperable.

  • Dado que las diferentes tareas tendrán que cargarse en diferentes direcciones, todo su código (excepto el núcleo, la biblioteca estándar y cualquier otro código que forme parte de su entorno de tiempo de ejecución base) debe compilarse como independiente de la posición. Esto significa saltos relativos y una dirección base para el acceso al almacenamiento dinámico almacenada en un registro. Gastar un registro como dirección base puede parecer costoso si está acostumbrado a los cuatro registros generales de x86-32, pero la mayoría de las arquitecturas modernas tienen más, e incluso 8088 tiene los registros de segmento precisamente para eso.
  • Una arquitectura similar a Unix tiene que ser revisada, porque no se puede implementar fork. Eso está bien, la mayoría de los sistemas operativos no tienen fork. (Puedes tener vfork)
  • No puede preasignar grandes cantidades de espacio sin también asignar la memoria correspondiente. Esto significa que no debe crecer la pila o el montón sobre la marcha al asignar una página más a la vez.

Si tiene una MPU, entonces sus tareas aún se pueden separar entre sí, como es habitual en los sistemas operativos multitarea. Sin una MPU, la separación de memoria solo puede ser cooperativa si permite que las tareas ejecuten código arbitrario. Una forma de lograr la separación de memoria sin una MPU es restringir las tareas para usar solo código verificado en una máquina virtual e implementar protección de memoria en el software como parte del motor VM.

uClinux es un proyecto basado en el kernel de Linux que se ejecuta en procesadores (incluido ARM Cortex-M) sin una MMU. Sus restricciones en la multitarea son esencialmente lo que describí anteriormente.

Gilles 'SO- deja de ser malvado'
fuente