Hallo,
Und welche Fälle fallen dir ein wo du ne Funktion vom UserMode aus aufrufst die dann nur mit den Daten aus dem UserMode läuft (ich hoffe dir fällt auf wie sinnlos das ist)?
Es geht hier doch um die 4G-Segmente in einem Flat-Memory-System (das Ring-0-Code niemals
nur mit Ring-3-Daten arbeitet ist mir völlig klar, dann würde ja Ring-3-Code reichen). Die 2 typischen Data-Segmente (einmal für Ring 0 und einmal für Ring 3) zeigen doch auf den selben virtuellen Speicher (eben die vollen 4GB) was bedeutet das der User-Mode-Code theoretisch auch volle 4GB ansprechen kann, nur das besagte Flag in dem Page-Descriptoren dient da noch als Schutz. Nur
allein dieses Flag verhindert das Ring-3-Code in den Kernel-Bereich rein kann. Als zusätzliche Sicherheit könnte man noch das Limit in den Ring-3-Descriptoren auf 3GB beschränken aber dann muss man wirklich wechseln.
Ich hab extra noch mal
hier nachgelesen und ich bin schon der Meinung das man bei einem Syscall nicht DS und ES wechseln muss (nur CS und SS werden von der CPU automatisch gewechselt) weil der Kernel im Ring 0 ja trotzdem mit DS und ES (DPL=3 und RPL=3) die gesamten 4GB virtuellen Adressraum ansprechen kann. Selbst beim Paging gibt es keine Probleme weil das von Dir erwähnte Flag ja wimre gegen CPL (und die ist 0 im Kernel weil CS ja automatisch gewechselt wird) geprüft wird.
Es kann natürlich sein das ich mich total irre, meine x86-Kenntnisse sind etwas eingerostet, aber ich bin schon der Meinung das Ring-0-Code auch über ein Ring-3-Segment mit dem Speicher ganz normal arbeiten kann.
Das mit dem Call-Gate ist folgender Gedanke: wenn Ring-3-Code per Call-Gate eine Ring-0-Funktion aufruft (welche dann auch wirklich mit Ring 0 läuft) und dieser einen FAR-Pointer (Selector mit RPL=3 und im Descriptor ist DPL=3) mitgibt so kann doch der Ring-0-Code problemlos mit diesem Pointer auf Speicher zugreifen. Wenn das nicht ginge könnte der Ring-0-Code ja niemals mit den Nutzdaten des Ring-3-Codes arbeiten oder er müsste jedes mal den Selector modifizieren (wegen dem RPL) und auch noch den Decriptor in der GDT/LDT ändern (wegen dem DPL) und das wäre IMHO völlig unpraktikabel.
Ich befürchte ich hab da irgendwo einen Denkfehler, nur wo?
(ich bin doch ziemlich froh mich bei meinen Segmentierungsplänen gegen x86 entschieden zu haben, der ganze CPL/RPL/DPL-Kram macht einen noch ganz verrückt)
Grüße
Erik