9
votes

Comment un syscall se produit-il en réalité sur Linux?

inspiré par cette question

Comment puis-je forcer GDB à démonter?

et lié à celui-ci

Qu'est-ce que INT 21H?

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?


4 commentaires

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.


4 Réponses :


8
votes

supposer que nous parlons de x86:

  1. le ID de l'appel système est déposé dans le registre EAX
  2. Tout arguments requis par l'appel système est déposé dans le Emplacements dictés par l'appel système . Par exemple, certains appels système s'attendent à ce que leur argument réside dans le registre EBX. D'autres peuvent s'attendre à ce que leur argument soit assis sur le dessus de la pile.
  3. an int 0x80 interruption est invoqué.
  4. 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.
  5. Le code d'appel utilise tous les résultats.

    Je peux être un peu rouillé à cela, ça fait quelques années ...


3 commentaires

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.



3
votes

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)

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é.


0 commentaires

4
votes

Ceci est déjà répondu à

Comment l'appel système est-il implémenté?
N'a probablement pas correspondre à cette question à cause de l'utilisation différente de terme "syscall".


0 commentaires

7
votes

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> xxx pré>

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    


0 commentaires