Différences entre versions de « Sbc qemu emulation »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Ligne 74 : Ligne 74 :
  
 
= Démarche pour émuler =
 
= Démarche pour émuler =
 +
== Les SoC AllWinner ==
 +
{|style="text-align:left; vertical-align:top; width:80%"
 +
|-
 +
|style="vertical-align:top;width:40%"|
 
Imaginons que nous voulions émuler un SoC AllWinner H2+.
 
Imaginons que nous voulions émuler un SoC AllWinner H2+.
[[Fichier:Orange pi zero.jpg|300px|centré]]
+
|style="vertical-align:top;width:60%"|
 +
[[Fichier:Orange pi zero.jpg|300px]]
 +
|-
 +
|style="vertical-align:top"|
 
Cette carte utilise un SoC AllWinner H2+ et d'après la [http://wiki.friendlyarm.com/wiki/images/0/08/Allwinner_H2%2B_Datasheet_V1.2.pdf documentation] de AllWinner le CPU est un ARM Cortex-A7 (32 bits):
 
Cette carte utilise un SoC AllWinner H2+ et d'après la [http://wiki.friendlyarm.com/wiki/images/0/08/Allwinner_H2%2B_Datasheet_V1.2.pdf documentation] de AllWinner le CPU est un ARM Cortex-A7 (32 bits):
[[Fichier:allwinner h2 documentation.png|600px|centré]]
+
|
 +
[[Fichier:allwinner h2 documentation.png|600px]]
 +
|-
 +
|style="vertical-align:top"|
 
Il ne nous reste plus qu'a trouver un SBC avec le même jeu d'instruction (ARMv7) équivalent dans Qemu:
 
Il ne nous reste plus qu'a trouver un SBC avec le même jeu d'instruction (ARMv7) équivalent dans Qemu:
 +
|
 
<pre>
 
<pre>
 
# qemu-system-arm -M help
 
# qemu-system-arm -M help
Ligne 100 : Ligne 111 :
 
...
 
...
 
</pre>
 
</pre>
 
+
|-
 +
|style="vertical-align:top"|
 
On remarque que que des SBCs utilisent un CPU Cortex-A (cubieboard, ast2600-evb, ...) de la même famille que le [https://fr.wikipedia.org/wiki/ARM_Cortex-A Cortex-A7] et son donc 100% compatible ([http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.set.cortexa/index.html ''The ARM Cortex-A7 MPCore processor is fully compatible with other Cortex-A family of processors'']).
 
On remarque que que des SBCs utilisent un CPU Cortex-A (cubieboard, ast2600-evb, ...) de la même famille que le [https://fr.wikipedia.org/wiki/ARM_Cortex-A Cortex-A7] et son donc 100% compatible ([http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.set.cortexa/index.html ''The ARM Cortex-A7 MPCore processor is fully compatible with other Cortex-A family of processors'']).
  
Il ne reste plus qu'a télécharger Armbian sur le [[Iso_install_sdcard#T.C3.A9l.C3.A9charger_l.27ISO|site d'OrangePi]] et de la décompresser pour regarder le répertoire boot et notamment la partie dtd:
+
Il ne reste plus qu'a télécharger l'image d'Armbian sur le [[Iso_install_sdcard#T.C3.A9l.C3.A9charger_l.27ISO|site d'OrangePi]] et de la décompresser pour regarder le répertoire boot et notamment la partie dtd:
[[Fichier:Armbian dtd pi zero.png|centré]]
+
|width=50% style="valign:top"|
 
+
[[Fichier:Armbian dtd pi zero.png]]
 +
|-
 +
|style="vertical-align:top"|
 
On remarque qu'une dtd existe pour le SBC cubieboard, c'est donc celui-ci que nous allons utiliser avec les fichiers vmlinuz et initrd qui vont avec !
 
On remarque qu'une dtd existe pour le SBC cubieboard, c'est donc celui-ci que nous allons utiliser avec les fichiers vmlinuz et initrd qui vont avec !
  
Dans un répertoire décompressez les fichiers initrd, vmlinuz et dtd correspondant (grâce à 7zip si vous êtes sous Windows) :
+
Dans un répertoire décompressez les fichiers initrd, vmlinuz et dtd correspondant (grâce à 7zip si vous êtes sous Windows)
[[Fichier:Folder initrd vmlinuz dtd armbian.png|centré]]
+
|
 
