inspiré par cette question p>
Comment puis-je forcer GDB à démonter? P >
et lié à celui-ci p>
Comment un appel réellement système se produit-il sous Linux? Que se passe-t-il lorsque l'appel est effectué, jusqu'à ce que la routine de noyau réelle soit invoquée? P>
4 Réponses :
supposer que nous parlons de x86: p>
int 0x80 code> interruption est invoqué. LI>
- Les services de noyau Linux L'appel système identifié par l'ID dans le registre EAX, déposant des résultats dans des emplacements prédéterminés. LI>
- Le code d'appel utilise tous les résultats. LI>
ol>
Je peux être un peu rouillé à cela, ça fait quelques années ... P>
Si je me souviens bien, car le noyau a sa propre pile, aucun programme d'espace d'utilisateur ne peut y mettre quelque chose, de sorte que tous les arguments doivent être passés à travers les registres.
Vraiment? Je me souviens vaguement de mon professeur mentionnant que Linux avait des macros pour la cartographie des adresses de l'espace d'été à Kernelspace ... Je pourrais me tromper.
INT 0X80 est utilisé uniquement lorsque les instructions SYSCALL / SYSENTER ne sont pas disponibles, IIRC.
Fondamentalement, c'est très simple: quelque part dans la mémoire réside une table où chaque numéro SYSCALL et l'adresse du gestionnaire correspondant est stockée (voir http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32.s pour le x86 Version) p>
Le gestionnaire d'interruptions INT 0X80 prend ensuite simplement les arguments des registres, les met sur la pile (noyau) et appelle le gestionnaire de syscall approprié. P>
Ceci est déjà répondu à
Comment l'appel système est-il implémenté? strong>
N'a probablement pas correspondre à cette question à cause de l'utilisation différente de terme "syscall". P>
Les réponses données sont correctes mais je voudrais ajouter qu'il y a plus de mécanismes pour entrer en mode noyau. Chaque noyau récent mappe la page "VSYSCALL" dans l'espace d'adressage de chaque processus. Il contient un peu plus que la méthode de piège SysCall la plus efficace.
Par exemple, sur un système régulier 32 bits, il pourrait contenir: p> mais sur mon système 64-bitsystem j'ai Accédez à la méthode de la manière complète à l'aide des instructions SYSCALL / SYSENTER P>
0xffffe000: push %ecx
0xffffe001: push %edx
0xffffe002: push %ebp
0xffffe003: mov %esp,%ebp
0xffffe005: sysenter
0xffffe007: nop
0xffffe008: nop
0xffffe009: nop
0xffffe00a: nop
0xffffe00b: nop
0xffffe00c: nop
0xffffe00d: nop
0xffffe00e: jmp 0xffffe003
0xffffe010: pop %ebp
0xffffe011: pop %edx
0xffffe012: pop %ecx
0xffffe013: ret
La question de la mise en œuvre SYSCALL: Stackoverflow.com/questions/499188/...
voter moi-même de fermer. en effet est duplicaté (n'apparaît pas à la recherche que j'ai utilisé syscall)
Est-ce que cela répond à votre question? Comment l'appel système est-il implémenté sous Linux?
Que se passe-t-il si vous utilisez l'ABI de 32 bits Int 0x80 Linux ABI dans le code 64 bits? a un peu de marche du côté du noyau des points d'entrée d'appel système.