¿La falta de MMU hace alguna diferencia para las aplicaciones?

Linux genérico no se puede ejecutar en Cortex M3 porque Cortex M3 no tiene MMU . De acuerdo, hay versiones especiales de Linux que pueden ejecutarse allí.

El problema es que no entiendo cómo afecta esto al software de aplicación.

Supongamos que tengo alguna aplicación, cualquier aplicación de usuario, que sea ZIP unpacker como ejemplo. Lo tengo en forma de fuente y puedo compilarlo para ARM.

¿Funcionará en Cortex M3 que no tiene MMU? ¿Cómo sé si la falta de MMU afectará algún programa dado?

Ha pasado un tiempo, pero algunas cosas que recuerdo son sin mmu, no hay soporte de bifurcación, aunque hay otra función que puede actuar "similar" llamada vfork. Además, las solicitudes de malloc pueden ser más lentas, pero creo que lo solucionan al no inicializar la memoria devuelta en modo mmu. Además, la MMU lo protege al detectar accesos de memoria no válidos. No soy un experto, pero eso es lo que recuerdo.

Respuestas (3)

Hay varias cosas que te da una MMU:

Protección de memoria: en un entorno multitarea, esto evita que un programa con errores afecte a otro programa. Por ejemplo, si el programa con errores intenta escribir en una ubicación de memoria utilizando un puntero no inicializado, podría sobrescribir el código o los datos del programa correcto. La protección de la memoria evita esto al poner restricciones sobre a qué memoria puede acceder cada programa.

Traducción de memoria: la MMU realiza una "traducción de dirección de memoria lógica a física". La memoria normalmente se divide en bloques o páginas. A veces, especialmente después de que un sistema multitarea ha estado funcionando durante un tiempo, las páginas de la memoria física pueden mezclarse en fragmentos discontinuos. La MMU puede reorganizar estas páginas para crear fragmentos de memoria virtual que sean contiguos. Piense en esto como desfragmentar un disco duro, pero con memoria y sin el proceso de copiar/mover datos que consume mucho tiempo.

Memoria virtual: los sistemas operativos más sofisticados permiten la memoria virtual, donde la cantidad aparente de RAM en un sistema es mayor que la que está físicamente instalada. La memoria adicional generalmente se encuentra en el disco duro. Cuando un programa intenta acceder a una página de memoria que no está ubicada físicamente en la memoria principal, la MMU informa al sistema operativo. Luego, el sistema operativo carga esa página de "memoria" en la memoria principal. Si la memoria principal está llena, se transfiere otra página de la memoria principal al disco duro para hacer espacio. La MMU y el sistema operativo hacen esto con bastante rapidez, y de manera que el programa que accede a la memoria ni siquiera sabe que está sucediendo. Esto era más importante en los días en que la memoria era pequeña y costosa, pero todavía se usa para casi todos los sistemas operativos principales.

Las MMU son más importantes para los sistemas multitarea. Para los sistemas de tarea única y muchas aplicaciones integradas, el valor de una MMU es cuestionable.

La protección de memoria está disponible como opción para Cortex M3/M4 y, por ejemplo, los controladores NXP más grandes la tienen (LPC17xx, LPC18xx, LPC43xx).

Cuando no hay MMU, la parte del sistema operativo que carga los programas de aplicación en la memoria debe poder "reubicar" el código de la aplicación para que se ejecute en la región de memoria asignada. El compilador utilizado para la aplicación (o más específicamente, el enlazador) necesita producir un archivo que el cargador del sistema operativo pueda entender para lograr esto.

Rara vez se requieren cambios en el código fuente de la aplicación. Sin embargo, tenga en cuenta que los sistemas que no tienen MMU tampoco tienen memoria virtual, por lo que la aplicación y sus datos tendrán que caber en cualquier memoria física disponible, junto con el propio sistema operativo y cualquier otra aplicación que desee. tienen funcionando simultáneamente.

Según tengo entendido, debe compilar sus aplicaciones con la arquitectura y el sistema operativo dados .

En el ejemplo de uCLinux, necesitaría un compilador compatible (como el que CodeSorcery ofrece aquí ) y luego tendría que compilar sus aplicaciones deseadas dirigidas a uCLinux y ARMv7-M. Mi sospecha es que al apuntar específicamente a uCLinux, está apuntando al código de administración de memoria inherente a uCLinux que le permite ejecutarse en microcontroladores/microprocesadores sin MMU.