+
[[Fichier:Folder initrd vmlinuz dtd armbian.png]]
 +
|-
 +
|style="vertical-align:top"|
 
Vous pouvez créez un script ''bat'' avec le contenu suivant:
 
Vous pouvez créez un script ''bat'' avec le contenu suivant:
 +
|
 
<pre>
 
<pre>
 
qemu-system-arm.exe ^
 
qemu-system-arm.exe ^
Ligne 119 : Ligne 136 :
 
-initrd .\initrd.img-5.4.20-sunxi ^
 
-initrd .\initrd.img-5.4.20-sunxi ^
 
-drive file=.\Armbian_20.02.1_Orangepizero_buster_current_5.4.20.img,format=raw,if=none,id=d1 ^
 
-drive file=.\Armbian_20.02.1_Orangepizero_buster_current_5.4.20.img,format=raw,if=none,id=d1 ^
 +
-device ide-hd,drive=d1 ^
 
-append "nosmp earlyprintk loglevel=8 earlycon=uart8250,mmio32,0x1c28000,115200n8 console=ttyS0 root=/dev/sda1" ^
 
-append "nosmp earlyprintk loglevel=8 earlycon=uart8250,mmio32,0x1c28000,115200n8 console=ttyS0 root=/dev/sda1" ^
 
-nographic -serial stdio -monitor none ^
 
-nographic -serial stdio -monitor none ^
-nic user,model=allwinner-emac,hostfwd=tcp::5022-:22
+
-nic user,model=allwinner-emac,hostfwd=tcp::2222-:22
 
</pre>
 
</pre>
 +
|-
 +
|style="vertical-align:top"|
 
Reprenons dans l'ordre:
 
Reprenons dans l'ordre:
<div align="center">
+
|
{|
+
{|width="90%"
!width="10%"!
+
! Option !! Signification
Option
 
!width="10%"!
 
Signification
 
 
|-
 
|-
||
+
|style="border-bottom:1px solid black"|
-M cubieboard
+
-M cubieboard  
||
+
|style="border-bottom:1px solid black"|
 
AllWinner H2+ / H3
 
AllWinner H2+ / H3
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-cpu cortex-a7
 +
|style="border-bottom:1px solid black"|
 +
Cortex-a7
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-m 512
 +
|style="border-bottom:1px solid black"|
 +
512MB de RAM
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-dtb
 +
|style="border-bottom:1px solid black"|
 +
indique le fichier ''datatree''
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-kernel
 +
|style="border-bottom:1px solid black"|
 +
indique le noyau Linux
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-initrd
 +
|style="border-bottom:1px solid black"|
 +
indique le fichier initram fs
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-drive
 +
|style="border-bottom:1px solid black"|
 +
indique le fichier image
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-append
 +
|style="border-bottom:1px solid black"|
 +
indique les paramètres du noyau
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-nographic -serial stdio -monitor none
 +
|style="border-bottom:1px solid black"|
 +
pas de sortie graphique mais plutôt série sur la sortie standard
 +
|-
 +
|style="border-bottom:1px solid black"|
 +
-nic user,model=allwinner-emac,hostfwd=tcp::5022-:22
 +
|style="border-bottom:1px solid black"|
 +
carte réseau ''allwinner-emac'' avec redirection du port tcp 2222 local sur le port 22 de la machine émulée
 +
|}
 
|-
 
|-
 
||
 
||
-cpu cortex-a7
+
Cela permet, après le temps à l'émulateur de démarrer le système, de pouvoir se logger.
 
||
 
||
Cortex-a7
+
[[Fichier:Qemu orange pi zero logging.png]]
 +
|}
 +
== Le Raspberry Pi ==
 +
{|style="text-align:left; vertical-align:top; width:80%"
 
|-
 
|-
 
||
 
||
-m 512
 
 
||
 
||
512MB de RAM
 
 
|}
 
|}
</div>
 

Version du 12 mai 2020 à 22:11

Introduction

Lorsque l'on a pas de SBC physique on peut se tourner vers l'émulation pour faire des tests ! Attention cependant, les performances seront médiocres comme souvent avec l'émulation.

Nous allons utiliser l'émulateur Qemu pour émuler une architecture ARM et pouvoir exécuter une image de PI.

SBC et SoC

