2016-06-01 18 views
0

Ich lese über x86 geschützten Modus arbeiten, in dem ich das flache Speichermodell und Segmentierung Speichermodell gesehen habe.Welche Art von Speichermodell (d. H. Flach/Segmentierung) wird von Linux Kernel verwendet?

Wenn der Linux-Kernel ein flaches Speichermodell verwendet, dann wie schützt er den Zugriff von nicht privilegierten Anwendungen auf kritische Daten?

+2

Mit einer [Seitentabelle] (https://en.wikipedia.org/wiki/Page_table). Siehe auch: [Paging] (https://en.wikipedia.org/wiki/Paging). –

+0

Danke, aber was ist mit dem Stapel, Daten, Codesegmente zugewiesen zu verarbeiten. –

+0

Lesen Sie die letzte Bearbeitung von ruthafjord: Die Segmente werden technisch verwendet, um in lineare Adressen zu konvertieren, die dann in der Seitentabelle nachgeschlagen werden. –

Antwort

2

Linux verwendet im Allgemeinen keines von beiden. Auf x86 hat Linux separate Seitentabellen für Userspace-Prozesse und den Kernel. Die Userspace-Seitentabellen enthalten keine Zuordnungen zum Kernelspeicher, wodurch es für User-Space-Prozesse unmöglich ist, direkt auf den Kernelspeicher zuzugreifen.

Technisch gesehen durchlaufen "virtuelle Adressen" auf x86 zuerst die Segmentierung (und werden von logischen Adressen in lineare Adressen konvertiert), bevor sie über die Seitentabellen von linearen Adressen auf physikalische Adressen umgestellt werden. Außer in ungewöhnlichen Fällen wird die resultierende physikalische Adresse durch die Segmentierung nicht im 64-Bit-Modus geändert (die Segmentierung wird nur verwendet, um Merkmale wie die aktuelle Berechtigungsebene zu speichern und Funktionen wie SMEP zu erzwingen).

Ein bekannter "ungewöhnlicher Fall" ist die Implementierung von Thread Local Storage durch die meisten Compiler auf x86, die die FS- und GS-Segmente verwendet, um logische Offsets in den Adressraum zu definieren. Andere Segmente können keine Basen ungleich Null haben und können daher keine Adressen durch Segmentierung verschieben.

+0

Bedeutet dies, dass jedes Mal, wenn mit dem System gearbeitet wird, "virtuelle Adresse" verwendet wird, dann findet an diesen Adressen eine Segmentierung statt und danach ordnet die Hardware die virtuelle Adresse abhängig von der Seitentabelle der physischen Adresse zu. Aber während diese Seite des bestimmten Segments nicht im Speicher vorhanden war, findet dann ein Austausch statt? und ich habe 64-Bit-Modus-Zeile in der obigen Antwort –

+0

nicht verstanden Es ist definitiv verwirrend. Das Verhalten auf x86 hängt vom Modus des Prozessors ab (real/protected/long mode, aka 16bit, 32bit, 64bit Modi. Zusammen mit einer Reihe von subtileren Paging-Modi). Es ist am einfachsten, sich x86 als fehlende Segmentierung vorzustellen (Segmentierung wird nur für subtiles Verhalten verwendet). – ruthafjord

+0

Als Beispiel verwendet x86 im Real-Modus (16-Bit-Modus) nur die Segmentierung. Glücklicherweise müssen die meisten Betriebssysteme nicht damit umgehen, da Bootloader die Steuerung im 32-Bit-Modus abgeben. – ruthafjord