Macht das Fehlen von MMU einen Unterschied für Anwendungen?

Generisches Linux kann nicht auf Cortex M3 ausgeführt werden, da Cortex M3 keine MMU hat . Okay, es gibt spezielle Versionen von Linux , die dort laufen können.

Das Problem ist, dass ich nicht ganz verstehe, wie sich dies auf die Anwendungssoftware auswirkt.

Angenommen, ich habe eine Anwendung - eine beliebige Benutzeranwendung, sei es als Beispiel ein ZIP-Entpacker. Ich habe es in Quellform und kann es für ARM kompilieren.

Läuft es auf Cortex M3 ohne MMU? Woher weiß ich, ob sich ein Mangel an MMU auf ein bestimmtes Programm auswirkt?

Es ist schon eine Weile her, aber einige Dinge, an die ich mich erinnere, sind, dass es ohne mmu keine Fork-Unterstützung gibt, obwohl es eine andere Funktion namens vfork gibt, die sich "ähnlich" verhalten kann. Auch Malloc-Anfragen können langsamer sein, aber ich denke, sie umgehen das, indem sie den zurückgegebenen Speicher nicht im mmu-Modus initialisieren. Außerdem schützt Sie die MMU, indem sie ungültige Speicherzugriffe abfängt. Ich bin kein Experte, aber daran erinnere ich mich.

Antworten (3)

Es gibt mehrere Dinge, die Ihnen eine MMU bietet:

Speicherschutz: In einer Multitasking-Umgebung verhindert dies, dass ein fehlerhaftes Programm ein anderes Programm beeinträchtigt. Wenn zum Beispiel das fehlerhafte Programm versucht, unter Verwendung eines nicht initialisierten Zeigers in eine Speicherstelle zu schreiben, könnte es Code oder Daten für das gute Programm überschreiben. Der Speicherschutz verhindert dies, indem er Beschränkungen auferlegt, auf welchen Speicher jedes Programm zugreifen kann.

Speicherübersetzung: Die MMU führt eine "Übersetzung von logischen zu physikalischen Speicheradressen" durch. Der Speicher ist normalerweise in Blöcke oder Seiten aufgeteilt. Manchmal, insbesondere nachdem ein Multitasking-System eine Weile gelaufen ist, können die physischen Speicherseiten in diskontinuierliche Blöcke gemischt werden. Die MMU kann diese Seiten neu anordnen, um zusammenhängende virtuelle Speicherblöcke zu erstellen. Stellen Sie sich das wie das Defragmentieren einer Festplatte vor, aber mit Speicher und ohne das zeitraubende Kopieren/Verschieben von Daten.

Virtueller Speicher: Anspruchsvollere Betriebssysteme ermöglichen virtuellen Speicher, bei dem die scheinbare RAM-Menge in einem System größer ist als die physisch installierte. Der zusätzliche Speicher befindet sich normalerweise auf der Festplatte. Wenn ein Programm versucht, auf eine Speicherseite zuzugreifen, die sich physisch nicht im Hauptspeicher befindet, informiert die MMU das Betriebssystem. Das Betriebssystem lädt dann diese Seite des "Speichers" in den Hauptspeicher. Wenn der Hauptspeicher voll ist, wird eine weitere Seite des Hauptspeichers auf die Festplatte übertragen, um Platz zu schaffen. Die MMU und das Betriebssystem tun dies ziemlich schnell und auf eine Weise, dass das Programm, das den Speicherzugriff durchführt, nicht einmal weiß, dass dies geschieht. Dies war früher wichtiger, als Speicher klein und teuer war, aber es wird heute noch für fast alle großen Betriebssysteme verwendet.

MMUs sind am wichtigsten für Multitasking-Systeme. Für Single-Tasking-Systeme und viele eingebettete Anwendungen ist der Wert einer MMU fraglich.

Speicherschutz ist optional für Cortex M3/M4 verfügbar, und zum Beispiel haben die größeren NXP-Controller ihn (LPC17xx, LPC18xx, LPC43xx).

Wenn keine MMU vorhanden ist, muss der Teil des Betriebssystems, der Anwendungsprogramme in den Speicher lädt, in der Lage sein, den Anwendungscode zu "verlagern", damit er in dem ihm zugewiesenen Speicherbereich ausgeführt wird. Der für die Anwendung verwendete Compiler (oder genauer gesagt der Linker) muss eine Datei erzeugen, die der OS-Loader verstehen kann, um dies zu erreichen.

Es sind selten Änderungen im Quellcode der Anwendung erforderlich. Denken Sie jedoch daran, dass Systeme ohne MMUs auch keinen virtuellen Speicher haben, sodass die Anwendung und ihre Daten in den verfügbaren physischen Speicher passen müssen, zusammen mit dem Betriebssystem selbst und allen anderen gewünschten Anwendungen gleichzeitig laufen haben.

So wie ich es verstehe, müssen Sie Ihre Anwendungen für die angegebene Architektur und das Betriebssystem kompilieren .

Im Beispiel von uCLinux benötigen Sie einen kompatiblen Compiler (wie den, den CodeSorcery hier anbietet ) und dann müssten Sie Ihre gewünschten Anwendungen kompilieren, die auf uCLinux und ARMv7-M abzielen. Mein Verdacht ist, dass es durch die gezielte Ausrichtung auf uCLinux auf den Speicherverwaltungscode von uCLinux abzielt, der es ihm ermöglicht, auf Mikrocontrollern/Mikroprozessoren ohne MMU ausgeführt zu werden.