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.
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:
Ich weiß nicht, wie ich das in C schreiben würde.