Nach meinem Verständnis ist der virtuelle Speicher wie folgt:
Programme / Anwendungen / ausführbare Dateien befinden sich auf einem Speichergerät. Der Speichergerätezugriff ist viel langsamer als der RAM. Daher werden Programme zur Ausführung aus dem Speicher in den Hauptspeicher kopiert. Da Computer über begrenzten Hauptspeicher (RAM) verfügen, wenn der gesamte RAM verwendet wird (zB wenn viele Programme gleichzeitig geöffnet sind oder wenn ein sehr großes Programm verwendet wird), tauscht ein Computer mit aktivem virtuellem Speicher Daten aus HDD und zurück zum Speicher nach Bedarf, so dass tatsächlich der gesamte Systemspeicher erhöht.
Soweit ich weiß, haben die meisten Embedded-Geräte keinen Festplattenspeicher (wie Smartphones oder in Infotainment-Systemen für Autos). Der Code wird direkt aus dem Flash-Speicher ausgeführt. RAM wird hauptsächlich als Scratchpad-Bereich verwendet (lokale Variablen, Rücksprungadresse usw.).
Warum brauchen wir also virtuellen Speicher in eingebetteten Systemen? (z. B. WinCE und QNX unterstützen virtuellen Speicher)
Ihr Verständnis ist völlig falsch. Sie verwechseln den virtuellen Speicher mit Auslagerungsdateien oder Auslagerungsdateien. Es gibt Systeme, die virtuellen Speicher und keine Swap- oder Auslagerungsdateien haben, und es gibt Systeme, die ohne virtuellen Speicher austauschen.
Virtueller Speicher bedeutet nur, dass ein Prozess eine Sicht auf den Speicher hat, die sich von der physischen Zuordnung unterscheidet. Unter anderem ermöglicht es Prozessen, ihren eigenen virtuellen Adressraum zu haben.
Der Zugriff auf Speichergeräte ist viel langsamer als der RAM. Daher werden Programme aus dem Speicher in den Hauptspeicher zur Ausführung kopiert. Da Computer über begrenzten Hauptspeicher (RAM) verfügen, wenn der gesamte RAM verwendet wird (zB wenn viele Programme gleichzeitig geöffnet sind oder wenn ein sehr großes Programm verwendet wird), tauscht ein Computer mit aktivem virtuellem Speicher Daten aus HDD und zurück zum Speicher nach Bedarf, so dass tatsächlich der gesamte Systemspeicher erhöht.
Das ist Swapping (oder Paging). Es hat nichts mit virtuellem Speicher zu tun, außer dass die meisten modernen Betriebssysteme Swapping mit virtuellem Speicher implementieren. Swapping existierte eigentlich vor virtuellen Speicher.
Ich denke, Sie sind wahrscheinlich falsch, wenn diese Geräte Code direkt aus dem Flash-Speicher ausführen. Die Lesegeschwindigkeit des Flash ist ziemlich niedrig und RAM ist sehr billig. Meine Wette ist, dass die meisten Systeme, die Sie erwähnen, Code nicht direkt aus dem Flash ausführen und statt dessen virtuellen Speicher verwenden, um den Code nach Bedarf in den RAM zu schreiben.
Embedded Systems hat der Begriff selbst eine breite Palette von Anwendungen. Sie könnten einen kleinen Mikrocontroller mit Flash-Programm-Speicherplatz in KB oder weniger und Ram in Bits oder Bytes (nicht genug, um kbytes) ein eingebettetes System zu nennen. Ebenso ein Tivo, das ein vollwertiges Betriebssystem auf einem ziemlich voll durchgebrannten Computer-Motherboard (ersetzt Tivo mit xbox als ein anderes Beispiel) als ein eingebettetes System betreibt. Sie müssen also weniger vage über Ihre Frage sein. virtueller Speicher hat wenig damit zu tun, dass seine Anwendungen diese Grenzen überschreiten.
Es gibt viele Antworten oben, David S hat das Beste natürlich, dass virtueller Speicher einfach bedeutet, dass die Speicheradresse auf einer Seite der virtuellen Speichergrenze anders ist als die physikalische Adresse, die auf der anderen Seite dieser Grenze verwendet wird. Wo, wie, warum usw. gibt es eine Grenze.
Eine beliebte Verwendung für virtuellen Speicher, und ich könnte argumentieren, dass ein primärer Anwendungsfall für Betriebssysteme ist. Ein Vorteil besteht darin, dass zum Beispiel alle Anwendungen für den gleichen Adressraum kompiliert werden könnten, alle Anwendungen könnten so kompiliert werden, dass sie aus Sicht der Programme alle bei der Adresse 0x8000 beginnen und soweit dieses Programm läuft und auf Speicher zugreift, auf den es zugreift Sachen basierend auf dieser Adresse. Eine Kombination der Hardware und des Betriebssystems ändert diese virtuelle Adresse, die das Programm verwendet, zu einer physikalischen Adresse. Wenn das Betriebssystem Multitasking zulässt, dann könnte jede Aufgabe denken, dass sie sich im selben Adressraum befinden, aber die physischen Adressen sind für jede dieser Aufgaben unterschiedlich. Ich werde nicht näher darauf eingehen, warum die Verwendung eines angenommenen festen Adressraums ein Vorteil ist. Ein anderer Aspekt, den Betriebssysteme verwenden, ist Speicherverwaltung. Bei vielen MMUs können Sie den Speicher jedoch segmentieren. Wenn ein Benutzer 100 Megabyte Speicher reservieren möchte, kann das Programm in seinem virtuellen Adreßraum auf 100 Megabyte zugreifen, als ob es linear wäre, und in diesem Adreßraum ist es linear, aber 100 Megabyte könnten in etwa 4 Kilobyte große Brocken zerlegt werden verstreut über den physischen Adressraum, nicht immer wahrscheinlich, aber sicherlich technisch möglich, dass keine zwei Teile dieses physikalischen Speichers neben jedem anderen Teil dieser 100 Meg. liegen. Ihr Speichermanagement muss nicht unbedingt versuchen, große physische Speicherbereiche für Anwendungen verfügbar zu halten. Beachten Sie, dass nicht alle MMUs genau gleich sind und 4 KBytes nur ein Beispiel sind. Ein dritter großer Vorteil des virtuellen Adressraums für ein Betriebssystem ist der Schutz. Wenn die Anwendung an den virtuellen Adressraum gebunden ist, ist es oft ziemlich einfach zu verhindern, dass diese Anwendung den Speicher einer anderen Anwendung oder des Betriebssystems berührt. die Anwendung würde in diesem Fall auf einer Profectebene arbeiten / ausführen, so dass alle Zugriffe als virtuell betrachtet werden und eine Übersetzung in physisch durchlaufen werden müssen, wobei die Tabellen, die zum Definieren dieses virtuellen zu physischen verwendet werden, Schutzflags enthalten können. Wenn die Anwendung eine Speicheradresse in ihrem virtuellen Bereich adressiert, auf die sie keinen Zugriff hat, kann die Hardware dies abfangen und das Betriebssystem veranlassen, Maßnahmen zu ergreifen (Virtualisierung einiger Hardware, Aufrufen eines Fehlers und Beenden der App). Popup eine Warnung und nicht die App zu töten, aber gleichzeitig die App gefälschte Daten für ihre Transaktion, usw.) Feed.
Es gibt viele Möglichkeiten, wie dies in einem eingebetteten System verwendet werden kann. Zunächst viele Embedded-Systeme laufen Betriebssysteme, so dass alle der oben genannten, einfache Erstellung des Programms für den Adressraum, relative Leichtigkeit der Speicherverwaltung und der Schutz der anderen Anwendungen und Betriebssystem und andere nicht erwähnte Vorteile. (Virtualisierung ist eine, in der Lage zu sein, das Instruktionen / Daten-Caching blockweise zu aktivieren / zu deaktivieren, ist ein anderes)
Aber das Entscheidende ist, worauf David S hingewiesen hat. virtueller Speicher bedeutet einfach, dass die virtuelle Adresse nicht unbedingt gleich der physischen Adresse ist, sie kann es sein, muss aber nicht, es gibt eine Grenze, eine Hardware, normalerweise tabellengesteuert, die die virtuelle Adresse in eine physikalische Adresse übersetzt. Es gibt viele Gründe, warum Sie dies tun möchten, da einige eingebettete Systeme nicht von nicht eingebetteten Systemen zu unterscheiden sind. Jeder Grund, der für ein nicht eingebettetes System gilt, kann auf ein eingebettetes System angewendet werden.
So sehr die Leute vielleicht wollen, dass Sie glauben, dass ein System einen flachen Adressraum hat, ist es oft eine Illusion. In einem Mikrocontroller zum Beispiel könnten Sie mehrere Flash-Bänke und eine oder mehrere RAM-Bänke haben. Jede dieser Banken hat eine physikalische, im Allgemeinen auf Null basierende Adresse. Selbst wenn es keine mmu oder irgendetwas anderes gibt, gibt es irgendwo zwischen dem Adressenbus auf dem Prozessor und dem Adressenbus auf dem Flash- oder RAM-Speicher, der die Adresse auf dem Prozessor dekodiert und diese verwendet, um in die spezifische Speicherbank zu adressieren .Oft passen die unteren Bits zusammen und die oberen Bits sind für die Bankauswahl verantwortlich (dies ist oft auch bei einem mmu der Fall), in diesem Sinne lebt der Prozessor in einem virtuellen Adressraum. (nicht beschränkt auf Mikrocontroller, dies ist in der Regel, wie Prozessoren Adresse Busse behandelt werden) Mit Mikrocontrollern abhängig von einem Pin hoch oder niedrig gezogen oder ein anderer Mechanismus Sie möglicherweise eine Chip-Funktion, die eine Flash-Bank zum Starten des Prozessors oder verwendet werden kann Ein weiterer. Sie können einen Eingangs-Pin auf "high" setzen und die im Bootloader eingebauten Prozessoren ermöglichen es Ihnen, auf das System zuzugreifen und es zu debuggen, um beispielsweise den Anwendungs-Flash neu zu programmieren. Oder binden Sie diese Zeile möglicherweise niedrig und starten Sie den Anwendungs-Flash anstelle des Debuggers / Boot-Flash des Herstellers. Einige Chips werden sogar komplizierter, so dass man einen Flash booten kann. Dann schreibt das Programm irgendwo ein Register und verändert so die Speicherarchitektur, indem man Dinge bewegt, zum Beispiel erlaubt man RAM für die Interrupt-Vektortabelle zu verwenden, so dass man nach dem Booten die Anwendung ändern kann Vektortabelle im Flash, die nicht so einfach nach Belieben geändert werden kann.
Wenn Sie jetzt über den virtuellen Speicher sprechen, wenn Sie von und zu einer Festplatte wechseln, ist dies ein Trick, der oft von Betriebssystemen verwendet wird, um die Illusion zu erzeugen, mehr RAM zu haben. Ich habe das oben in der Kategorie Virtualisierung erwähnt. virtueller Speicher in dem Sinne, dass es nicht wirklich da ist, ich habe X Bytes, aber lasse die Software denken, dass Y Bytes (wobei Y größer als X ist) verfügbar sind. Das Betriebssystem über die virtuellen Tabellen, die von der Hardware verwendet werden, verwaltet, welche Speicherabschnitte mit physischem RAM verbunden sind und wie von der Hardware ausgeführt werden können oder als nicht verfügbar markiert sind, was eine Ausnahme vom Betriebssystem verursacht, Bei der Überprüfung stellt das Betriebssystem fest, dass dies eine gültige Adresse für diese Anwendung ist, aber die Daten hinter dieser Adresse wurden auf die Festplatte ausgelagert. Das Betriebssystem findet dann durch irgendeinen Algorithmus einen anderen Block des Widders, der zu wem gehört (Teil des Algorithmus), und kopiert diesen Block von RAM auf Platte, markiert die mit diesem in Beziehung stehende Tabelle mit physikalisch als ungültig und kopiert dann den gewünschten Block aus Festplatte zu rammen, markiert diesen Chunk als gültig und lässt die Hardware den Speicherzyklus vollenden.
Nicht anders als sagen, wie vmware oder andere virtuelle Maschinen arbeiten. Sie können native Anweisungen auf der Hardware mithilfe von virtuellem Speicher ausführen, bis Sie eine Ausnahme verursachen. Die virtuelle Maschine könnte eine xyz-Netzwerkschnittstelle und möglicherweise einen Treiber haben, der auf ein Register in dieser xyz-Netzwerkschnittstelle zugreift Wenn Sie keine xyz-Hardware haben und / oder nicht möchten, dass die Anwendungen der virtuellen Maschine auf diese Hardware zugreifen, virtualisieren Sie sie, fangen Sie diesen Registerzugriff ein und verwenden Sie Software, die die gefälschte Hardware simuliert und das Programm auf dem virtuellen Rechner ablaufen lässt Maschine weitermachen. Dies ist natürlich nicht der einzige Weg, um virtuelle Maschinen zu machen, aber es ist eine Möglichkeit, wenn die Hardware es unterstützt, eine virtuelle Maschine sehr schnell laufen zu lassen als Prozentsatz der Zeit, während der sie tatsächlich Befehle auf der Hardware ausführt. Der langsamste Weg zur Virtualisierung ist natürlich die Virtualisierung von allem einschließlich des Prozessors, jeder Befehl würde in diesem Fall simuliert werden, dies ist ziemlich langsam, hat aber seine eigenen Eigenschaften (Virtualisierung eines Armsystems auf einem x86 oder x86 auf einem Arm, xyz auf einem abc, fülle die Lücken ein). Und wenn das der Typ von virtuellem Speicher ist, über den Sie in einem eingebetteten System sprechen, gut, wenn das eingebettete System größtenteils von einem nicht eingebetteten System (beispielsweise einer Xbox oder Tivo) nicht unterscheidbar ist, dann aus den gleichen Gründen könnte so etwas zulassen. Wenn Sie auf einem Mikrocontroller wären, würden die Anwendungsfälle im Allgemeinen bedeuten, dass Sie, wenn Sie mehr Speicher benötigen, einen größeren Mikrocontroller kaufen oder dem System mehr Speicher hinzufügen oder die Anforderungen der Anwendung so ändern würden, dass nicht so viel Speicher benötigt wird . Es kann Ausnahmen geben, aber es hängt hauptsächlich von Ihrer Anwendung und Ihren Anforderungen ab, ein allgemeines oder allgemeines System, das es Anwendungen oder deren Daten erlaubt, größer als der verfügbare RAM zu sein, wird eine Art Lösung erfordern. der Mikrocontroller in Ihrem Keyless-Entry-Key-Fob-Ding oder in Ihrem TV-Fernbedienung oder Radiowecker oder was auch immer normalerweise hätte keine Notwendigkeit, "Anwendungen" benötigen mehr Ressourcen als physisch da sind.
Der wichtigere Vorteil der Verwendung von virtuellem Speicher besteht darin, dass jeder Prozess seinen eigenen Adressraum erhält, der von jedem anderen Prozess isoliert ist. Auf diese Weise trägt der virtuelle Speicher dazu bei, Fehler einzugrenzen und die Sicherheit und Stabilität zu verbessern. Ich sollte beachten, dass es immer noch für zwei Prozesse möglich ist, ein wenig Speicher freizugeben, um die Kommunikation zu erleichtern (shared mem IPC).
Sie können auch andere Tricks wie Speichern von Speicher durch Zuordnen von freigegebenen Teilen in mehr als einen Prozess (libc kommt für eingebettete Verwendung) Adressraum, aber nur einmal im physischen Speicher haben. Auch dies gibt ihm eine Geschwindigkeitssteigerung, Sie können es sogar weiter verbessern, so wie es Linux macht, indem es nur die Kernel-Deskriptoren kopiert und das Speicherabbild allein lässt, bis der erste Schreibzugriff mit einer ähnlichen Idee erfolgt. p>
Als letzter Vorteil ist es in modernen Systemen üblich, Datei-I / O über das Mapping der Datei in den Prozessraum zu machen (vgl. fork/clone
zum Beispiel).
Es ist interessant zu bemerken, dass man einige der Vorteile von "virtuellem Speicher" erhalten kann, ohne eine vollwertige MMU zu benötigen. Die Hardwareanforderungen können manchmal erstaunlich gering sein. Der PIC 16C505 hat einen 5-Bit-Adressraum und 40 Byte RAM; Adressen 0x10 bis 0x1F können einer von zwei Gruppen von 16 Bytes RAM zugeordnet werden. Beim Schreiben einer Anwendung, die zwei unterschiedliche Datenströme verwalten musste, ordnete ich an, dass alle Variablen, die einem Datenstrom zugeordnet sind, in der ersten Gruppe von 16 "schaltbaren" Speicherplätzen wären, und diejenigen, die dem anderen zugeordnet waren Adressen in der zweiten Gruppe. Ich könnte dann den gleichen Code verwenden, um beide Datenströme zu verwalten. Setzen Sie einfach das Bank-Bit in eine Richtung, rufen Sie die Routine auf, stellen Sie sie in die andere Richtung ein und rufen Sie die Routine erneut auf.
Tags und Links embedded