Kann MMU / MPU Registerzugriff verhinden?

Gast #5125169
Lesenswert?

Hi,

ist es möglich, auf einem ARM einem Prozess zu verbieten, auf Register 
zuzugreifen, mit denen die Hardware (Timer, ...) gesteuert wird?

Konkret geht es darum, ob ich hardwaremäßig sicherstellen kann, dass ein 
Prozess, der durch einen Bug außer Kontrolle gerät, das Betriebssystem 
abschießen kann. Das wäre in diesem Fall ein RTOS, z.B. FreeRTOS.

Ab welchem Typ ARM geht das, und auf welchen Hardwarebaustein (MMU, MPU) 
muss ich da achten?

Danke.
Gast #5125201
Lesenswert?

Beide können das auf unterschiedliche Weise.
Auch wenn die ARM Architektur eigentlich recht dankbar ist, musst du dir 
aber sofort, sobald du sowas machen willst, über initialisierung von 
deinem ganzen System gedanken machen.
Hauptproblem: Bei MMU oder auch MPU kannst du immer nur Bereiche 
freigeben/sperren. Dies bedeutet, dass i.d.R. immer nur ganze Pages 
(also zwischen 1 - 4kB) freigegeben werden können. Da aber bei ARM die 
Clock zusammengeführt auf einige Pages sind, kannst du quasi von dem 
Prozess, der Zugriff auf die Clocksteuerung von Peripherie hat, immer 
auch andere Peripherie mit abschalten. Das ist weniger ein Problem wenn 
du das global machst, z.B. einmal initialisierst und dann die Tasks 
werkeln lässt.

Vor allem wirst du aber das Problem haben das du das bei FreeRTOS alles 
per Hand machen musst -> du musst dich noch ordentlich mit der 
Architektur auseinandersetzen.
#5125654
Lesenswert?

Oliver schrieb:
> Ab welchem Typ ARM geht das, und auf welchen Hardwarebaustein (MMU, MPU)
> muss ich da achten?

Bei den Cortex-M und Cortex-R ist die MPU immer optional, das heisst du 
musst die Hersteller/Distributoren danach abklappern, ST hat in vielen 
STM32 eine drin, sogar in einigen M0+.

Bei den Cortex-A kriegst du fast immer eine MMU mit TrustZone weil die 
ja unter anderem für volle OS wie Linux gedacht sind.
#5125779
Lesenswert?

mit der MPU auf einem Cortem-M3/M4 ist das relativ simpel .
FreeRTOS gibt es auch in einer MPU version die das mesite für dich 
händelt.
Da kannst du einen "unprivileged" Thread (restrictedTask) erzeugen der 
erstmal auf nichts außer den eigenen Stack zugreifen darf. Wenn der Task 
auf mehr zugreifen soll kannst du ihm bis zu 3 "Ausnahmen" dazugeben, 
z.B: wenn der einen Uart benutzen soll etc.

kleiner TIPP. die aktuelle FreeRTOS version 9.0 hat den MPU support 
leider nur für den Compiler Keil and GCC, IAR fehlt leider noch, ist 
aber gerade in der mache.
Wir testen gerade eine beta von IAR+ST die soweit gut läuft. Dies wird 
dann vermutlich auch in die STCubeMX von ST aufgenommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren