quote: | Originally posted by Eddy
Il y a des personnes qui s'y connaissent en kernel linux , appel systemes ?
J'ai un morceau de code que je comprend pas, je le met au cas ou.
code: void *get_system_call(void)
{
unsigned char idtr[6];
unsigned long base;
struct idt_descriptor desc;
asm ("sidt %0" : "=m" (idtr));
base = *((unsigned long *) &idtr[2]);
memcpy(&desc, (void *) (base + (0x80*8)), sizeof(desc));
return((void *) ((desc.off_high << 16) + desc.off_low));
}
Si quelqu'un peut m'expliquer la fonction ce serait cool! |
Si j'ai bien compris :
asm ("sidt %0" : "=m" (idtr))
Tu appelles une fonction assembleur en utilisant la variable idtr pour te simplifier la vie (tu évites de stocker ta variable dans des registres.
http://www.ibiblio.org/gferg/ldp/GC...mbly-HOWTO.html
Ensuite le coup du (unsigned long *) &idtr[2] j'avoue ne pas comprendre la subtilité de faire un pointeur sur un pointé pour moi l' * et le & s'annulent...., je dirais donc que base récupère la valeur de l'adresse du tableau itdr sur le 3ème élément.
Ensuite il copie dans la structure desc le contenu de base à l'adresse base+0x80*8 jusqu'à la taille de desc.
Enfin il retourne un pointeur sur ta structure desc pour lequel il récupère la valeur haute en faisant un décallage de 16 bits et en ajoutant la valeur basse.
En gros ton desc est composé de deux entier de 16bits et ta fonction retourne un 32bits.
Je suppose que ça rend la valeur de l'appel système qui a eu lieu avec la fonction assembleur sidt %0 (%0 c'est le programme que tu exécutes si je ne me trompes pas sous Linux).
Bien sûr je ne garantie pas à 100%, j'suis pas un as en prog ici et quand je vois ça je me dis que j'ai bien fait de ne pas trop chercher à faire de la dev finalement
___________________
quote: | Posted By Birante
Quand la AnneDose passe, le foie trépasse.
|
Je me lève et je confirme
Last edited by PyrofraG on Oct-21-2008 at 13:14
|