mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MMU manuell nutzen


Autor: HMB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ECU Entwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HMB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HMB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HMB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HMB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, warum nicht einfach ein so einsichtiges Beispiel :)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.