ARM Basics (3): Explication détaillée et exemples d'unité de protection de mémoire MPU

MPU ( Memory Protection Unit) est une fonctionnalité des processeurs ARM, qui fournit des fonctions de protection de la mémoire et de contrôle d'accès, et est généralement utilisée pour implémenter l'isolation de la mémoire et la protection des systèmes d'exploitation. Par exemple, nous pouvons définir toute la RAM comme non exécutable, afin d'éviter les attaques par injection de code. Dans le cadre de projets récents, plusieurs cœurs Cortex utilisés utilisaient MPU.J'ai découvert que MPU joue non seulement un rôle de protection de la mémoire, mais également lié au cache, et peut également accélérer la vitesse d'accès des périphériques de stockage externes. Cet article présentera donc le MPU en détail.


Ici, nous prenons le cœur de la série Cortex-M7 comme exemple pour introduire le MPU. En fait, les cœurs Cortex-M sont fondamentalement les mêmes en termes de MPU, à l'exception du Cortex-M33, qui annule la sous-région et les fonctionnalités qui se chevauchent, car il peut personnaliser chaque taille de zone, plus flexible.

1 Caractéristiques du MPU

Le MPU permet à un processus d'accéder à 16 zones de mémoire ou périphériques (0 à 15), et l'emplacement et la taille de chaque zone (doit être de 2 ^ n et supérieur à 32 octets) est configurable.

  • Chaque zone peut être divisée en 8 sous-zones maximum, et la taille de chaque sous-zone est d'au moins 32 octets, ce qui est déterminé par la longueur de la ligne de cache
  • En plus des 16 régions, il existe une région par défaut numérotée -1, qui a la priorité la plus basse
  • Ces régions peuvent se chevaucher ou être imbriquées . La région 15 a la priorité la plus élevée et la région 0 a la priorité la plus basse, ce qui détermine le comportement du chevauchement de régions.

Prenons un exemple :
insérez la description de l'image ici
La figure ci-dessus montre un exemple avec six régions. La région 4 chevauche les régions 0 et 1, et la région 5 est incluse dans la région 3. Puisque les priorités sont dans l'ordre croissant, les zones qui se chevauchent (orange) ont la priorité. Par conséquent, si la zone 0 est inscriptible et que la zone 4 ne l'est pas, les adresses qui se chevauchent entre 0 et 4 ne sont pas inscriptibles.

  • Le MPU ne fait pas de distinction entre les droits d'accès aux instructions et aux données, mais utilise la même zone pour contrôler l'accès aux données et aux instructions.
  • Le MPU peut également définir d'autres attributs de mémoire, tels que la capacité de mise en cache d'une région, qui sont transmis à l'unité de cache ou au contrôleur de mémoire du système.
    • L'architecture ARM prend en charge deux niveaux de cache : cache interne ( L1-Cache) et cache externe ( L2-Cache). Parmi eux, le cache L1 est situé près du cœur du processeur, le plus proche du processeur, et offre la vitesse d'accès la plus rapide. Le cache L2 est situé à l'extérieur du cache L1, plus éloigné du processeur, mais toujours plus rapide que la mémoire principale et offre une plus grande capacité.

2 types de mémoire

Il existe généralement trois types de mémoire courants :
1. Normal Memory: permet au processeur d'effectuer des opérations de chargement et de stockage sur des octets, des demi-mots et des mots de manière efficace (le compilateur ne connaît pas le type de zone mémoire). Pour les régions de mémoire normales, l'ordre des chargements et des stockages n'est pas nécessairement exécuté dans l'ordre indiqué dans le programme.
2. Device Memory: Les opérations de chargement et de stockage sont effectuées strictement afin de s'assurer que les registres sont définis dans le bon ordre.
3. Strongly Ordered Memory: Toutes les opérations sont exécutées en stricte conformité avec l'ordre indiqué dans le programme, et la CPU attendra la fin de l'instruction de chargement/stockage avant d'exécuter l'instruction suivante dans le déroulement du programme. Cela peut entraîner une dégradation des performances.

3 propriétés de mémoire

L'attribut de zone et le registre de taille MPU_RASR( Region Attribute and Size Register) du MPU sont utilisés pour définir tous les attributs de mémoire, et les fonctions de chaque champ du registre sont indiquées dans le tableau suivant :

morceaux Nom Description
28 XN Exécuter jamais
26:24 PA Champ d'autorisation d'accès aux données (RO, RW ou Aucun accès)
21:19 TEXAS Saisissez le champ d'extension
18 S Partageable
17 C Cacheable
16 B Tamponnable
15:8 SRD Sous-région désactivée. 1 = désactivé, 0 = activé
5:1 TAILLE la taille de la région de protection MPU

