2017-02-15 4 views
2

J'essaye d'écrire un appel système simple sur XV6 (documentation disponible here et Github here) afin de comprendre comment ils sont implémentés. Je l'ai utilisé ces étapesEssayer de comprendre les appels système UNIX sur XV6

  1. En syscall.c, a déclaré extern int sys_hello(void) et ajouté [SYS_hello] sys_hello dans static int (*syscalls[])(void) tableau
  2. Dans syscall.h, défini SYS_hello comme numéro d'appel 22
  3. En user.h, a déclaré le prototype de fonction int hello (void);
  4. Dans usys.S, ajouté SYSCALL(hello) à la macro
  5. Dans sysproc.c, a ajouté la fonction sys_hello(void) au fond

    int sys_hello(void) 
    { 
        cprintf ("Hello World System Call\n"); 
        return 0; 
    } 
    
  6. Créé hello.c qui appelle simplement l'appel système hello()

  7. Ajouté hello.c au Makefile et a couru le code

Il a fonctionné comme prévu. Maintenant, ma question est qu'il semble que le tableau dans syscall.c correspond aux index des commandes avec les numéros d'appel système dans le fichier syscall.h Cependant, si je déplace la position hello à la deuxième place dans le syscall.c et laissez le numéro de commande système dans syscall.h rester 22 la commande système fonctionne comme avant. Où, je m'attendais à ce que ça casse. Pouvez-vous m'aider à comprendre comment le tableau syscall.c mappe (si c'est même le bon mot) le numéro d'appel système syscall.h?

Je suis assez nouveau à XV6 et C alors s'il vous plaît ne vous fâchez pas si cette question semble idiote, j'essaie seulement d'apprendre.

Voici le lien Github à ma fourche du dépôt XV6 si cela aide: github.com/AdityaSingh/XV6

Répondre

2

Le tableau de syscalls est syscall.c utilise la syntaxe designated initialization où vous pouvez spécifier à quel index attribuer la valeur .

static int (*syscalls[])(void) = { 
    [SYS_fork] sys_fork, 
} 

SYS_fork, définie comme 1, spécifie l'index où se classer sys_fork. Ainsi, l'ordre des éléments n'a pas d'importance en utilisant cette syntaxe.