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.
Benötigt 'Hausaufgaben'-Tag? –
Nicht wirklich.;-) –
Keine Updates mehr? –