Forum: Mikrocontroller und Digitale Elektronik MMU manuell nutzen


von HMB (Gast)


Lesenswert?

Hallo!

Ich frage mich seit einiger Zeit, wie die MMU von größeren 
Mikrocontrollern genutzt werden kann, ohne ein entsprechendes 
Betriebssystem zu nutzen.
Da ich nichts wirklich sinnvolles zu diesem Thema im Netz finde, hoffe 
ich hier auf einige Beiträge.
Genauer gesagt möchte ich den Speicherschutz der MMU nutzen, um bei 
komplexer Software Fehler durch Pointer etc zu vermeiden.
Rein theoretisch dachte ich mir, dass (sofern genügend Speicher zur 
Verfügung steht) es doch möglich sein müsste, alle nötigen Variablen 
statisch zu allokieren (wodurch man den nötigen Speicher schon mal 
wüsste) und den einzelnen "Prozessen" oder Tasks damit einen 
Speicherbereich fest zuordnen zu können. Diese wären dank der MMU dann 
auch noch voreinander geschützt.
Mit händischer Nutzung der MMU habe ich persönlich leider garkeine 
Erfahrung - geschweige denn, ob das überhaupt so einfach möglich ist. 
Über Anregungen, Pro's und Kontra's würde ich mich sehr freuen.
(Bitte - keine Gegenfragen zu Sinn und Unsinn meiner Frage ;) )

MfG hm

von (prx) A. K. (prx)


Lesenswert?

Wenn von Prozessen oder Tasks die Rede ist, und von einer 
Speicherverwaltung die den Speicher dieser Prozesse trennt, dann baust 
du dir so ein eigenes Betriebssystem. Kein grosses wie Windows oder 
Linux, aber trotzdem.

von ECU Entwickler (Gast)


Lesenswert?

Hallo,

also prinzipiell kannst Du die MMU natürlich auch 'händisch' nutzen.

Dazu mußt Du
- Dir erst einmal im klaren sein was gegeneinander geschützt werden soll
- ein Linker-CMD File schreiben, das die Symbole entsprechend im 
Speicher anordnet
- die entsprechenden MMU Regionen / TLBs festlegen
- einen MMU Treiber bauen, der immer zwischen den "Tasks/Prozessen" 
aufgerufen wird und die MMU entsprechend der nächsten Task konfiguriert.
 Das könnte man auch am Anfang bzw. Ende einer jeden C-Funktion machen.
- ein ordentliches Fehlerhandling bzw. Debugmöglichkeiten einbauen, 
ansonsten sucht man sich im Fehlerfall tot!

Ich habe so etwas schon gemacht. Allerdings ging es darum, genau eine 
'Kundensoftware' gegen unsere eigene SW zu schützen. Bevor die 
Hauptfunktion der Kundensoftware aufgerufen wurde, habe ich die MMU 
entsprechend konfiguriert (Speicherschutz eingeschaltet). Nachdem die 
Kundensoftware abgelaufen war, wurde wieder auf eine weniger restriktive 
MMU Konfiguration umgeschaltet. Damit das überhaupt geht, gilt die 
Devise Lesen darf jeder, Schreiben darf nur der gerade aktive 
Prozess/Task/Funktion.

Noch ein Tipp:
Bei vielen CPUs muß man in einem priviligierten (System-) Modus sein um 
die MMU-Register verändern zu dürfen. Das kann man z.B. über 
(Software-)Interrupts machen.

Gruß Bernd

von HMB (Gast)


Lesenswert?

Uffa, das hört sich nach endlos viel Arbeit an...
@ Bernd: Wie lange hast du denn dafür gebraucht, bis es einwandfrei 
gelaufen ist?

Ich glaube ich überlege mir mal andere Möglichkeiten, Speicher 
verschiedener Prozesse zu schützen.

Gruß hm

von Peter (Gast)


Lesenswert?

ist es nicht sinnvoller "sauber" mit Pointer zu programmieren als den 
Aufwand mit der MMU zu treiber.

Auch mit einer MMU hast du das Problem das jeder Process seine eigene 
Daten zerlegen kann.

von HMB (Gast)


Lesenswert?

Wenn der Prozess das selber tut, dann soll er das :) Aber er solls 
gefälligst nur bei sich machen und nicht alles in den Sumpf reiten...

Zum Thema "sauber" Programmieren mit Pointern reicht folgender link 
denke ich (entsprechend umfangreiche Software vorausgesetzt): 
http://de.wikipedia.org/wiki/Programmfehler

Grüße

von Peter (Gast)


Lesenswert?

> Wenn der Prozess das selber tut, dann soll er das :) Aber er solls
> gefälligst nur bei sich machen und nicht alles in den Sumpf reiten...

und was hilft das dem anwender? Wenn das gerät nicht mehr macht was es 
soll, dann ist es ziemlich egal ob nur ein Prozess sich selber zerlegt 
hat oder ein Prozess den anderen abgeschossen hat.

Wenn jetzt noch die MMU programmierung dazukommt, dann erhöht es 
eventuell sogar die fehleranfälligkeit weil ja mehr Programmcode 
vorhanden ist, welcher fehler enthalten kann.

von HMB (Gast)


Lesenswert?

Ich kann nicht genauer drauf eingehen, aber es gibt Fälle, in denen es 
dem Anwender etwas bringt ;)

