Logotipo de Zephyrnet

Comprensión de las unidades de protección de memoria

Fecha:

Hablemos de las diversas medidas de seguridad que tomamos para proteger nuestros hogares. Usamos cerraduras, instalamos cámaras de seguridad para detectar actividades sospechosas, etc., todo para salvaguardar a nuestros seres queridos y posesiones valiosas. En el mismo sentido, los diminutos microcontroladores del interior de nuestros dispositivos cuentan con unidades de protección (PU) que salvaguardan el preciado recurso: la memoria.

Uno de los tipos más importantes de unidades de protección es la unidad de protección de memoria (MPU).  

¿Qué son las MPU?

Una MPU es una unidad de hardware programable que actúa como guardián de la memoria. Permite al usuario dividir la memoria en diferentes regiones y establecer permisos de acceso a la memoria (solo acceso privilegiado o acceso completo, etc.) y atributos de memoria para cada una de estas regiones.  

El número de regiones definibles varía según la implementación. La MPU en Arm Cortex-M4/M7 y la CPU M0+ en TRAVEO T2G admite hasta 8 regiones programables y cada región definida se puede dividir en 8 subregiones iguales. Esto aumenta la granularidad de la protección implementada. Nos referiremos a la implementación Arm de MPU en este blog.

¿Cuál es la diferencia con otras unidades de protección?

La MPU se implementa como parte del núcleo de la CPU. Esto significa que las regiones de memoria de la MPU y los atributos configurados son exclusivos de ese núcleo. La MPU tiene la máxima prioridad sobre otros tipos de PU. Ahora veremos qué atributos de memoria y permisos de acceso podemos configurar.

¿Cuáles son esos permisos y atributos de acceso a la memoria?

A continuación se detallan los diferentes tipos de atributos de memoria que se definen para una región de memoria protegida por MPU:

  1. Ejecutar nunca (XN):

Si está habilitado, cualquier instrucción recuperada de la región de la memoria resultaría en una falla de acceso a la memoria.

  1. Permiso de acceso a datos (AP):

Define los permisos de acceso a datos de un software de usuario o privilegiado en el núcleo. Es decir, si se permite un acceso de lectura o escritura por parte de un usuario o software privilegiado.

  1. Compartible (S), almacenable en caché (C), almacenable en búfer (B):

Se utiliza para permitir si alguna instrucción o dato recuperado se puede almacenar en caché o enviar a unidades de búfer o si se puede compartir entre varios procesadores. Junto con el campo denominado Extensión de tipo (TEX), los atributos de acceso a la memoria de la región se pueden programar correctamente para admitir diferentes tipos de memoria.

  1. Desactivación de subregión (SRD):

Se utiliza para dividir la región de memoria en 8 subregiones y definir cada una como habilitada o deshabilitada.

Los atributos anteriores son parte del registro de tamaño y atributos de región (MPU_RASR). Junto con otros registros de MPU, a saber, MPU_Type, MPU_Control, número de MPU_Region, dirección MPU_Base, se puede configurar una MPU para una región de memoria. Para obtener más detalles sobre estos registros y su estructura de bits, consulte Arm manual de referencia de arquitectura (sección B3.5.4). Ahora que sabemos qué configurar, veremos cómo configurar una MPU.

¿Cómo configurar la MPU?

Ashwin_Kumar_0-1697018135081.png

Ashwin_Kumar_0-1697018135081.png

Fig. 1: Flujo de configuración de MPU

Los pasos involucrados en la configuración de MPU para 'yo' A continuación se explican las diferentes regiones de memoria. La Figura 1 muestra la configuración de la MPU como un diagrama de flujo. 

  1. Primero verificamos las dos condiciones siguientes:
    1. Compruebe si el procesador/núcleo que estamos utilizando es compatible con MPU observando que el registro MPU->TYPE no es igual a 0.
    2. Compruebe si el número de regiones MPU que se configurarán (CFG_SIZE) es menor o igual al número máximo de regiones MPU admitidas (MAX_MPU_NUM).

Si ambas condiciones son VERDADERAS, vaya al siguiente paso. De lo contrario, salga e informe como error.

  1. Deshabilite MPU antes de la configuración (MPU_CTRL = 0).
  2. Inicializar valor del contador i = 0
  3. Comprobar si i es menor que MAX_MPU_NUM, si es VERDADERO ir a paso 5. De lo contrario ir a paso 9
  4. Comprobar si i es menor que CFG_SIZE. Si es VERDADERO ir a paso 6. De lo contrario ir a paso 7
  5. Seleccione el número de región i para ser protegido. Configurar el número de región de MPU i con la dirección base y los atributos de memoria necesarios. Ahora ve a paso 8
  6. Deshabilite la MPU no utilizada configurando la dirección base y sus atributos con valor 0.
  7. Actualizar el valor del contador i by 1 E ir a paso 4
  8. Habilite la MPU para aplicarlos en las respectivas regiones de memoria

Ahora sabemos qué configurar y cómo configurar una MPU. En la siguiente sección veremos los diversos casos de uso de las MPU.

Algunos casos de uso de MPU

A continuación se muestran algunas de las aplicaciones más utilizadas de las MPU para hacer que nuestro sistema sea más robusto y seguro:

  1. Definir SRAM como de solo lectura para proteger datos importantes contra la corrupción.
  2. Evitar que tareas sin privilegios accedan a recursos de memoria críticos.
  3. Aislar el espacio de pila asignado para diferentes aplicaciones evitando así la corrupción de otros espacios de pila.

En conclusión, las MPU desempeñan un papel crucial a la hora de garantizar la seguridad y la integridad de los recursos de memoria, lo que las convierte en un tema vital para comprender y construir nuestros sistemas con seguridad. En los próximos blogs discutiremos más sobre las otras unidades de protección.

ashwin kumar

  (todos los mensajes)
Ashwin Kumar es ingeniero de aplicaciones en Infineon Technologies.

punto_img

Información más reciente

punto_img