Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2011, 19h50   #1
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 1
Points : 1
Par défaut Eclaircissement sur user_regs_struct

Bonsoir,

Je dois créer un petit debugger maison en utilisant un appel système bien pratique, j'ai nommé ptrace.
Si on le demande poliment lorsqu'on a arrêté le processus débuggé, on peut rappatrier dans le processus deboggeur une structure avec les valeurs des registres du processus débuggé.
Sur mon système, la structure a cette forme:

Code :
1
2
3
4
5
6
7
8
9
 struct user_regs_struct {
        __u32 ebx, ecx, edx, esi, edi, ebp, eax;
        unsigned short ds, __ds, es, __es;
        unsigned short fs, __fs, gs, __gs;
        __u32 orig_eax, eip;
        unsigned short cs, __cs;
        __u32 eflags, esp;
        unsigned short ss, __ss;
};
Je peine à comprendre à quoi servent les zones __ds, __es, __fs, __gs, __cs, __ss?
Que veut dire le double underscore devant le registre de segment?
Après avoir écumé le net sans résultats, je m'en remets à un gourou linux de passage pour m'éclairer.
Sur la version 64 bits de la structure, je n'ai pas remarqué de zones avec un double underscore devant le registre de segment.
Merci pour votre aide
motateko est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 30/09/2011, 18h50   #2
Membre expérimenté
 
Inscription : août 2008
Messages : 455
Détails du profil
Informations personnelles :
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : août 2008
Messages : 455
Points : 575
Points : 575
Envoyer un message via Skype™ à thierry.chich
Je précise bien: je ne prétends absolument pas être un gourou. Donc il faut prendre avec précaution ma proposition:
est-ce que cs ne serait pas le segment et __cs l'offset ?
thierry.chich est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/10/2011, 08h33   #3
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 1
Points : 1
Quel offset?
cs pointe vers une entrée dans la table des descripteurs de segments, dans laquelle on a une base une limite et des vérifications de sécurités.
A chaque fois que le processeur addresse qq chose, le processeur additionne cette adresse et la base du segment concerné.
Donc si eip pointe sur 1050, et que cs pointe vers un descripteur de segment dont la base est 2000, l'adresse utilisé "réelement" est 3050.
Réelement entre guillemets car il y a après la pagination qui modifie encore cette adresse.

Edit: Dans des versions plus récentes de la structure, on a plus

mais à la place:

ce qui revient au même en terme de taille
motateko est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/10/2011, 20h36   #4
Membre expérimenté
 
Inscription : août 2008
Messages : 455
Détails du profil
Informations personnelles :
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : août 2008
Messages : 455
Points : 575
Points : 575
Envoyer un message via Skype™ à thierry.chich
Celui-là :

Citation:
The segment address is always added with a 16-bit offset to yield a linear address.
http://en.wikipedia.org/wiki/X86_memory_segmentation

C'est exactement ce que tu décris. D'où ma suggestion: est-ce que ton __cs n'est pas ce bitonio (si vraiment tu ne veux pas l'appeler offset) que tu ajoutes à ton cs ?
thierry.chich est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 03/10/2011, 21h31   #5
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 1
Points : 1
La phrase que tu cites concerne le mode réel, or je suis en mode protégé.
En mode réel comme ils avaient des registres 16bits et qu'il voulait avoir des adresses
sur 20bits, ils ont bricolé un calcul d'adresse: adresse de 16bits (segment) + adresse mais décalé de 4 bits à droite.

1111111111111111 base
+ 0000000000000001 offset
------------------------------------
11111111111111110001 adresse finale
motateko est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h00.


 
 
 
 
Partenaires

Hébergement Web