2010-09-30 11 views
5

Während ich durch eine Embedded-Prozessor-Architektur ging, habe ich die Block-MMU gesehen und es wird hauptsächlich über die Speicherschutzfunktionalität erwähnt.Wie MMU (Memory Management Unit) Einheit in einem Prozessor die Speichersegmente schützt

Darf ich wissen,

Wie ein MMU diesen Schutz tut und warum ist sie nötig? Was bedeutet Speicherschutz?

Was sind andere Anwendungen von MMU als Schutz (wie virtuelle Adressierung)?

Bitte berücksichtigen Sie ein Embedded-System ohne Betriebssystem.

__Kanu

+0

Benötigt 'Hausaufgaben'-Tag? –

+0

Nicht wirklich.;-) –

+0

Keine Updates mehr? –

Antwort

14

Für Prozessoren, die Speicher verwenden (die meisten von ihnen) gibt es eine Speicherschnittstelle irgendeiner Art, einige haben Namen (wie Amba, Axi, Querlenker), manche nicht. Aus Sicht der Prozessoren ist dies die Adresse und die Daten und bitte lesen oder schreiben Sie, was sich an dieser Adresse befindet. In den guten alten Tagen hätten Sie einen einzigen Bus und Ihr Flash und RAM und Peripheriegeräte würden in diesem Bus sitzen und bestimmte (gewöhnlich obere) Bits der Adresse betrachten, um festzustellen, ob sie adressiert waren und wenn ja, dann lesen oder springen Sie weiter der Datenbus bleibt ansonsten Tristated. Je nach dem Chip usw. passiert ein Teil dieser Speicherdecodierung in oder in der Nähe des Kerns, und Ihre öffentliche Schnittstelle zum Kern oder Chip könnte mehrere Busse sein, es könnte einen spezifischen Flash-Bus und einen spezifischen SRAM-Bus und einen speziellen DRAM geben Bus usw.

Also das erste Problem, das Sie mit einem flachen linearen Adressraum haben, auch wenn in Flash und Ram aufgeteilt, der Ram-Teil ist flach, Adresse 0 bis N-1 für N Bytes. Für ein nicht eingebettetes Betriebssystem, um Menschen das Leben leichter zu machen, wenn es nur eine Möglichkeit für Programme gab, die alle bei Adresse 0 oder Adresse 0x100 oder Adresse 0x8000 begannen, anstatt irgendwie für den nächsten freien Speicher kompiliert zu werden Space ist, oder das Betriebssystem muss ein Programm nicht vollständig aus dem unteren Speicherbereich verschieben und es durch einen anderen ersetzen, wenn es zu einem Taskwechsel kommt. Ein alter einfacher Weg war es, das Segment-Offset-Schema von Intel zu verwenden. Programme haben immer an der gleichen Stelle begonnen, weil das Code - Segment vor dem Start des Programms angepasst wurde und der Offset für die Ausführung verwendet wurde (sehr vereinfachte Ansicht dieses Modells), wenn das Wechseln zwischen Programmen nur das Code - Segment ändert nächstes Programm. Ein Programm könnte an Adresse 0x1100 sein und ein anderes an 0x8100, aber beide Programme denken, dass sie an Adresse 0x0100 sind. Einfach für alle Entwickler. MMUs bieten die gleiche Funktionalität, indem sie diese Adresse auf den Prozessorbus nehmen und sie als virtuelle Adresse bezeichnen. Der MMU sitzt normalerweise nahe am Prozessor zwischen der Speicherschnittstelle des Prozessors und dem Rest des Chips/der Welt. Also könntest du wieder sehen, dass die Adresse 0x0100 in einer Tabelle angezeigt wird und zur physikalischen Adresse 0x0100 geht, dann änderst du die Tabelle, wenn du den Task wechselst, so dass der nächste Abruf von 0x0100 zu 0x1100 geht. Jedes Programm denkt, dass es an der Adresse 0x0100 arbeitet, das Verknüpfen, Kompilieren, Entwickeln, Laden und Ausführen von Code ist weniger schmerzhaft.