(1) XN: Contrôler l'exécution du code. A ce momentXN=1 , l' accès à la région mémoire correspondante en résultera MemManage Fault.
(2) AP: Contrôler les droits d'accès de la zone mémoire, comme indiqué dans le tableau suivant

PA[2:0] Autorisations privilégiées Autorisations non privilégiées Description
000 Pas d'accès Pas d'accès Tous les accès génèrent une erreur d'autorisation
001 RW Pas d'accès Accès depuis un logiciel privilégié uniquement
010 RW RO Écrit par un logiciel non privilégié génère une erreur d'autorisation
011 RW RW Accès total
100 Imprévisible Imprévisible Réservé
101 RO Pas d'accès Lu par un logiciel privilégié uniquement
110 RO RO Lecture seule, par logiciel privilégié ou non privilégié
111 RO RO Lecture seule, par logiciel privilégié ou non privilégié

(3) S: Indique si la zone mémoire peut être partagée. Si une région est partageable, plusieurs maîtres de bus peuvent y accéder simultanément et le système fournit des mécanismes de synchronisation des données. Cependant, si une région n'est pas partageable, un logiciel est nécessaire pour contrôler la cohérence des données auxquelles accèdent plusieurs bus.

  • Pour certaines puces, le mécanisme de synchronisation des données de la couche matérielle n'est pas pris en charge, Sil est donc utilisé pour indiquer si la zone estnon-cacheable

(4) TEX, C, B: Ces trois champs définissent les propriétés de cache de la zone mémoire et peuvent déterminer dans une certaine mesure sa partageabilité ( Schamp )

TEXAS C B Type de mémoire Description Partageable
000 0 0 Fortement ordonné Fortement ordonné Oui
000 0 1 Appareil Appareil partagé Oui
000 1 0 Normal Écrire, pas d'allocation d'écriture Bit S
000 1 1 Normal Réécriture, pas d'allocation d'écriture Bit S
001 0 0 Normal Non-cachable Bit S
001 0 1 Réservé Réservé Réservé
001 1 0 Indéfini Indéfini Indéfini
001 1 1 Normal Réécriture, écriture et lecture allouer Bit S
010 0 0 Appareil Appareil non partageable Non
010 0 1 Réservé Réservé Réservé
  • Lorsque shareablele bit est 1, la stratégie de cache n'est pas TEX/C/Baffectée par le champ, mais fixée commenon-cacheable
  • Bufferableet Cacheablela différence? BufferableIl se concentre principalement sur l'efficacité de lecture et d'écriture de l'accès à la mémoire, qui est utilisé pour préextraire les données ou décider quand réécrire les données dans la mémoire en fonction de sa stratégie de tampon. Les attributs, quant Cacheableà eux, se concentrent sur la vitesse d'accès aux données, permettant au processeur de stocker les données dans le cache pour un accès plus rapide.
  • Write through with no write allocate : En cas d'accès (les données requises existent dans le cache), écrivez les données dans le cache et la mémoire principale. En cas d'échec, il ne met à jour que le bloc dans la mémoire principale, sans écrire dans le cache.
  • Write-back with no write allocate: Lorsque le processeur effectue une opération d'écriture, si les données sont déjà dans le cache, seules les données du cache sont mises à jour sans les réécrire immédiatement dans la mémoire principale. Ce n'est que lorsque les données du cache doivent être remplacées que les dernières données sont réécrites dans la mémoire principale.
  • Write-back with write and read allocate: Lorsque le processeur effectue une opération d'écriture, si les données sont déjà dans le cache, mettez à jour les données dans le cache et écrivez-les dans la mémoire principale. Lorsque le processeur effectue une opération de lecture, les données n'existent pas dans le cache, il lit le bloc entier de la mémoire principale dans le cache

(5) SRD: Marquez l'état activé ou désactivé d'une sous-zone spécifique. Si une sous-zone est désactivée, l'accès au sein de cette sous-zone sera chevauché par d'autres zones activées. Si aucune autre région activée ne chevauche la sous-région désactivée, le MPU génère une erreur indiquant que l'accès est illégal ou non autorisé.

