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.
Mit einer [Seitentabelle] (https://en.wikipedia.org/wiki/Page_table). Siehe auch: [Paging] (https://en.wikipedia.org/wiki/Paging). –
Danke, aber was ist mit dem Stapel, Daten, Codesegmente zugewiesen zu verarbeiten. –
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. –