Changes between Version 20 and Version 21 of Archi-1-TP10
- Timestamp:
- Jan 1, 2021, 10:57:58 AM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP10
v20 v21 339 339 ''''''''''''''' 340 340 }}} 341 1. `$26` et `$27` sont deux registres temporaires que le noyau se réserve pour faire des calcul sans qu'il ait besoin de les sauvegarder dans la pile. Ce ne sont pas des registres système comme `c0_sr` ou `c0_epc`. En effet l'usage de `$26` et `$27` par l'utilisateur ne provoque pas d'exception du MIPS, mais si le noyau est appelé, il modifie ces registres et donc l'utilisateur perd leur valeur. Le code assembleur ci-après contient les instructions exécutées par le noyau quelque-soit la cause. Les commentaires présents dans le code ont été volontairement retirés. La section `.kentry` sera placée à l'adresse `0x80000000` par l'éditeur de lien. La directi on `.org` (ligne 16) permet de déplacer le pointeur de remplissage de la section courante du nombre d'octets donnés en argument, ici `0x180`. Pouvez-vous dire pourquoi ? Expliquer le c341 1. `$26` et `$27` sont deux registres temporaires que le noyau se réserve pour faire des calcul sans qu'il ait besoin de les sauvegarder dans la pile. Ce ne sont pas des registres système comme `c0_sr` ou `c0_epc`. En effet l'usage de `$26` et `$27` par l'utilisateur ne provoque pas d'exception du MIPS, mais si le noyau est appelé, il modifie ces registres et donc l'utilisateur perd leur valeur. Le code assembleur ci-après contient les instructions exécutées par le noyau quelque-soit la cause. Les commentaires présents dans le code ont été volontairement retirés. La section `.kentry` sera placée à l'adresse `0x80000000` par l'éditeur de lien. La directive `.org` (ligne 16) permet de déplacer le pointeur de remplissage de la section courante du nombre d'octets donnés en argument, ici `0x180`. Pouvez-vous dire pourquoi ? Expliquer les lignes 25 à 28.\\ \\**`kernel/hcpu.S`** 342 342 {{{#!c 343 343 15 .section .kentry,"ax" … … 356 356 ''''''''''''''' 357 357 }}} 358 1. Comment le noyau traite les causes d'invocation? 359 {{{#!protected ------------------------------------------------------------------------------------ 360 ''''''''''''''' 361 - 362 ''''''''''''''' 363 }}} 364 1. comment fonctionne le gestionnaire de syscall? 358 1. Le gestionnaire de syscall est la partie du code qui gère le comportement du noyau lors de l'exécution de l'instruction `syscall`. C'est un code en assembleur présent dans le fichier `kernel/hcpu.S` que nous allons observer. Pour vous aider dans la compréhension de ce code, vous devez imaginer que l'instruction `syscall` est un peu comme un appel de fonction. Ce code utilise un tableau de pointeurs de fonctions nommé `syscall_vector` définit dans le fichier `kernel/ksyscalls.c`. Les lignes `36` à `43` sont chargées d'allouer dans la pile. Dessinez l'état de la pile après l'exécution de ces instructions. Que fait l'instruction lige `44` et quelle conséquence cela a? Que font les lignes `46` à `52`? Et enfin que font les lignes `54` à `60`\\ \\**`kernel/ksyscalls.c`** 359 {{{#!c 360 void *syscall_vector[] = { 361 [0 ... SYSCALL_NR - 1] = unknown_syscall, 362 [SYSCALL_EXIT] = exit, 363 [SYSCALL_TTY_READ] = tty_read, 364 [SYSCALL_TTY_WRITE] = tty_write, 365 [SYSCALL_CLOCK] = clock, 366 }; 367 }}} 368 **`kernel/hcpu.S`** 369 {{{#!c 370 34 ksyscall: 371 35 372 36 addiu $29, $29, -8*4 373 37 mfc0 $27, $14 374 38 mfc0 $26, $12 375 39 addiu $27, $27, 4 376 40 sw $31, 7*4($29) 377 41 sw $27, 6*4($29) 378 42 sw $26, 5*4($29) 379 43 sw $2, 4*4($29) 380 44 mtc0 $0, $12 381 45 382 46 la $26, syscall_vector 383 47 andi $2, $2, SYSCALL_NR-1 384 48 sll $2, $2, 2 385 49 addu $2, $26, $2 386 50 lw $2, ($2) 387 51 li $26, 0xFF00 388 52 jalr $2 389 53 390 54 lw $26, 5*4($29) 391 55 lw $27, 6*4($29) 392 56 lw $31, 7*4($29) 393 57 mtc0 $26, $12 394 58 mtc0 $27, $14 395 59 addiu $29, $29, 8*4 396 60 eret 397 }}} 365 398 {{{#!protected ------------------------------------------------------------------------------------ 366 399 '''''''''''''''