Verwendung der LDT (Local Descriptor Table)

8

Ich versuche, neben den Standard-Code- und Datenbenutzer- und Kernelsegmenten einige Experimente mit verschiedenen Segmenten durchzuführen. Ich hoffe, dies durch Verwendung der lokalen Deskriptor-Tabelle und des Systemaufrufs modify_ldt zu erreichen. Durch den Systemaufruf habe ich einen neuen Eintrag in LDT erstellt, der ein Segmentdeskriptor mit einer Basisadresse einer globalen Variable ist, die ich "isolieren" möchte, und einem Limit von 4 Bytes.

Ich versuche, das Datensegmentregister mit dem Segmentselektor meines benutzerdefinierten LDT-Eintrags durch Inline-Assembly in einem C-Programm zu laden, aber wenn ich versuche, auf die Variable zuzugreifen, erhalte ich einen Segmentierungsfehler.

Mein Verdacht ist, dass es ein Problem mit dem Offset meiner globalen Variablen gibt, und wenn die Adresse berechnet wird, überschreitet sie das Limit meines benutzerdefinierten Segments und verursacht daher einen seg-Fehler.

Kennt jemand eine Arbeit um diese Situation herum?

Oh, übrigens, das ist auf einer x86-Architektur in Linux. Das ist das erste Mal, dass ich eine Frage wie diese in einem Forum stelle. Wenn es also andere Informationen gibt, die sich als nützlich erweisen könnten, lass es mich wissen.

Vielen Dank im Voraus.

Edit: Ich habe festgestellt, dass ich den Quellcode wahrscheinlich einfügen sollte:)

%Vor%

Der Seg-Fehler tritt bei diesem letzten Befehl auf.

    
Brian 20.11.2009, 15:17
quelle

1 Antwort

6

Ich kann nur raten, da mir die Baugruppe nicht zur Verfügung steht.

Ich vermute, dass die Zeile, in der Sie einen segfault erhalten, zu etwas wie:

kompiliert wird %Vor%

Dabei ist offset mx der Versatz zu mx im Datensegment des Programms (wenn es sich um eine statische Variable handelt) oder im Stapel (wenn es sich um eine automatische Variable handelt). In jedem Fall wird dieser Offset zur Kompilierzeit berechnet, und das wird unabhängig davon verwendet, auf was DS zeigt.

Sie haben nun ein neues Segment erstellt, dessen Basis die Adresse mx ist und dessen Limit entweder 0x4 oder 0x4fff ist (abhängig von G-bit , das Sie nicht angegeben haben) ).

Wenn G-bit 0 ist, dann ist das Limit 0x4 , und da es sehr unwahrscheinlich ist, dass mx zwischen den Adressen 0x0 und 0x4 der ursprünglichen DS liegt, wenn Sie auf Offset zu mx innerhalb des neuen Segments überschreiten Sie das Limit.

Wenn G-bit 1 ist, ist das Limit 0x4fff . Jetzt erhalten Sie nur dann einen segfault, wenn sich das ursprüngliche mx oberhalb von 0x4fff befand.

Wenn Sie bedenken, dass die Basis des neuen Segments mx ist, können Sie auf mx zugreifen, indem Sie Folgendes tun:

%Vor%

Ich weiß nicht, wie ich das in C schreiben würde.

    
Nathan Fellman 20.11.2009, 20:59
quelle

Tags und Links