Changes between Version 13 and Version 14 of AS6-TME-B1
- Timestamp:
- Feb 9, 2022, 9:42:56 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AS6-TME-B1
v13 v14 696 696 {{{#!protected ------------------------------------------------------------------------------------ 697 697 '' 698 - La fonction `syscall()` a 5 a arguments698 - La fonction `syscall()` a 5 arguments 699 699 - Elle reçoit ses 4 premiers arguments dans les registres $4 à $7 et le 5e (le numéro de service) dans la pile. 700 700 - La ligne 3 sert à dire que syscall est une étiquette utilisée dans un autre fichier. `.globl` signifie **glob**al **l**abel. Si on la retire, il y aura un problème lors de l'édition de lien. `syscall()` ne sera pas trouvé par l'éditeur de liens. … … 723 723 ''''''''''''''' 724 724 }}} 725 1. Dans la question **A6.5**, nous avons vu comment la fonction `kinit()` appelle la fonction `__start()` grâce à un bout de code en assembleur placé au début de la section `.text`. Nous allons voir maintenant quelles sont les conditions de cet appel. Dans le code de la question **A6.5**, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée. 725 1. La fonction `kinit()` appelle la fonction `__start()` : `kernel/kinit.c` 726 {{{#!c 727 void kinit (void) 728 { 729 kprintf (banner); 730 731 // put bss sections to zero. bss contains uninitialised global variables 732 extern int __bss_origin; // first int of bss section (defined in ldscript kernel.ld) 733 extern int __bss_end; // first int of above bss section (defined in ldscript kernel.ld) 734 for (int *a = &__bss_origin; a != &__bss_end; *a++ = 0); 735 736 extern int _start; // _start is the entry point of the app (defined in kernel.ld) 737 app_load (&_start); // function to start the user app (defined in hcpua.S) 738 } 739 }}} 740 `kernel/hcpua.S` 741 {{{#!asm 742 .globl app_load // ----------------------- void app_load (void * fun) called by kinit() 743 app_load: // call when we exit kinit() function to go to user code 744 745 mtc0 $4, $14 // put _start address in c0_EPC 746 li $26, 0x12 // define next status reg. value 747 mtc0 $26, $12 // UM <- 1, IE <- 0, EXL <- 1 748 la $29, __data_end // define new user stack pointer 749 eret // j EPC and EXL <- 0 750 }}} 751 Dans le code précédent, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée. 726 752 {{{#!protected ------------------------------------------------------------------------------------ 727 753 ''''''''''''''' … … 761 787 26 andi $26, $26, 0x3C 762 788 27 li $27, 0x20 763 28 bne $26, $27, not_syscall789 28 bne $26, $27, kpanic 764 790 }}} 765 791 {{{#!protected ------------------------------------------------------------------------------------ … … 770 796 - Ligne 26 : `$26` **←** `$26 & 0b00111100`\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`. 771 797 - Ligne 27 : `$27` **←** `0b00100000`\\⟶ On initialise le registre GPR réservé au kernel $27 avec la valeur attendue dans $26 s'il s'agit d'une cause `syscall`. 772 - Ligne 28 : si `$26` ≠ `$27` goto not_syscall\\⟶ Si ce n'est pas un `syscall`, on va plus loin, sinon on continue en séquence.798 - Ligne 28 : si `$26` ≠ `$27` goto kpanic\\⟶ Si ce n'est pas un `syscall`, on va plus loin, sinon on continue en séquence. 773 799 ''''''''''''''' 774 800 }}}