Das nächste Feature ist Caching, Speicherschutz, usw. Der Prozessor und sein Speichercontroller können einige Adressen dekodieren, bevor sie die mmu erreichen, vielleicht bestimmte Kernregister und vielleicht die mmu-Steuerungen selbst. Aber andere Dinge wie Speicher und Peripheriegeräte können auf der anderen Seite des MMU angesprochen werden, auf der anderen Seite des Caches, der oft die nächste Schicht der Zwiebel außerhalb des mmu ist. Wenn Sie zum Beispiel Ihren seriellen Port abfragen, um zu sehen, ob ein anderes Byte verfügbar ist, möchten Sie nicht, dass der Datenzugriff zwischengespeichert wird, so dass der erste Lesevorgang des Status-Registers des seriellen Ports tatsächlich auf dem physischen Bus endet und den seriellen Port und dann alle berührt Nachfolgende Lesevorgänge lesen die veraltete Version im Cache. Sie wollen dies für Ram-Werte, den Zweck des Caches, aber für flüchtige Dinge wie Status-Register ist das sehr schlecht. Abhängig von Ihrem System können Sie den Datencache wahrscheinlich erst aktivieren, wenn die MMU aktiviert ist.Die Speicherschnittstelle auf einem ARM hat zum Beispiel Steuerbits, die angeben, um welche Art von Zugriff es sich handelt, ob es sich um einen nicht cachefähigen Zugriff, einen Cache-Speicher, einen Teil eines Bursts oder dergleichen handelt. So können Sie das Zwischenspeichern von Anweisungen unabhängig vom Daten-Caching aktivieren und ohne das MMU werden diese Steuersignale direkt an den Cache-Controller weitergegeben, der dann mit der Außenwelt verbunden ist (falls er die Transaktion nicht gehandhabt hat). So kann Ihr Befehlsabruf zwischengespeichert werden, alles andere wird nicht zwischengespeichert. Um Daten-Ram-Zugriffe, aber nicht Status-Register von der seriellen Schnittstelle zwischenzuspeichern, müssen Sie die Tabellen für die mmu einrichten. In Ihrer eingebetteten Umgebung können Sie den Ram einfach eins zu eins zuordnen, dh die Adresse 0x1000 virtual wird 0x1000 physical , aber Sie können jetzt das Daten-Cache-Bit für diesen Teil des Speichers aktivieren. Dann können Sie für Ihre serielle Schnittstelle virtuelle physikalische Adressen zuordnen, aber Sie löschen das Daten-Cache-Aktivierungsbit für diesen Teil des Speicherplatzes. Jetzt können Sie den Datencache aktivieren, Speicherlesevorgänge werden jetzt zwischengespeichert (weil die Steuersignale beim Durchlaufen der mmu als solche gekennzeichnet sind, aber für Ihren Registerzugriff die Steuersignale nicht speicherbar anzeigen).

Sie müssen sicherlich nicht virtuell zu physischen eins zu eins zuordnen, hängt von eingebetteten oder nicht eingebettet, Betriebssystem oder nicht, etc. Aber das ist, wo Ihr Schutz kommt. Am einfachsten in einem Betriebssystem zu sehen. Eine Anwendung auf der Anwendungsebene sollte nicht in den geschützten Systemspeicher, den Kernel usw. gelangen. Sollte nicht in der Lage sein, den Speicherplatz anderer Anwendungen zu überlisten. Wenn die Anwendung also eingeschaltet wird, geben die MMU-Tabellen an, auf welchen Speicher zugegriffen werden darf und auf welchen Speicher nicht zugegriffen werden darf. Jede vom Programm nicht erlaubte Adresse wird von der MMU abgefangen, eine Ausnahme/Störung (Interrupt) wird erzeugt und der Kernel/Supervisor bekommt die Kontrolle und kann mit diesem Programm umgehen. Sie erinnern sich vielleicht an den Begriff "general protection fault" aus den früheren Windows-Tagen, bevor Marketing und andere Interessengruppen im Unternehmen beschlossen haben, den Namen zu ändern, war es gerade aus dem Intel-Handbuch, dass Interrupt ausgelöst wurde, als Sie einen Fehler hatten das fiel nicht in andere Kategorien, wie eine Multiple-Choice-Frage auf einen Test A bob, B ted, C alice, D keine der oben genannten. Der allgemeine Schutzfehler war der keine der oben genannten Kategorien, aber der am meisten getroffene, weil Sie das bekommen, wenn Ihr Programm versuchte, auf Speicher oder I/O außerhalb seines zugewiesenen Speicherplatzes zuzugreifen.

