Difference between revisions of "Qemu"

From air
Jump to navigation Jump to search
Line 1: Line 1:
 
Un émulateur de référence, la page wikipédia [http://en.wikipedia.org/wiki/QEMU]
 
Un émulateur de référence, la page wikipédia [http://en.wikipedia.org/wiki/QEMU]
  +
  +
== Installation de qemu ==
  +
  +
*Récuperer la dernière version de qemu [http://wiki.qemu.org/Download ici] (v1.0 lors de la rédaction de cet article)
  +
*Décompresser le dossier Qemu-x.xtar.gz
  +
*Configuration de compilation
  +
Dans le dossier extrait, taper la commande :
  +
./configure --target-list=arm-softmmu --python=/usr/bin/python2.7
  +
La première option permet de compiler qemu uniquement pour l'émulation de programmes destinés à une architecture [http://fr.wikipedia.org/wiki/Architecture_ARM ARM].
  +
La deuxième option permet de forcer l'utilisation de la version 2.7 de [http://fr.wikipedia.org/wiki/Python_%28langage%29 python].
  +
*Compiler les sources
  +
Executer la commande :
  +
make
  +
Le résultat de la compilation sera placé dans un sous-répertoire en fonction des options utilisées dans la configuation (Ex: arm-softmmu)
  +
  +
  +
== Composants ==
  +
=== Assemblage ===
  +
Qemu est un programme modulaire. Chaque fichier représente l'émulation d'un périphérique.
  +
Ex:
  +
*pl022.c : [http://fr.wikipedia.org/wiki/Port_s%C3%A9rie Port série] synchrone
  +
*pl050.c : Interface clavier
  +
*pl061.c : [http://fr.wikipedia.org/wiki/GPIO GPIO]
  +
  +
Pour émuler un système complet, il faut donc le constituer composant par composant.
  +
Ex:
  +
dev = sysbus_create_varargs("device-name", 0x40020000, irq1, irq2, irq3, NULL);
  +
adc = qdev_get_gpio_in(dev, 0);
  +
  +
=== Mémoire ===
  +
Pour fonctionner, un composant peut avoir besoin d'utiliser une zone de la mémoire fournie par le système. L'adresse de cette zone est définie lors de l'appel à la fonction sysbus_create_*.
  +
Une fonction d'initialisation dans le composant est alors chargée de contacter qemu afin qu'il lui délègue la gestion de cette zone.
  +
iomemtype = cpu_register_io_memory(lectureHandler, ecritureHandler, deviceData, NATIVE_ENDIAN);
  +
sysbus_init_mmio(dev, 0x1000, iomemtype);
  +
  +
  +
== Compilation et lancement du programme émulé==
  +
=== Emulation ===
  +
*Compiler les sources du programme (dans le cas ou l'architecture du système hote est différente de cette du système cible, voir la rubrique: cross compilation)
  +
*Lancement de Qemu (dans le cas d'une cible [http://fr.wikipedia.org/wiki/Architecture_ARM ARM])
  +
./qemu-system-arm -M stm32l152rbt6 -nographic -kernel ./main.bin
  +
Options
  +
*-M xxxx : Sélection de la machine émulée
  +
*--kernel xxxx : Programme à émuler
  +
  +
=== Cross compilation ===
  +
Dans le cas ou le système émulé n'a pas la même architecture que le système hôte, il est nécessaire d'utiliser un utilitaire de cross-compilation à la place de l'utilitaire de compilation.
  +
  +
  +
== Qemu et GDB ==
  +
=== Lancement en mode debug ===
  +
Il est possible d'interfacer Qemu avec [http://fr.wikipedia.org/wiki/GNU_Debugger GDB]. Ainsi, il sera aisé de suivre le déroulement du programme émulé.
  +
./qemu-system-arm -M stm32l152rbt6 -nographic -kernel ./main.bin -S -gdb tcp::51234
  +
Options:
  +
*-S : Active le mode debug
  +
*-gdb tcp::<port> : Spécifie l'interface de débbogage
  +
  +
=== Connexion avec GDB ===
  +
Il suffit maintenant de connecter gdb à qemu.
  +
arm-none-eabi
  +
target remote localhost:51234
  +
load ./main.elf
  +
continue
  +
  +
  +
== CharDev ==
  +
=== Présentation ===
  +
Qemu offre un système de communication avec l'environnement exterieur: les char devices.
  +
Ce sont des flux offert par qemu pour qu'un composant puisse lire ou écrire.
  +
Lors du lancement de l'émulation, il sera possible de connecter ces flux à des structure informatique (telnet, socket, fichier, ...)
  +
D'un coté il faudra implémenté le chardev dans un composant de qemu, puis de l'autre coté il faudra fournir au démarrage de l'application les connexion nécessaires aux chardev.
  +
  +
=== Développement ===
  +
*Initialisation du chardev
  +
chrdev = qemu_chr_find("idCharDev");
  +
if (s->chr) {
  +
chr_add_handlers(chrdev, canReceiveHandler, receiveHandler, eventHandler, deviceData);
  +
}
  +
*Envoi de caractères dans le chardev. Le buffer est un tableau de uint8_t
  +
qemu_chr_fe_write(chrdev, buffer, bufferSize);
  +
  +
=== Utilisation ===
  +
La documentation de qemu expose les différentes options à passer pour connecter les chardev:
  +
[http://wiki.qemu.org/download/qemu-doc.html UserDoc]

Revision as of 16:45, 26 March 2012

Un émulateur de référence, la page wikipédia [1]

Installation de qemu

  • Récuperer la dernière version de qemu ici (v1.0 lors de la rédaction de cet article)
  • Décompresser le dossier Qemu-x.xtar.gz
  • Configuration de compilation

Dans le dossier extrait, taper la commande :

./configure --target-list=arm-softmmu --python=/usr/bin/python2.7

La première option permet de compiler qemu uniquement pour l'émulation de programmes destinés à une architecture ARM. La deuxième option permet de forcer l'utilisation de la version 2.7 de python.

  • Compiler les sources

Executer la commande :

make

Le résultat de la compilation sera placé dans un sous-répertoire en fonction des options utilisées dans la configuation (Ex: arm-softmmu)


Composants

Assemblage

Qemu est un programme modulaire. Chaque fichier représente l'émulation d'un périphérique. Ex:

  • pl022.c : Port série synchrone
  • pl050.c : Interface clavier
  • pl061.c : GPIO

Pour émuler un système complet, il faut donc le constituer composant par composant. Ex:

dev = sysbus_create_varargs("device-name", 0x40020000, irq1, irq2, irq3, NULL);
adc = qdev_get_gpio_in(dev, 0);

Mémoire

Pour fonctionner, un composant peut avoir besoin d'utiliser une zone de la mémoire fournie par le système. L'adresse de cette zone est définie lors de l'appel à la fonction sysbus_create_*. Une fonction d'initialisation dans le composant est alors chargée de contacter qemu afin qu'il lui délègue la gestion de cette zone.

iomemtype = cpu_register_io_memory(lectureHandler, ecritureHandler, deviceData, NATIVE_ENDIAN);
sysbus_init_mmio(dev, 0x1000, iomemtype);


Compilation et lancement du programme émulé

Emulation

  • Compiler les sources du programme (dans le cas ou l'architecture du système hote est différente de cette du système cible, voir la rubrique: cross compilation)
  • Lancement de Qemu (dans le cas d'une cible ARM)
./qemu-system-arm -M stm32l152rbt6 -nographic -kernel ./main.bin

Options

  • -M xxxx : Sélection de la machine émulée
  • --kernel xxxx : Programme à émuler

Cross compilation

Dans le cas ou le système émulé n'a pas la même architecture que le système hôte, il est nécessaire d'utiliser un utilitaire de cross-compilation à la place de l'utilitaire de compilation.


Qemu et GDB

Lancement en mode debug

Il est possible d'interfacer Qemu avec GDB. Ainsi, il sera aisé de suivre le déroulement du programme émulé.

./qemu-system-arm -M stm32l152rbt6 -nographic -kernel ./main.bin -S -gdb tcp::51234

Options:

  • -S : Active le mode debug
  • -gdb tcp::<port> : Spécifie l'interface de débbogage

Connexion avec GDB

Il suffit maintenant de connecter gdb à qemu.

arm-none-eabi
target remote localhost:51234
load ./main.elf
continue


CharDev

Présentation

Qemu offre un système de communication avec l'environnement exterieur: les char devices. Ce sont des flux offert par qemu pour qu'un composant puisse lire ou écrire. Lors du lancement de l'émulation, il sera possible de connecter ces flux à des structure informatique (telnet, socket, fichier, ...) D'un coté il faudra implémenté le chardev dans un composant de qemu, puis de l'autre coté il faudra fournir au démarrage de l'application les connexion nécessaires aux chardev.

Développement

  • Initialisation du chardev
chrdev = qemu_chr_find("idCharDev");
if (s->chr) {
    chr_add_handlers(chrdev, canReceiveHandler, receiveHandler, eventHandler, deviceData);
}
  • Envoi de caractères dans le chardev. Le buffer est un tableau de uint8_t
qemu_chr_fe_write(chrdev, buffer, bufferSize);

Utilisation

La documentation de qemu expose les différentes options à passer pour connecter les chardev: UserDoc