diff --git a/course/02-KVM.md b/course/02-KVM.md index 9e1a659aced0fed977bcc7ee775eb143631f8adf..28fdf4335afbb5240bce71d566671664e53d5369 100644 --- a/course/02-KVM.md +++ b/course/02-KVM.md @@ -1310,6 +1310,12 @@ static inline void sti() { } ``` +[//]: # ---------------------------------------------------------------- +## VMM: virtual PIC side effect + +- After a virtual PIC is created, `KVM_EXIT_HLT` is **not triggered anymore** when guest OS executes the `hlt` instruction! +- Some deep digging into KVM is required to explain this behavior... + [//]: # ---------------------------------------------------------------- # Miscellaneous diff --git a/labs/lab-virtual_game_machine/lab-virtual_game_machine.md b/labs/lab-virtual_game_machine/lab-virtual_game_machine.md index aabcf981cc710c7ee2a975927ec4c1ccd0eb0475..374e7da3ace871cf9f933c9fcd52c30108d96348 100644 --- a/labs/lab-virtual_game_machine/lab-virtual_game_machine.md +++ b/labs/lab-virtual_game_machine/lab-virtual_game_machine.md @@ -282,11 +282,16 @@ Le périphérique se programme en MMIO. ### (6) Clavier -Ce périphérique est exposé physiquement et virtuellement. Côté guest OS, lorsque l'interruption matérielle 1 est reçue, cela signifie qu'une touche clavier à été pressée et la valeur de celle-ci peut être récupérée par le guest. +Ce périphérique est exposé physiquement et virtuellement. Côté guest OS, lorsque l'interruption matérielle 1 est reçue, cela signifie qu'une touche clavier à été pressée et la valeur de celle-ci peut être lue. **Comportement du VMM** -**TODO**: cette section sera ajoutée bientôt +Le VMM doit récupérer toute touche pressée grâce à la librairie SDL/gfx (fonction `gfx_keypressed`). +Si la touche ESC est pressée, l'exécution du VMM doit se terminer. Tout autre touche pressée provoque l'injection de l'interruption matérielle n°1 dans la VM. + +Si le VMM émule un clavier natif (physique), alors il injectera le code de la touche pressée sur 32 bits dans le port 0x60 lorsque le guest le lira. + +Si le VMM présente un clavier virtuel, alors il écrira le code de la touche pressée dans le buffer d'hypercall. **Guest: accès paravirtualisé** @@ -298,6 +303,8 @@ Ce périphérique est exposé physiquement et virtuellement. Côté guest OS, lo ``` \normalsize +Le VMM écrit le code de la touche pressée dans `key` et le guest doit récupérer la valeur écrite par le VMM. + **Guest: accès physique** Le périphérique se programme en PMIO. @@ -308,6 +315,15 @@ Comment obtenir le code de la touche pressée\ ? 1. Lire 32 bits (le code de la touche) depuis le registre de donnée +**Comportement du guest** + +Ajoutez au guest la possibilité de déplacer un sprite avec les touches suivantes du clavier\ : + +- "a" déplace le sprite à gauche +- "d" déplace le sprite à droite +- "w" déplace le sprite en haut +- "s" déplace le sprite en bas + ## Cahier des charges ### Processus de build @@ -355,7 +371,13 @@ Créez l'image disque dans le Makefile racine à l'aide de l'outil `qemu-img`. V ### Mesures de performances -**TODO**: cette section sera ajoutée bientôt +Vous aviez vu en cours de manière théorique pourquoi la paravirtualisation est plus efficace que l'émulation. Il est maintenant temps de réaliser un scénario pratique permettant de confirmer la théorie. + +- En vous basant sur les périphériques à disposition dans la machine virtuelle présentée par votre VMM, choisissez un périphérique pertinent et concevez un scénario permettant de comparez les performances obtenues entre le périphérique paravirtualisé et celui émulé. +- Ajoutez une ou plusieurs cibles dans le Makefile racine permettant de réaliser ces mesures de performances afin que cela soit facilement testable. +- Pensez à compiler avec l'option `-O3` pour indiquer à `gcc` d'optimiser votre code. +- Décrivez la méthodologie utilisée pour réaliser cette comparaison et mesurer les temps obtenus. +- Quel gain de performance obtenez-vous grâce à la paravirtualisation\ ? ## Code source à disposition @@ -579,4 +601,16 @@ L'affichage devrait ressembler à ceci\ : ### `guest_sprites_phys.bin` \vspace{-.3cm} -Ce guest réalise exactement les mêmes fonctionnalités que `guest_sprites_pv.bin`, mais en utilisant des drivers natifs (physiques). \ No newline at end of file +Ce guest réalise exactement les mêmes fonctionnalités que `guest_sprites_pv.bin`, mais en utilisant des drivers natifs (physiques). + +### `guest_sprites_keyb_pv.bin` +\vspace{-.3cm} + +Ce guest réalise les mêmes fonctionnalités que le guest `guest_sprites_pv` mais avec en plus la gestion du clavier à l'aide d'hypercalls, à savoir\ : + +- Les touches "a", "d", "w" et "s" permettent de déplacer le sprite "Tux jedi" à gauche, à droite, en haut et en bas. + +### `guest_sprites_keyb_phys.bin` +\vspace{-.3cm} + +Ce guest réalise exactement les mêmes fonctionnalités que `guest_sprites_keyb_pv.bin`, mais en utilisant des drivers natifs (physiques).