Ein weiterer Vorteil von mmus ist Malloc. Vor dem MMUS musste die Speicherzuweisung Schemata verwenden, um Speicher neu anzuordnen, um große leere Blöcke in der Mitte zu halten. für den nächsten großen malloc, um die "mit 4meg frei zu minimieren warum hat mein 1kbyte allok versagt?". Jetzt, wie eine Festplatte, hackt man Speicherplatz in diese 4kByte oder einige solcher Größe Chunks. Ein Malloc, das einen Chunk oder weniger groß ist, einen freien Chunk im Speicher nimmt, verwendet einen mmu-Tabelleneintrag, um darauf zu zeigen und dem Anrufer die virtuelle Adresse zu geben, die mit diesem mmu-Eintrag verknüpft ist. Sie wollen 4096 * 10 Bytes, der Trick besteht nicht darin, so viel linearen Speicher zu finden, sondern 10 lineare MMU-Tabelleneinträge zu finden, beliebige 10 Speicherblöcke zu nehmen (nicht notwendigerweise benachbart) und ihre physikalischen Adressen in die 10 mmu-Einträge zu schreiben.

Die Quintessenz, "wie" es ist, dass es in der Regel zwischen dem Prozessor und dem Cache sitzt oder wenn kein Cache den physikalischen Speicherbus. Die mmu-Logik betrachtet die Adresse und verwendet diese, um in eine Tabelle zu schauen. Die Bits in der Tabelle umfassen die physikalische Adresse plus einige Steuersignale, die cachefähig sind, und eine Art, anzugeben, ob dies ein gültiger Eintrag oder eine geschützte Region ist. Wenn diese Adresse geschützt ist, löst das MMU einen Interrupt/ein Ereignis zurück zum Kern aus. Wenn es gültig ist, modifiziert es die virtuelle Adresse, um die physikalische Adresse auf der anderen Seite/außerhalb der mmu zu werden, und Bits wie das zwischenspeicherbare Bit werden verwendet, um zu sagen, was auf der anderen Seite der MMU ist, welche Art von Transaktion dies ist, Anweisung, Daten, cachefähig, burst usw. Für ein eingebettetes non-os Single-Tasking-System benötigen Sie möglicherweise nur eine einzige mmu-Tabelle. Ein schneller Weg in einem Betriebssystem, um beispielsweise Schutz durchzuführen, wäre eine Tabelle pro Anwendung oder eine Teilmenge der Tabelle zu haben (der Baum ähnelt einer Verzeichnisstruktur), so dass Sie beim Wechseln nur eines ändern müssen: der Beginn der Tabelle oder der Beginn eines Zweiges des Baums, um die virtuellen zu physikalischen Adressen und den zugewiesenen Speicher (Schutz) für diesen Zweig des Baums zu ändern.

+0

Das macht wirklich den richtigen Sinn über das MMU-Konzept. Danke! –

+0

zu den Gedanken auf Malloc hinzuzufügen, weil Sie in einem virtuellen Adressraum sind, der viel größer sein kann als die Menge an physischem Speicher, die Sie haben, haben Sie eine bessere Chance, lineare mmu Tabelleneinträge zu finden. Es ist nicht ein Fall, in dem Sie 100 * 4096 Bytes Speicher im Heap haben, um direkt mit physischem Zugriff zu verwalten, und jetzt haben Sie nur 100 mmu Tabelleneinträge im selben System, Sie können viele Hunderte mmu Tabelleneinträge mit denen zu haben Verwalten Sie diese 100 Blöcke physischen Speichers. –

3

Speicherschutz bedeutet, dass jeder Prozess auf einem System läuft in einem eigenen virtuellen Adressraum im Wesentlichen wissen, läuft jeder Prozess, als ob es ein System Hauptspeicher alle zu sich selbst hat. Dies bedeutet auch, dass ein Prozess den Speicher, der für einen anderen Prozess reserviert ist, nicht ändern kann. Dies ist entscheidend für die Systemstabilität und Sicherheit (beispielsweise kann ein Programm nicht einfach durch den Systemspeicher scannen, um das gerade eingegebene Passwort zu finden).

Es gibt viele, viele andere Funktionen, die von einer MMU zur Verfügung gestellt werden (virtueller Speicher, dynamischer Umzug, usw.).

Das ist was und warum. Um "wie" zu beantworten, sollten Sie etwas weiter gehen reading.

7

Die MMU (Memory Management Unit) ist ein grundlegender Block von Systemen, die getrennte und geschützte Speicherbereiche haben wollen. Ich werde das einfach halten, da ganze Bücher über Speichermanagementhardware und -strategien geschrieben werden können ...