Zum Thema MMU-Programmierung habe ich ja oben bereits geschrieben, dass 
es sich nach viel Arbeit anhört und ich mir wohl besser was anderes 
überlegen sollte. Die Fehler steigen durch händische Nutzung leider mit 
an wie du schon sagst. In dem Fall würde wohl nur eine umfangreiche 
Codeanalyse zumindest des Teils für die Nutzung der MMU helfen.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Peter schrieb:
> und was hilft das dem anwender? Wenn das gerät nicht mehr macht was es
> soll, dann ist es ziemlich egal ob nur ein Prozess sich selber zerlegt
> hat oder ein Prozess den anderen abgeschossen hat.

Ist doch besser wenn z.B. bei einem Handy nur der Browser neu gestartet 
werden muss, als wenn sich das ganze Ding aufhängt.

von HMB (Gast)


Lesenswert?

Ach, warum nicht einfach ein so einsichtiges Beispiel :)

von Peter (Gast)


Lesenswert?

@Andreas Schwarz
wenn es ein browser gibt, gibt es auch ein Betriebssystem. Das ist hier 
aber nicht der fall.
Wenn es kein BS gibt, gibt es da überhaupt verschienden Prozesse? Ich 
würde sagen das es nur ein Prozess gibt mit mehren Threads. Und wenn ein 
Thread sich mit seinem Pointern vertan hat, sollte man lieber das ganze 
programm resetten als versuchen den Thread wiederzubeleben.

von (prx) A. K. (prx)


Lesenswert?

Peter schrieb:

> Wenn es kein BS gibt, gibt es da überhaupt verschienden Prozesse? Ich
> würde sagen das es nur ein Prozess gibt mit mehren Threads.

Wie oben schon skizziert bin ich der Ansicht, dass man sich mit der 
Verwaltung von Threads, zumal solchen mit getrennten Adressräumen, 
automatisch ein mindestens rudimentäres Betriebssystem einhandelt, es 
also Threads ohne Betriebssystem per Definition nicht gibt.

Ob man die Dinger allerdings "Prozesse" oder "Threads" nennt... Diese 
Unterscheidung ist manchmal einfach, manchmal schwierig. In Windows ist 
es einfach: Prozesse sind hinsichtlich Speicher getrennt, Threads teilen 
sich Speicher und andere Resourcen. In Linux ist der Übergang dagegen 
fast fliessend, weil sich beim klonen eines Prozesses fein aufdröseln 
lässt, was genau kopiert und was geteilt werden soll.

Aber vereinfacht würde ich sagen, dass ein eigenständiger Adressraum 
(ebd. MMU) für den Begriff "Prozess" spricht, ein gemeinsamer Adressraum 
für alle eher für "Thread".

von (prx) A. K. (prx)


Lesenswert?

Peter schrieb:

> wenn es ein browser gibt, gibt es auch ein Betriebssystem. Das ist hier
> aber nicht der fall.

Du hast eine sehr merkwürdige Definition von Betriebssystem. Windows 
beispielsweise, aber auch die Linux-Distros, sind längst nicht nur 
Betriebssystem, auch wenn man sie landläufig so nennt, sondern enthalten 
einen Rattenschwanz an mitgelieferten Anwendungen. Ein Browser, egal ob 
für Filesysteme oder für's Internet, ist eine Anwendung, kein Teil eines 
Betriebssystems, auch wenn er auf der CD/DVD mit drauf ist.

Richtig ist wohl, dass man für einen brauchbaren Browser ein 
Betriebssystem braucht, aber umgekehrt gilt das nicht.

von Matthias (Gast)


Lesenswert?

Also wer schießt schon mit einer MMU Kanone auf einen solchen Spatz?

Es gibt uC, die nur eine MPU (Memory Protection Unit) haben. Mit der 
lassen sich die Bereiche (System<->User) trennen. Und wenn es eine 
Zugriffsverletzung gibt, wird eine "Exception" ausgelöst (z.B. bei einem 
ARM
Cortex-M3 System).

Dafür wurde die MMU zur MPU gestutzt. Wenn man eine MMU hat, empfehle 
ich ein
kleines OS, dass die auch nutzt. Vorzugsweise eines, dass nix kostet 
(nicht zwingend bei einem kommerziellen Projekt) und von vielen 
eingesetzt wird. Dann ist die Gefahr eines Fehlers in diesem System 
nicht mehr so groß.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Matthias schrieb:
> Also wer schießt schon mit einer MMU Kanone auf einen solchen Spatz?

Zumindest im ARM Bereich gibt es eine erheblich größere Auswahl an MCU 
mit MMU (z.B. ARM926) als mit MPU (einige Cortex-M3). Man kann sich das 
manchmal nicht einfach aussuchen.

Auch wenn eine MPU tatsächlich keine abgespeckte MMU ist, kann man (z.B. 
für ein RTOS) eine MPU "emulieren", in dem man den page table so anlegt, 
dass jede virtuelle Adresse auf die physikalische Adresse gleichen 
Wertes (VA==PA) verweist und man selbst nur noch Zugriffsrechte 
verwaltet. Bei ARM9 (v5TE) MMUs kann man das recht komfortabel und 
schnell über Domains lösen.

Gruß
Marcus
http://www.doulos.com/arm/

von Peter (Gast)


Lesenswert?

> > wenn es ein browser gibt, gibt es auch ein Betriebssystem. Das ist hier
> > aber nicht der fall.

> Du hast eine sehr merkwürdige Definition von Betriebssystem.

> Richtig ist wohl, dass man für einen brauchbaren Browser ein
> Betriebssystem braucht, aber umgekehrt gilt das nicht.

genau so habe ich es doch geschrieben, wenn es einen brauchbaren browser 
gibt, existiert auch ein Betriebssystem darunter. Ich habe nicht gesagt 
das der Browser zum Betriebssystem gehört.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.