294 | | * |
| 294 | * Quand un thread rend le processeur, il le reprendra plus tard et reviendra précisément dans la fonction où il l'avait perdu (sauf si c'est une sortie définitive avec `thread_exit()` bien sûr). |
| 295 | * Quand on entre dans une fonction C, on sait que l'on peut modifier les registres temporaires car ils ne contiennent rien pour la fonction appelante. S'ils contiennent quelque-chose d'important la fonction appelante doit sauver leur valeur avant d'entrer dans la fonction appelée. |
| 296 | * Par contre, la fonction appelante suppose que les registres persistants conservent leur valeur, c.-à-d. qu'ils ne sont pas modifiés par la fonction appelée. |
| 297 | * C'est vrai pour toutes les fonctions, c'est donc vrai aussi pour la fonction `thread_save()`. Elle peut modifier les registres temporaires mais pas les registres persistants. |
| 298 | * C'est donc seul les registres persistants qu'elle sauve et qui seront restaurés par la fonction `thread_load()` qui sortira de `thread_save()` sans modification des registres persistants. |
321 | | * |
322 | | ''' |
323 | | }}} |
324 | | a. Dites ce que sont les arguments `2` et `3` de `thread_kernel()` et pourquoi, ici, on les met à `0`. |
325 | | {{{#!protected ------------------------------------------------------------------ |
326 | | ''' |
327 | | * |
| 325 | * C'est le fichier `kernel.ld` qui définit la position de `__bss_origin` et `__bss_end` dans la section `.kdata`. Ce sont des adresses qui dépendent des variables globales. |
| 326 | * C'est aussi le fichier `kernel.ld` qui définit les adresses `__main_thread` et `_start`. Par convention, `__main_thread` est au tout début de la section `.data` de l'utilisateur et `_start` est au tout début de la section `.text` de l'utilisateur. Cette convention est nécessaire pour que le kernel sache comment lancer le premier thread de l'application. |
| 327 | ''' |
| 328 | }}} |
| 329 | a. Dites ce que sont les arguments `2` et `3` de `thread_create_kernel()` et pourquoi, ici, on les met à `0`. |
| 330 | {{{#!protected ------------------------------------------------------------------ |
| 331 | ''' |
| 332 | * `thread_create_kernel()` est la fonction qui crée le thread |
| 333 | * Le premier argument est un pointeur vers la structure `thread_t` à remplir. |
| 334 | * Le quatrième argument est l'adresse de la fonction `_start` de démarrage du thread `main()`. |
| 335 | * Le deuxième, c'est normalement l'adresse de la fonction de principale du thread `main()`, ça devrait être l'adresse de la fonction `main()`. Le problème c'est qu'on ne peut pas connaître l'adresse de la fonction `main()`, elle est quelque part dans la section `.text`. Le fait ne pas savoir où est `main()` n'est pas important, car on appelle `_start()` qui appelle `main()`. |
| 336 | * Le troisième argument, c'est normalement l'argument de la fonction principale du thread, mais par pour le thread `main()` qui doit prendre en principe les arguments de la ligne de commande du shell (ici rien). Là encore, ce n'est pas important, la fonction `start()` saura trouver les arguments. |
| 337 | * Comme on n'a pas besoin de arguments 2 et 3, on met 0. |