Les composants qui forment chacun des SBC va influer sur les performances, capacité, etc... et sont généralement rassemblés sous le nom de SoC. Le Raspberry PI utilise un SoC Broadcom BCM28XX alors que les autres SBC utilise un SoC AllWinner (H2, H3, A10, A20, etc...).

Le SoC peut être vu comme la compression de la carte mère, du CPU, de la RAM et du GPU. Le SBC et l'ajout, autour du SoC, des ports d'extension (USB, Ethernet, SD, etc...)

N'hésitez pas à lire le cours sur le matériel pour des explications plus poussées !

Le Raspberry... et les autres

Le Raspberry PI (et donc le SoC Broadcom BCM28XX) possède en plus du CPU ARM un GPU VideoCore alors que les SoC AllWinner possède un GPU Mali400 et jusque là pas de grosses différences sauf dans la phase de démarrage...

Le Raspberry PI, à l'inverse des autres SBC, n'amorce pas sa phase de démarre pas le biais de son CPU mais de son GPU !

Ci-dessous sont détaillés les phases de démarrage des différents SBC

Raspberry Les autres
  1. exécution du premier chargeur d'amorçage situé dans une ROM programmée en usine
    • ce code s'exécute sur un petit processeur RISC du GPU
    • ce code monte une partition FAT32 située sur la carte SD
    • ce code n'initialise PAS le CPU ARM qui reste dans l'état RESET
  2. exécution du second chargeur d'amorçage situé sur la carte SD: bootcode.bin
    • ce code s'exécute sur un petit processeur RISC du GPU
    • il est chargé dans les 128Ko de cache L2 du GPU
    • il initialise la RAM
  3. exécution du troisième chargeur d'amorçage situé sur la carte SD: start.elf
    • ce code est le firmware du GPU
    • il prend ses paramètres dans le fichier config.txt (arm_freq, gpu_freq, etc...)
    • il sépare la RAM en deux parties distinctes (GPU et CPU)
  4. exécution du quatrième chargeur d'amorçage kernel.img
    • le kernel démarre avec les paramètres du fichier cmdline.txt
    • il relâche le RESET du CPU ce qui a pour effet de démarrer le système d'exploitation

Après le démarrage du système d'exploitation, le code du GPU n'est pas déchargé de la RAM. En effet, start.elf n'est pas juste un firmware pour le GPU mais un système d'exploitation propriétaire appelé VideoCore OS (VCOS). Lorsque Linux nécessite un élément du GPU (caméra, 3D, etc...) il communique avec VCOS au travers du système de mail.