Ohne Schutz könnte ein Programm, das in irgendeinem Prozess läuft, auf den Speicher irgendeines anderen Prozesses zugreifen können. Selbst wenn Sie die Sicherheitsimplikationen ignorieren, bedeutet dies, dass ein Fehler in einem Programm den Speicher überschreiben könnte, der zu einem anderen Prozess gehört. Es ist nicht einfach, diese Klasse von Problemen zu debuggen, da die Symptome sehr weit von der Ursache entfernt sind.

Daher ist eine Art Organisationsprinzip erforderlich, damit jeder Prozess nur den ihm zugewiesenen Speicher sehen und ändern kann. Und weil Fehler auftreten, ist es wichtig, dass diese Organisation von der Hardware unterstützt wird, so dass selbst ein versehentlicher Zugriff auf den falschen Teil des Speichers schwierig ist.

Ein Vorteil davon ist, dass es auch möglich wird, die Speicherzuordnung jedes Prozesses identisch erscheinen zu lassen. Der Linker kann jedes Programm an der gleichen Startadresse lokalisieren, Stack und Heap in vorhersagbare Bereiche stellen und Speicher für die Interaktion mit dem Kernel reservieren.

Die MMU ist die Hardwarekomponente, die die Übersetzung von den logischen Adressen implementiert, die ein Prozess verwendet, zu den physischen Adressen, die die Hardware verwendet. Es bietet auch Sicherheitsfunktionen wie das Markieren nur einiger Teile des Speichers als ausführbar. Es stellt die Datenstrukturen bereit, die der Kernel zum Implementieren von Prozessaustausch und virtuellem Speicher benötigt, so dass die zu Prozess A gehörenden Speicherseiten von Prozess B nicht einmal gesehen werden können, aber A und B vom vertrauenswürdigen Kernel gesehen werden können.

Um dies auf praktische Weise zu erreichen, ist der physische Speicher in Seiten unterteilt, die normalerweise 4 KB groß sind. Jede logische Adresse ist in eine Seitennummer und einen Offset unterteilt. Die Seitenzahlen indexieren eine Tabelle in der MMU, die jede logische Seite in eine physikalische Adresse übersetzt. Diese Übersetzung findet während jedes Speicherzugriffszyklus statt. Eine einzelne physische Seite kann in keine Prozesse (genau genommen in einem Pool von freien Seiten in diesem Fall), genau eine oder mehrere, abgebildet werden.

Der Stapel, die Daten und der Heap eines Prozesses bestehen im Allgemeinen aus Seiten, die genau diesem einen Prozess zugeordnet sind. Dies hilft zu verhindern, dass ein Fehler in einem Prozess andere beeinflusst, da jeder Prozess nur auf seine eigenen Stack-, Daten- und Heap-Seiten schreiben kann.

Wenn dieselbe Seite des physischen Speichers mehreren Prozessen zugeordnet ist, ist sie für diese sichtbar. So wird eine DLL unter Windows oder ein .so unter Unix geteilt: Die Seiten, die ihren Programmtext enthalten, werden in jeden Prozess eingeordnet, der damit verknüpft ist.

Die MMU verfügt über einen Mechanismus, der eine Ausnahme auslöst, wenn auf eine Seite zugegriffen wird, die keinem Prozess zugeordnet wurde. Die Behandlung dieser Ausnahme ermöglicht die Implementierung von virtuellem Speicher und die Erhöhung der Speichermenge, die einem Prozess zugewiesen wird, wenn sich seine Anforderungen ändern.

+1

Ok. Was ist dann mit einem System ohne Betriebssystem zur Unterstützung der MMU? das bedeutet, wie die MMU in einem Embedded-System ohne Betriebssystem definiert ist? –

+2

@Renjith G: Ohne ein Betriebssystem würden Sie die MMU in der Regel zu einem einzigen Adressraum konfigurieren, oft mit direkter physischer = virtueller Zuordnung. Es ist möglich, dass Sie den Coderaum als schreibgeschützt konfigurieren, um ihn vor zufälligen oder böswilligen Änderungen zu schützen. Da jedoch kein Betriebssystem oder RTOS eine einzelne Thread-/Prozessoperation erfordert, ist die Fähigkeit, einen Thread zu schützen oder einen Datenbereich von einem anderen zu verarbeiten, kein Problem. – Clifford

+0

Danke für den Kommentar. –

Verwandte Themen