Remarques Cortex-M7 :
(1) TCM( Tightly Coupled Memories, mémoire étroitement couplée) est toujours traitée comme une mémoire ordinaire non mise en cache et non partagée, quels que soient les attributs de type de mémoire que le MPU définit pour la région de mémoire dans le TCM.
(2) speculative prefetch
La prélecture est une technique d'optimisation du processeur, qui est utilisée pour charger à l'avance les données de la mémoire principale dans le cache du processeur afin de pouvoir y accéder plus rapidement en cas de besoin. Cependant, étant donné que le processeur ne peut pas savoir à l'avance exactement quelles données seront réellement utilisées, les opérations de prélecture peuvent parfois introduire une surcharge inutile. Cela affectera certaines mémoires ou périphériques sensibles aux accès multiples, tels que les FIFO, les contrôleurs LCD, etc. En même temps, il peut occuper la bande passante d'autres appareils maîtres, tels que LCD, DMA.

Afin d'éviter la perte de performances causée par une prélecture inutile, le processeur Cortex-M7 introduit constraint speculative prefetchdes contraintes. Cela signifie que dans certains cas, le processeur limitera l'opération de prélecture et n'effectuera pas l'opération de prélecture, comme la modification du type de mémoire vers Device Memoryou via l'attribut de mémoire du MPU Strongly Ordered Memory.

4 Exemple de configuration MPU de I.MX RT1170

Pour le cœur Cortex-M7 de I.MX RT1170, nous pouvons utiliser les macros suivantes pour définir ARM_MPU_RBARet ARM_MPU_RASRconfigurer une zone MPU :

* \param Region            The region to be configured, number 0 to 15.
* \param BaseAddress       The base address for the region.
MPU->RBAR = ARM_MPU_RBAR(Region, BaseAddress);

* \param DisableExec       Instruction access disable bit, 1= disable instruction fetches.
* \param AccessPermission  Data access permissions, allows you to configure read/write access for User and Privileged mode.
* \param TypeExtField      Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
* \param IsShareable       Region is shareable between multiple bus masters.
* \param IsCacheable       Region is cacheable, i.e. its value may be kept in cache.
* \param IsBufferable      Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
* \param SubRegionDisable  Sub-region disable field.
* \param Size              Region size of the region to be configured, for example 4K, 8K.
MPU->RASR = ARM_MPU_RASR((DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size));

La configuration MPU par défaut dans RT1170 est très longue, et j'ai omis une partie, car certaines configurations de mémoire sont les mêmes. De plus, j'ai également omis l'initialisation des segments liés au cache. J'écrirai un article sur ICache et DCache pour analyse à l'avenir. Voici le code de configuration MPU par défaut dans RT1170 :

  • L'adresse de base de la région doit être alignée sur un multiple entier de la taille de la région
	/* Region 0 setting: Instruction access disabled, No data access permission. */
    MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U);
    MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB);

    /* Region 1 setting: Memory with Device type, not shareable, non-cacheable. */
    MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);

    /* Region 3 setting: Memory with Device type, not shareable, non-cacheable. */
    MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);

    /* Region 4 setting: Memory with Normal type, not shareable, outer/inner write back */
    MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
    
	/* Region 8 setting: Memory with Normal type, not shareable, outer/inner write back. */
    MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_16MB);

(1) Région 0 : Mapper l'adresse complète de la puce, c'est-à-dire que la plage d'adresses maximale de l'adressage 32 bits est 4G, et l'affectation par défaut est non exécutable et inaccessible. En effet, la configuration du MPU peut être écrasée par une configuration de haute priorité, donc la signification de ceci est d'attribuer une autorisation par défaut à la zone de mémoire qui n'est pas configurée plus tard (2) Région 1 : Il s'agit de l'adresse de mappage de SDRAM,
ici sera Il est défini comme Device Memory, c'est-à-dire non-shareable. Indique que la fonction de prélecture CPU pour cette mémoire est annulée.
(3) Région 3 : Définissez la mémoire de 0x00000000 à 0x40000000 Device Memoryet Region 0définissez une valeur par défaut identique
(4) Région 4 : Il s'agit de l'adresse de l'ITCM du système, définissez le type de mémoire sur Normal Memory. Ici, il est défini sur non-shareable, cacheableet bufferable, indiquant que les données du cache sont utilisées et qu'elles ne sont écrites dans la mémoire que lorsque les données du cache sont échangées
(5) Région 8 : Il s'agit de l'adresse de mappage de NOR Flash, et Region 4le La configuration de et est fondamentalement la même, sauf pour NOR. Pour Flash, si vous utilisez le mappage FlexSPI, cette mémoire est en lecture seule. Si vous avez besoin d'écrire NOR Flash, vous devez appeler la fonction de FlexSPI xferpour générer le timing d'écriture pertinent

  • Il y a aussi de la mémoire pour AIPSle mappage des registres de configuration, qui est également omis ici, et il est en fait configuré Device Momory.

おすすめ

転載: blog.csdn.net/tilblackout/article/details/131146513