Hallihallo,
ich hab eine spezielle frage zu den 4 linux-segmenten.
Im buch "Understandin The Linux Kernel" steht, dass mitunter
4 hauptsegmente in die GDT eingetragen werden:
ein kernel-data und kernel-code-segment paar mit dpl(descriptor-privilege-level)=0
und ein user-data und user-code-segment paar mit dpl=3.
Die 4 segmente überlappen sich zu 100 % so dass die Basis bei allen
0x00000000 ist und das letzte offset 0xfffff.
in der tabelle welche die einträge des segment-descriptors beschreibt steht unter dpl:
weiter unten steht dann jedoch:
Wieso MUSS muss das ds-register im Kernel Mode ein kernel-data-segment-selector beinhalten?
In der definition zum DPL oben steht doch dass, segmente mit DPL 3 allen CPLs zugriff gewähren.
Somit könnte man doch den user-data-segment-selector im register stehen lassen und sich den switch sparen.
Eigentlich könnte man auf den gesamten kernel-data-segment-descriptor verzichten und immer nur das user-data-segment nutzen,
da sie ja denselben Adressbereich beschreiben.
die trennung von kernel-code und user-code ergibt ja sinn aber
ob CPL nun 3 oder 0 ist hat ja keinen einfluss auf den Datenzugriff,
da mit dem user-data-segment-selector auch mit cpl 3 (mit eingeschränktem befehlsumfang) auf alle Speicheradressen zugegriffen werden kann
und cpl 0 darf sowieso auf alles zugreiffen. Deswegen verstehe ich da die trennung nicht.
Da die eigentliche privilege-level trennung mittles paging geschieht frag ich mich wieso das geswitche sinnvoll sein soll.
Hab ich einen Denkfehler?
Ich hoffe ihr könnt mir weiterhelfen.
ich hab eine spezielle frage zu den 4 linux-segmenten.
Im buch "Understandin The Linux Kernel" steht, dass mitunter
4 hauptsegmente in die GDT eingetragen werden:
ein kernel-data und kernel-code-segment paar mit dpl(descriptor-privilege-level)=0
und ein user-data und user-code-segment paar mit dpl=3.
Die 4 segmente überlappen sich zu 100 % so dass die Basis bei allen
0x00000000 ist und das letzte offset 0xfffff.
in der tabelle welche die einträge des segment-descriptors beschreibt steht unter dpl:
Zitat:
|
Descriptor Privilege Level: used to restrict accesses to the segment. It represents the minimal CPU privilege level requested for accessing the segment. Therefore, a segment with its DPL set to 0 is accessible only when the CPL is 0—that is, in Kernel Mode—while a segment with its DPL set to 3 is accessible with every CPL value. |
Zitat:
|
Whenever the CPL is changed, some segmentation registers must be correspondingly updated. For instance, when the CPL is equal to 3 (User Mode), the ds register must contain the Segment Selector of the user data segment, but when the CPL is equal to 0, the ds register must contain the Segment Selector of the kernel data segment. |
In der definition zum DPL oben steht doch dass, segmente mit DPL 3 allen CPLs zugriff gewähren.
Somit könnte man doch den user-data-segment-selector im register stehen lassen und sich den switch sparen.
Eigentlich könnte man auf den gesamten kernel-data-segment-descriptor verzichten und immer nur das user-data-segment nutzen,
da sie ja denselben Adressbereich beschreiben.
die trennung von kernel-code und user-code ergibt ja sinn aber
ob CPL nun 3 oder 0 ist hat ja keinen einfluss auf den Datenzugriff,
da mit dem user-data-segment-selector auch mit cpl 3 (mit eingeschränktem befehlsumfang) auf alle Speicheradressen zugegriffen werden kann
und cpl 0 darf sowieso auf alles zugreiffen. Deswegen verstehe ich da die trennung nicht.
Da die eigentliche privilege-level trennung mittles paging geschieht frag ich mich wieso das geswitche sinnvoll sein soll.
Hab ich einen Denkfehler?
Ich hoffe ihr könnt mir weiterhelfen.