Img sd card content rpi.png
  1. exécution du premier chargeur d'amorçage situé sur une ROM programmée en usine de 32 KiB appelée BROM (Boot ROM)
    • la première partie de la BROM (0xffff0000) est le FEL (pour la programmation de la flash)
    • la seconde partie de la BROM (0xffff4000) est le eGON.BRM (pour le boot de l'OS)
  2. eGON.BRM cherchera le noyau Linux (vmlinuz et initrd) sur les périphérique dans cet ordre:
    • SD1
    • NAND (mémoire eMMC)
    • SD2
    • SPI
    • USB

On peut observer le répertoire boot à partir d'une image et pour cela il faut:

  • déterminer le début de la partition grâce à la commande fdisk
  • monter la partition grâce à mount, l'offset est égale au nombre de secteur multiplié par la taille d'un secteur (ici 8192*512)
  • lister les fichier grâce à ll
Img list file armbian.png

Pour émuler un Raspberry PI l'émulateur va devoir jouer le rôle du CPU ARM et du GPU alors que dans les autres cas, seulement le CPU sera nécessaire !

Utilisation de Qemu

Tout d'abord assurez-vous d'avoir téléchargé l'émulateur pour votre OS et modifié votre variable PATH pour y ajouter le répertoire d'installation de Qemu. Une fois installé, on peut mesurer le nombre d'architecture supportée par Qemu !

Qemu listing emulator exe.png

Ceux qui vont nous intéresser sont :

  • qemu-system-arm pour les processeur ARM jusqu'à la V7 (32bits)
  • qemu-system-aarch64 pour les processeur ARM V8+ (64bits)

Qemu s'utilise en ligne de commande avec certains paramètres dont voici les principaux:

  • -M: pour spécifier le type de machine émulée;
  • -m : pour spécifier la quantité de RAM
  • -cpu : pour spécifier le type de CPU
  • -nic : pour paramétrer la carte réseau
  • -drive : pour spécifier un disque système
  • -dtb : pour préciser l'arbre matériel (DeviceTree Binary)
  • -kernel : pour préciser le noyau utilisé
  • -initrd : pour spécifier le schéma de la RAM (initram FS)

Démarche pour émuler

Les SoC AllWinner

Imaginons que nous voulions émuler un SoC AllWinner H2+.

Orange pi zero.jpg

Cette carte utilise un SoC AllWinner H2+ et d'après la documentation de AllWinner le CPU est un ARM Cortex-A7 (32 bits):

Allwinner h2 documentation.png

Il ne nous reste plus qu'a trouver un SBC avec le même jeu d'instruction (ARMv7) équivalent dans Qemu:

# qemu-system-arm -M help
Supported machines are:
akita                Sharp SL-C1000 (Akita) PDA (PXA270)
ast2500-evb          Aspeed AST2500 EVB (ARM1176)
ast2600-evb          Aspeed AST2600 EVB (Cortex A7)
bast                 Simtec Electronics BAST (S3C2410A, ARM920T)
borzoi               Sharp SL-C3100 (Borzoi) PDA (PXA270)
canon-a1100          Canon PowerShot A1100 IS
cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
collie               Sharp SL-5500 (Collie) PDA (SA-1110)
connex               Gumstix Connex (PXA255)
cubieboard           cubietech cubieboard (Cortex-A9)
emcraft-sf2          SmartFusion2 SOM kit from Emcraft (M2S010)
highbank             Calxeda Highbank (ECX-1000)
imx25-pdk            ARM i.MX25 PDK board (ARM926)
integratorcp         ARM Integrator/CP (ARM926EJ-S)
kzm                  ARM KZM Emulation Baseboard (ARM1136)
lm3s6965evb          Stellaris LM3S6965EVB
...

On remarque que que des SBCs utilisent un CPU Cortex-A (cubieboard, ast2600-evb, ...) de la même famille que le Cortex-A7 et son donc 100% compatible (The ARM Cortex-A7 MPCore processor is fully compatible with other Cortex-A family of processors).

Il ne reste plus qu'a télécharger l'image d'Armbian sur le site d'OrangePi et de la décompresser pour regarder le répertoire boot et notamment la partie dtd:

Armbian dtd pi zero.png

On remarque qu'une dtd existe pour le SBC cubieboard, c'est donc celui-ci que nous allons utiliser avec les fichiers vmlinuz et initrd qui vont avec !

Dans un répertoire décompressez les fichiers initrd, vmlinuz et dtd correspondant (grâce à 7zip si vous êtes sous Windows)

Folder initrd vmlinuz dtd armbian.png

Vous pouvez créez un script bat avec le contenu suivant:

qemu-system-arm.exe ^
-M cubieboard -m 512 -cpu cortex-a7 ^
-dtb .\sun4i-a10-cubieboard.dtb ^
-kernel .\vmlinuz-5.4.20-sunxi ^
-initrd .\initrd.img-5.4.20-sunxi ^
-drive file=.\Armbian_20.02.1_Orangepizero_buster_current_5.4.20.img,format=raw,if=none,id=d1 ^
-device ide-hd,drive=d1 ^
-append "nosmp earlyprintk loglevel=8 earlycon=uart8250,mmio32,0x1c28000,115200n8 console=ttyS0 root=/dev/sda1" ^
-nographic -serial stdio -monitor none ^
-nic user,model=allwinner-emac,hostfwd=tcp::2222-:22

Reprenons dans l'ordre:

Option Signification

-M cubieboard

AllWinner H2+ / H3

-cpu cortex-a7

Cortex-a7

-m 512

512MB de RAM

-dtb

indique le fichier datatree

-kernel

indique le noyau Linux

-initrd

indique le fichier initram fs

-drive

indique le fichier image

-append

indique les paramètres du noyau

-nographic -serial stdio -monitor none

pas de sortie graphique mais plutôt série sur la sortie standard

-nic user,model=allwinner-emac,hostfwd=tcp::5022-:22

carte réseau allwinner-emac avec redirection du port tcp 2222 local sur le port 22 de la machine émulée

Cela permet, après le temps à l'émulateur de démarrer le système, de pouvoir se logger.

Qemu orange pi zero logging.png

Le Raspberry Pi