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! |
Je m'auto quote, pour ceux que ça intéresse petites explications.
Entrée : Rien
Sortie : Adresse mémoire de la fonction system_call (routine qui traite les appel systèmes)
code: asm ("sidt %0" : "=m" (idtr));
Récupération de l'adresse du début du tableau des iterruptions.
code: base = *((unsigned long *) &idtr[2]);
Les 2 premières cases indiquant la taille de la table on sauvegarde que l'adresse de la table
code: memcpy(&desc, (void *) (base + (0x80*8)), sizeof(desc));
Chaque entrée de la table est codée sur 8 octets. On veut l'entrée 0x80. Et on sauvegarde le tout dans une structure desc de type idt_descriptor.
code: struct idt_descriptor
{
unsigned short off_low;
unsigned short sel;
unsigned char none, flags;
unsigned short off_high;
};
off_low et off_high représentent l'adresse mémoire de la fonction qui traite l'interruption 0x80 (appel système).
code:
return((void *) ((desc.off_high << 16) + desc.off_low));
On reconstitue l'adresse mémoire.
J'espère que c'est clair.
|