621 | | Toutefois, pour pouvoir quand même accéder aux registres de périphériques, nous allons exceptionnellement exécuter l'application en mode kernel. Ainsi, l'application pourra accéder aux adresses de l'espace d'adressages réservées aux mode `kernel`. |
622 | | |
623 | | |
624 | | **Objectifs de l'étape** |
625 | | |
626 | | - Ecrire une application en dehors du kernel et voir comment le kernel entre dans l'application. |
| 620 | Toutefois, pour pouvoir quand même accéder aux registres de périphériques, nous allons exceptionnellement exécuter l'application en mode kernel. Ainsi, l'application pourra accéder aux adresses de l'espace d'adressage réservées aux mode `kernel`. |
| 621 | |
| 622 | Nous avons deux exécutables à compiler et donc deux `Makefile`s de compilation. Nous avons aussi un `Makefile` qui invoque récursivement les `Makefile`s de compilation. |
| 623 | |
688 | | Le programme utilisateur doit absolument s'exécuter en mode user et il doit passer par des appels système pour accéder aux services du noyau. Les services, ici, sont limités (l'accès au TTY, exit et clock), il n'empêche que pour gérer ces appels, il faut l'analyseur des causes d'appels à l'entrée du noyau et un gestionnaire de `syscall`. Il faut aussi le gestionnaire d'exceptions, parce que s'il y a une erreur de programmation, le noyau doit afficher quelque chose pour aider le programmeur. |
689 | | |
690 | | |
691 | | **Objectifs** |
692 | | |
693 | | |
| 693 | **Objectifs de l'étape** |
| 694 | |
| 695 | Le programme utilisateur doit absolument s'exécuter en mode user et il doit passer par des appels système pour accéder aux services du noyau. Les services, ici, sont limités (l'accès au TTY, exit et clock), il n'empêche que pour gérer ces appels, il faut l'analyseur des causes d'appels à l'entrée du noyau et un gestionnaire de `syscall`. Il faut aussi le gestionnaire d'exceptions, parce que s'il y a une erreur de programmation, le noyau doit afficher quelque chose pour aider le programmeur. |
| 696 | |
| 697 | Le passage de l'application au noyau par le biais de l'instruction `syscall` impose que les numéros de services soient identiques pour le noyau et pour l'application. Ces numéros de service (comme `SYSCALL_TTY_WRITE`, `SYSCALL_EXIT` sont défins dans un `.h` commun aux noyau et à l'application. Ce fichier est mis dans un répertoire à part nommé `common`. Il n'y a qu'un seul fichier ici, mais dans un système plus élaborés il y en a d'autres. |
| 698 | |
| 699 | |
723 | | 1. Question ? |
724 | | {{{#!protected ------------------------------------------------------------------------------------ |
725 | | ''''''''''''''' |
726 | | - réponse |
727 | | ''''''''''''''' |
728 | | }}} |
| 729 | 1. Dans quel fichier se trouve la définition des numéros de services tels que `SYSCALL_EXIT` ? |
| 730 | {{{#!protected ------------------------------------------------------------------------------------ |
| 731 | ''''''''''''''' |
| 732 | - |
| 733 | ''''''''''''''' |
| 734 | }}} |
| 735 | 1. Dans quel fichier se trouve le vecteur de syscall, c'est-à-dire le tableau `syscall_vector[]` contenant les pointeurs sur les fonctions qui réalisent les services correspondants aux syscall ? |
| 736 | {{{#!protected ------------------------------------------------------------------------------------ |
| 737 | ''''''''''''''' |
| 738 | - |
| 739 | ''''''''''''''' |
| 740 | }}} |
| 741 | 1. Dans quel fichier se trouve le gestionnaire de syscalls ? |
| 742 | {{{#!protected ------------------------------------------------------------------------------------ |
| 743 | ''''''''''''''' |
| 744 | - |
| 745 | ''''''''''''''' |
| 746 | }}} |
| 747 | |
| 748 | |
| 749 | **Exercice** |
| 750 | |
| 751 | - Vous allez ajouter un appel système qui rend le numéro du processeur. |