dimanche 22 octobre 2006

Les appels systèmes sous linux

Du coté programme utilisateur

Les appels systèmes sont numérotés :

sur le noyau 2.6.8 on trouve 283 fonctions. Les adresses d’appel des fonctions se trouvent dans un tableau de long déclaré dans entry.s. On trouve également dans ce fichier le nombre de fonction disponible dans la constante #define nr_syscalls ((syscall_table_size)/4) qui est tout bêtement la taille totale du tableau divisé par 4. La fonction 2 est "fork", 3 c’est "read", 12 "chdir", etc....

Ces fonctions sont aussi déclarées sous forme de constantes dans unistd.h

L’appel système sur i386

Lorsque vous faites appel à une fonction du système comme exec ou fork vous exécutez une interruption logicielle numéro x80. Vous retrouverez cette valeur dans les sources de linux sous la forme d’une constante SYSCALL_VECTOR définie dans irq_vectors.h

L’appel s’effectue en chargeant le numéro de fonction dans registre EAX puis on appel int $0x80 (mais pas int $21 ;) ) Lorsque la fonction a plusieurs paramètres on passe ces valeurs dans d’autres registres du processeur ( ebx, ecx, etc.... )

Bien entendu, lorsque l’on écrit un programme ordinaire en c on ne s’occupe pas de cela. En fait chaque fonction est déclaré à l’aide d’un jeu de macro qui se trouvent dans unistd.h Pour faciliter la déclaration de fonction une série de macro _syscall avec nombre de paramétre est déclaré dans unistd.h

L’appel système sur 68k

passe par un trap#0 le numéro de fonction est chargé dans le registre D0 on récupère le resultat de la fonction dans D0 si on a plusieurs paramètres on passe par les autres registres de données du processeur (D1,D2,D3, etc..)