Formation à Linux Embarqué. Jérôme Pouiller <j.pouiller@sysmic.org>

Documents pareils
Plan global Outils de développement et compilation. Plan. Objectifs des outils présentés. IDE, GCC/Clang, ASAN, perf, valgrind, GDB.

MI03 TP. Objectifs du TP 1ère séance. 2ème séance. Construction d'un système linux embarqué complet

[DEVELOPPEMENT SUR LA CIBLE 2440] 19 avril 2010

Conventions d écriture et outils de mise au point

Systèmes embarqués D.Rossier

PRESENTATION RESSOURCES. Christian Dupaty BTS Systèmes Numériques Lycée Fourcade Gardanne Académie d Aix Marseille

IFT Systèmes d exploitation - TP n 1-20%

Créer. Deuxième partie II. Ajouts d utilisateurs. Formation à Linux Embarqué. Résolution DNS. mot de passe

Formation à Linux Embarqué. Jérôme Pouiller

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Compilation (INF 564)

GenDbg : un débogueur générique. Didier Eymery Jean-Marie Borello Jean-Marie Fraygefond Odile Eymery Philippe Bion

Traitement de données

VMware ESX/ESXi. 1. Les composants d ESX. VMware ESX4 est le cœur de l infrastructure vsphere 4.

Compilation croisée sous Linux et Windows

Tutorial uclinux ARM7 Development Starter Kit. Pragmatec Produits et services dédiés aux systèmes embarqués. uclinux - Mise en oeuvre

ÉCOLE POLYTECHNIQUE DE MONTRÉAL. Département de Génie Électrique. La technologie de TEXAS INSTRUMENTS DSP pour le cours Analyse des Signaux ELE2700

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Linux embarqué: une alternative à Windows CE?

La technologie Java Card TM

ERESI : une plate-forme d'analyse binaire au niveau noyau. The ERESI team

Manuel de System Monitor

Rappels d architecture

Temps Réel. Jérôme Pouiller Septembre 2011

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Session 8: Android File System

Chapitre IX : Virtualisation

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server

Atelier : Virtualisation avec Xen

TP LINUX : MISE EN PLACE DU SERVEUR DE MESSAGERIE QMAIL

TP1. Outils Java Eléments de correction

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Gestion d identités PSL Exploitation IdP Authentic

Naissance d'un REPTAR

Concept de machine virtuelle

Systèmes d exploitation

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server 3, 3.5

Cours Programmation Système

Virtualisation CITRIX, MICROSOFT, VMWARE OLIVIER D.

Systèmes Embarqués Libres

Windows Server Chapitre 1: Découvrir Windows Server 2008

Installation d'un serveur FTP géré par une base de données MySQL

INSTALLATION DE WINDOWS 2000 SERVER POUR BCDI3. par. G.Haberer, A.Peuch, P.Saadé

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Cours de Système : Gestion de Fichiers

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

INFO-F-404 : Techniques avancées de systèmes d exploitation

Surveiller et contrôler vos applications à travers le Web

Installation d ORACLE 10g sous Debian Etch

Sendmail milter/greylisting

Couche application. La couche application est la plus élevée du modèle de référence.

Département de génie électrique. ELE784 - Ordinateurs et programmation système. Laboratoire #1

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Architecture de la plateforme SBC

Reproductibilité des expériences de l article "Analyse et réduction du chemin critique dans l exécution d une application"

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Les avantages de la virtualisation sont multiples. On peut citer:

Outils en ligne de commande

sshgate Patrick Guiran Chef de projet support

Pharmed. gestion de pharmacie hospitalière. Installation / déploiement

PHP. Performances. Audit et optimisation LAMP. Julien Pauli. Cyril Pierre de Geyer. Guillaume Plessis. Préface d Armel Fauveau

Génération de code binaire pour application multimedia : une approche au vol

Programmation système I Les entrées/sorties

Vulgarisation Java EE Java EE, c est quoi?

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

IRL : Simulation distribuée pour les systèmes embarqués

Le langage C. Séance n 4

Sélection du contrôleur

ST50 Projet de fin d études Noyau Linux et multi-processeur pour une plateforme embarquée

Introduction à la Programmation Parallèle: MPI

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Algorithmique et Programmation, IMA

Tutoriel code::blocks

Initiation. àl algorithmique et à la programmation. en C

USTL - Licence ST-A 1ère année Initiation à la programmation TP 1

Tests de performance du matériel

NON URGENTE TEMPORAIRE DEFINITIVE OBJET : RÉCUPÉRATION DES DONNÉES CLIENT SUR DISQUE DUR DÉFECTUEUX OU INVALIDÉ

White Paper - Livre Blanc

Prérequis. Résolution des problèmes WMI. Date 03/30/2010 Version 1.0 Référence 001 Auteur Antoine CRUE

Oracle 11g. Installation et administration. Claude Duvallet 1/36

Mesurer les performances (CPU) sous Linux

Bon ben voilà c est fait!

Windows 8 Installation et configuration

Structure d un programme

WORKSHOP OBIEE 11g (version ) PRE-REQUIS:

Serveur Acronis Backup & Recovery 10 pour Linux. Update 5. Guide d'installation

Organiser le disque dur Dossiers Fichiers

TP LINUX : MISE EN RÉSEAU D UN SERVEUR LINUX

Projet Administration Réseaux

I00 Éléments d architecture

Explorateur WebSphere MQ Nouveautés version 7.5 & Plugins

Remote Method Invocation Les classes implémentant Serializable

Java et les bases de données

USB LANPORT 400. Manuel

OS Réseaux et Programmation Système - C5

Transcription:

Formation à Linux Embarqué Jérôme Pouiller <j.pouiller@sysmic.org>

Quatrième partie IV Debuguer Sysmic - J. Pouiller Formation à Linux Embarqué 162 / 241

17 Debug 18 Couverture 19 Profiling 20 Les sondes Jtag Sysmic - J. Pouiller Formation à Linux Embarqué 163 / 241

Debuguer une application utilisateur Utilisation classique. -g3 permet d inclure les symboles de debug host$ gcc -Wall -g3 -c hello.c -o hello.o host$ gcc -Wall -g3 hello.o -o hello-x86-dbg host$ gdb hello-x86-dbg Sysmic - J. Pouiller Formation à Linux Embarqué 164 / 241

Debuguer une application utilisateur Commandes utiles Gestion de l éxecution Point d arrêt à l adresse 0x9876 gdb> b *0x9876 b hello.c:30 Point d arrêt à la ligne 30 du fichier hello.c gdb> b hello.c:30 Point d arrêt sur la fonction main gdb> b main Continuer un programme arrêté gdb> c Démarrer le programme avec arg comme argument gdb> r arg Sysmic - J. Pouiller Formation à Linux Embarqué 165 / 241

Debuguer une application utilisateur Commandes utiles Obtenir des informations Voir la pile d appel gdb> bt Afficher les variable locales à la fonction gdb> i locales Afficher les arguments de la fonction gdb> i args Afficher la valeur de a gdb> p a Afficher la valeur de abs(2 * (a - 4)) gdb> p abs(2 * (a - 4)) Sysmic - J. Pouiller Formation à Linux Embarqué 166 / 241

Debuguer une application utilisateur Commandes utiles Debuguer à chaud Attacher gdb à un processus existant gdb> attach 1234 Arrêter le debug sans arrêter le processus gdb> detach Sysmic - J. Pouiller Formation à Linux Embarqué 167 / 241

Debuguer une application utilisateur Commandes utiles Et plus... Afficher la valeur de i à chaque fois que l on passe sur le point d arrêt 1 gdb> command 1 > silent > p i > c > end Arrêter le programme lorsque la variable i est modifiée ou lue gdb> watch i gdb> awatch i Passer d une thread à une autre gdb> thread 2 gdb> thread 1 Sysmic - J. Pouiller Formation à Linux Embarqué 168 / 241

Debuguer une application utilisateur Utilisation des Cores Dump : Vérifiez la limite coredump size avec ulimit -c Core Dump automatique en cas de crash Forcé avec kill -QUIT ou <Ctrl+\> (man kill) Créé avec la commande gdb gcore (voir avec attach) (malheureusement, ne fonctionnement pas en mode debug croisé) Il est possible de savoir à quelle binaire est attaché le coredump avec file Sysmic - J. Pouiller Formation à Linux Embarqué 169 / 241

Debuguer une application utilisateur distante Utilisation croisée Compilation host$ arm-linux-gcc -Wall -g3 -c hello.c -o hello.o host$ arm-linux-gcc -Wall -g3 hello.o -o helloarm-dbg Démarrage du serveur de debug target$ gdbserver *:1234 hello host$ arm-ulibceabi-gdb Connexion au serveur de debug > target remote target:1234 Configuration des chemins > set solib-absolute-prefix /home/user/nfs-root Chargement des symboles de debug Sysmic - J. Pouiller Formation à Linux Embarqué 170 / 241

Debuguer une application utilisateur distante Debug d une application en cours d éxecution Execution target$./hello > /dev/null & On attache gdb au processus target$ gdbserver *:1234 --attach $! configuration classque de gdb host$ arm-ulibceabi-gdb > target remote target:1234 > set solib-absolute-prefix /home/user/nfs-root > exec-file hello Remarque : Si vous dugger une programme utilisant libpthread, vous devez avoir le fichier libthread_db pour que gdb puisse décoder les emplacements les piles des threads Libérons le processus > detach Sysmic - J. Pouiller Formation à Linux Embarqué 171 / 241

Debuguer une application utilisateur Séparer les symbols de debug permet : de n uploader sur la cible que le nécéssaire à l éxecution. de livrer des binaires strippées en production tout en conservant les possibilités de debug d analyser des core dump produit en production Utilisation de objcopy pour créer le fichier de symboles : host$ arm-linux-objcopy --only-keep-debug hello hello.sym host$ chmod -x hello.sym host$ arm-linux-strip --strip-unneeded hello target$ gdbserver *:1234 hello host$ arm-linux-gdb > target remote target:1234 > symbol-file hello.sym Sysmic - J. Pouiller Formation à Linux Embarqué 172 / 241

Debuguer une application utilisateur Sous certaines conditions, il est possible de rendre le chargement des symboles automatique : host$ arm-linux-objcopy --add-gnu-debuglink=hello. sym hello Remarque : l option -g n influence pas le code compilé : $ gcc hello.c -O3 -o hello $ gcc hello.c -O3 -g -o hello.dbg $ strip hello.dbg hello $ cmp hello.dbg hello && echo ok ok Sysmic - J. Pouiller Formation à Linux Embarqué 173 / 241

Analyse sans execution Très bons outils pédagogiques strings affiche les chaine de caractères affichables d une binaire ldd affiche quel sera le comportement de ld lors du chargement (en d autres termes, liste les dépendances avec des bibliothèques dynamique) gdb est capable de charger des fichiers objets et d en sortir beaucoup d informations sans execution objdump -h permet d obtenir des information sur le placement des sections dans le fichier objdump -T ou readelf -s ou nm liste les symbols contenu dans un fichier objdump -d permet de désassembler un fichier objet objdump -S permet d obtenir l assembleur intermixé avec les code objdump -C permet de "demangler" des fonction C++ adddr2line permet de convertir une addresse mémoire en numéro ligne dans le code Sysmic - J. Pouiller Formation à Linux Embarqué 174 / 241

Debuguer le noyau Activiation d kgdb permettant d embarquer gdbserver dans le noyau : Compilation host$ cp -a build build-dbg host$ make O=build-dbg ARCH=arm CROSS_COMPILE= arm-linux- menuconfig... Compile the kernel with debug info...... KGDB: kernel debugging with remote gdb... 5 host$ make -j3 O=build-dbg ARCH=arm CROSS_COMPILE=arm-linux- uimage L image ELF est beaucoup plus grosse host$ ls -l build-dbg/vmlinux build/vmlinux host$ cp build-dbg/uimage /srv/tftp/uimage -2.6.33.7-dbg Sysmic - J. Pouiller Formation à Linux Embarqué 175 / 241

Debuguer le noyau Passage des arguments kgdboc indiquant quel interface kgdb doit utilisé et kgdbwait indiquant que kgdb doit attendre notre connexion avant de continuer le boot uboot> set bootargs ${bootargs} kgdboc=ttys0 kgdbwait uboot> tftp <Ctrl-a q> host$ arm-linux-gdb vmlinux gdb> target remote /dev/ttyusb1 Sysmic - J. Pouiller Formation à Linux Embarqué 176 / 241

Il existe des scripts effectuant la procédure automatiquement. A adapter suivant vos besoins. Remarque : Les modules sont des fichiers ELF normaux. Il peuvent être analysés Sysmicavec - J. Pouillerobjdump Formation à Linux Embarqué 177 / 241 Kgdb et les modules Les modules sont chargé dynamiquement. Ils ne sont pas contenu dans le fichier vmlinux Il est nécessaire d indiquer à gdb de charger le module que l on souhaite débuguer Néanmoins, gdb ne peut pas savoir à quel addresse à été chargé le module Ces informations peuvent être récupérées dans /sys/modules/*/sections On peut alors les donner à gdb avec add-symbol-file : target% cat /sys/modules/my_modules/sections host$ gdb vmlinux > target remote 192.168.1.55:2345 > add-symbol-file my_modules.ko 0xd0832000 \ -s.bss 0xd0837100 -s.data 0xd0836be0

ld.so Lors du chargement d une binaire, la bibliothèque ld.so charge les bibliothèques indiquées dans la section.dynamic. Il est possible de changer le comportement de ld.so par des fichier de configuration (/etc/ld.so.conf) ou par des variables d environnement. LD_LIBRARY_PATH permet d ajouter un répertoire ou les bibliothèques seront recherchées. LD_PRELOAD permet de précharger une bibliothèque. Ainsi les symboles définis dans cette bibliothèque surcharge les symboles standards : #include <stdio.h> #include <unistd.h> unsigned int sleep(unsigned int s) { static int (*real_sleep)(unsigned int) = NULL; 5 if (!real_sleep) real_sleep = dlsym(rtld_next, "sleep"); printf("try to reveal race-conditions\n"); Sysmic - J. Pouiller Formation à Linux Embarqué 178 / 241

ld.so host$ gcc -shared -ldl -fpic mysleep.c -o libmysleep.so target$ LD_PRELOAD=libmysleep.so./hello target$ export LD_PRELOAD=libmysleep.so taregt$./hello Cette technique est utilisé pour tracer et profiler certains évènement Les expert en sécurité l utilisent pour détourner un programme de son but original Enfin, il permet de simuler des problèmes afin de vérifier la robustesse d un programme Sysmic - J. Pouiller Formation à Linux Embarqué 179 / 241

strace et ltrace strace permet de d afficher les appels systèmes effectué par un processus. Il a l avantage d afficher beaucoup d informations sous des formes lisible. target$ strace./hello Il est possible de filtrer les appels systèmes à suivre. ltrace est une génératlisation de strace. Il permet de suivre les appels à une bibliothèque extérieure host$ arm-linux-ldd --root../hello target$ ltrace -l /lib/libc.so.0 -e sleep./ hello target$ ltrace -l /lib/libc.so.0 -e malloc -e free /bin/ls Ces outils sont une aide préciseuse lorsque l on souhaite identifier le comportement d une binaire dont nous ne disposons pas des sources. Sysmic - J. Pouiller Formation à Linux Embarqué 180 / 241

ptrace ptrace est l appel système permettant le fonctionnement de debuguers et d outils tel que strace et ltrace. Il permet de prendre la main sur un processus, puis d obtenir des informations sur son état et de modifier sa mémoire. Sysmic - J. Pouiller Formation à Linux Embarqué 181 / 241

Couverture de code Principe : On instrumente le code généré Entre chaque ligne de C (équialent à plusieurs ligne d assembleur), on ajoute une instruction du type inc $ADDR ADDR est une constante definie à la compilation ADDR pointe sur une entrée d un tableau initialisé à zero Chaque entrée du tableau symbolise une ligne Par conséquent, 100000 ligne augmentra la taille en mémoire de l application d environ 400Ko Lorsque le programme se termine, on écrit le tableau sur le disque (fichiers.gcda) Un fichier index est généré durant la compilation afin de faire le lien entre les lignes du fichier source et les données générées (fichiers.gcno) Fonctionne sur une binaire utilisateur. Permet de valider une campagne de test unitaire. Sysmic - J. Pouiller Formation à Linux Embarqué 182 / 241

Couverture de code Utilisation de gcov en natif : Compilation host$ cd x86-cov host$ gcc --coverage../hello.c -o hello-cov Execution d un scénario d utilisation host$./hello-cov Conversion des fichiers gcda dans un format lisible host$ for i in **/*.gcda; do > gcov -o $(dirname $i) $i > done Convertion des fichier gcda en HTML en utilisant lcov/genhtml host$ lcov -i -o coverage-x86.info -b.. -d. host$ genhtml -o html coverage-x86.info host$ firefox html/index.html Sysmic - J. Pouiller Formation à Linux Embarqué 183 / 241

Couverture de code Utilisation de gcov sur la cible : On précise le répertoire ou les fichier doivent être stockés host$ cd arm-cov host$ arm-linux-gcc --fprofile-generate=/tmp/ hello --coverage../hello.c -o hello-arm-cov On execute sur la cible host$ scp hello-arm-cov root@target: target$./hello-arm-cov target$ exit On récupère les résultats pour les traiter sur le host host$ scp -r root@target:/tmp/hello. Sysmic - J. Pouiller Formation à Linux Embarqué 184 / 241

Couverture de code Conversion des fichiers gcda dans un format lisible host$ for i in **/*.gcda; do > arm-linux-gcov -o $(dirname $i) $i > done host$ lcov -i -o coverage-arm.info -b.. -d hello --gcov-tool arm-linux-gcov host$ genhtml -o html coverage-arm.info host$ firefox html/index.html Fonctionne aussi avec le noyau : CONFIG_LCOV Sysmic - J. Pouiller Formation à Linux Embarqué 185 / 241

Valgrind On execute notre programme dans une machine virtuelle. Cette machine virtuelle instrumente les accès en lecture et en écriture à la mémoire. suit les appels aux fonctions malloc et free suit les copie de pointeurs Ainsi, en plus de détecter les zone non désallouées à la sortie du programme, valgrind est capable de détecter : l écriture et la lecture d une zone non allouée (voir aussi DUMA) la lecture d une zone jamais écrite les zone de mémoire n étant plus pointées valgrind peut indiquer les contextes exacts où tous ces évènements se produisent. Sysmic - J. Pouiller Formation à Linux Embarqué 186 / 241

Valgrind /* * Test with: * echo 123456 valgrind --leak-check=yes./a.out 4 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> void fun() { int var; int *stck = &var; int *heap = malloc(2 * sizeof(int)); 14 static int *bss; printf("%d\n", var); initialized // var hasn t been Sysmic - J. Pouiller Formation à Linux Embarqué 187 / 241

Valgrind Appellons nos deux fonctions de tests heap[2] = 42; // wrote past the end of the block printf("%d\n", heap[-1]); // read from before start of the block printf("%d\n", stck[-15]); // reading from a bad stack location (detected if outside current frame) 4 read(0, heap, 10); // buffer passed to syscall is too small //read(0, stck, 10); // buffer passed to syscall is too small (not detected) free(heap); printf("%d\n", *heap); // heap was already freed heap = malloc(sizeof(int)); // memory leaks ( definitely lost) stck = heap; //.. even if another variable point on it Sysmic - J. Pouiller Formation à Linux Embarqué 188 / 241

Valgrind Valgrind a donné naissance à d autres outils : Cachegrind permet de simuler les lignes de cache du processeur et ainsi d indiquer ou se produise les erreurs de pages (voir aussi perf) Callgrind permet d instrumenter les appels de fonctions. Il génère des graphes d appels et des informations de profiling (voir aussi perf) Hellgrind et DRD instrumente les mécanismes générant des sections critique et détecte les Race Conditions sur les données. Massif detecte les contexte d allocation de mémoire (heap profiling) Ptrcheck suit les blocks pointé et détecte ainsi les overruns (voir aussi DUMA) Sysmic - J. Pouiller Formation à Linux Embarqué 189 / 241

Bases Avant de se lancer dans des procédure de profiling complexe, quelques commandes simples : free indique les ressources mémoire disponibles sur le système Les buffers indiquent des données devant être écritent sur le disque (ou sur un IO) mais dont le système repouse l écriture pour des raisons de performances Les caches indiquent des données lue sur le disque (ou sur un IO) conservées en mémoires afin d accélérer les futurs accès time indique les ressources utilisées par un processus Temps total Temps CPU en utilisateur et dans le noyau Nombre de d erreur de page majeure (nécessitant un accès disque) et mineurs Nombre de message socket ( réseau) envoyés/recus Mémoire utilisée en moyenne Nombre d accès aux disques en entrée et en sortie Sysmic - J. Pouiller Formation à Linux Embarqué 190 / 241

Bases top indique à peu près les même informations que time mais de manière intéractive ps affiche aussi ces informations sur un ou plusieurs processus en cours d éxecution /proc/${pid}/{stat,statm,status} contiennent les données bruts de ces outils /proc/${pid}/{map,smap,pagesmap} contiennent des infomration très précisesnt aux sujet du mapping mémoire d un processus Sysmic - J. Pouiller Formation à Linux Embarqué 191 / 241

perf perf utilise les registre de debug du cpu. Faible overhead. depend du CPU. Le cpu le plus fourni est x86. Obtenir une vue synthétique d un processus target% apt-get install linux-tools-common target$ perf stat./hello-dbg Effectuer une mesure plus précise target$ perf record./hello-dbg target$ perf report Annoter le code avec les information de profiling target$ perf annotate timeattack Sysmic - J. Pouiller Formation à Linux Embarqué 192 / 241

perf Même manipulation mais avec les contextes d appel target$ perf record -g./hello-dbg target$ perf report Il est possible d utiliser d autre point de mesure que la consommation CPU target$ perf list target$ perf stat -e cache-misses./hello-dbg target$ perf record -e cache-misses./hello-dbg target$ perf report target$ perf annotate timeattack target$ perf record -e cache-misses -g./hellodbg target$ perf report Sysmic - J. Pouiller Formation à Linux Embarqué 193 / 241

oprofile Idem perf, mais moins générique Initialement sur les architectures ST (pas ARM, ni x86) Si vous avez un noyau suffisament récent, oprofile utilise perf comme backend Démarrage du daemon target% opcontrol --init Liste des évènements pouvant être enregistrés target% opcontrol -l Profiling d un évènement target% opcontrol --start --no-vmlinux -e CPU_CLK_UNHALTED:100000:0:1:1 target%./hello target% opcontrol --shutdown Sysmic - J. Pouiller Formation à Linux Embarqué 194 / 241

oprofile Génération du rapport target% opreport hello Génération du source annoté target% opannotate --source hello-prof Sysmic - J. Pouiller Formation à Linux Embarqué 195 / 241

U-boot Notre vendeur nous fourni une version de u-boot patchée pour notre carte. Dans ce cas, il nous suffit de configurer correctement u-boot et de le compiler : make usb-a9260_config make CROSS_COMPILE=arm-linux- Sysmic - J. Pouiller Formation à Linux Embarqué 196 / 241

U-boot Si nous voulons ajouter une nouvelle carte, nous devons : Ajouter un nouveau fichier d entêtes dans include/configs Ajouter un nouveau répertoire dans board A priori, vous n aurez pas besoin d ajouter une architecture et encore moins un jeu d instruction Ajouter une cible dans le Makefile Cette cible appellera mkconfig mkconfig prend en paramètre le nom du fichier d entête, le type de CPU, d architecture et de carte, ainsi que le nom du vendeur et le modèle de chipset../mkconfig usb-a9260 arm arm926ejs usb-a9260 Calao at91sam926x Sysmic - J. Pouiller Formation à Linux Embarqué 197 / 241

U-boot mkconfig créera un fichier config.h pointant sur votre fichier entête et un fichier config.mk contenant : ARCH = arm CPU = arm926ejs BOARD = usb-a9260 VENDOR = Calao SOC = at91sam926x Placer les drivers nécéssaire à votre carte dans board/usb-a9260. L implémentation des drivers est proche de ce que l on trouve dans le noyau Linux. Il suffit d associer les callback aux champs d une structure. Le fichier usb-a9260.h devra contenir la configuration des fonctionnalité de u-boot Vous trouverez des options de configuration haut niveau telles que les commandes devant être incluse Vous trouverez aussi les paramètre d initialisation bas niveau pour le CPU et l architecture (timing mémoire, etc...) Sysmic - J. Pouiller Formation à Linux Embarqué 198 / 241

OpenOCD Qu est-ce qu une sonde Jtag? TAP (Test Access Port) est un module matériel capable de traiter des commande de debug (souvent sur le processeur). Notre TAP est embarqué sur le ARM9260EJ-S. JTAG est un standard de communication normalisé pour les TAP. Une hardware interface dongle doit être utilisée pour empaqueter le standard JTAG dans un autre protocole (ethernet, USB, serie...) afin d être traitable par un PC. Nous utilisons la FTDI FT2232 pour cette partie. Cette puce permet de présenter à l host deux périphérique USB : Le JTAG et la console RS232. Sysmic - J. Pouiller Formation à Linux Embarqué 199 / 241

OpenOCD Qu est-ce qu une sonde Jtag? OpenOCD permet de gérer la communication avec la puce FTDI et de traduire le langage de bas niveau JTAG en langage de debug gdb On trouve souvent des sonde JTAG incluant déjà l équivalent de OpenOCD et sachant déjà communiquer avec gdb (par ethernet ou série très souvent). (Abatron, Lautherbar, etc...) On peut reconnaitre les deux types de sondes à leur prix. Les première coute au maximum quelques centaines d euros alros que les secondes coutent rarement moins de 1000euros. Sysmic - J. Pouiller Formation à Linux Embarqué 200 / 241

OpenOCD Beaucoup de sondes JTAG (USB, port parallèle, port serie) sont supportées par OpenOCD : doc/openocd/jtag-hardware-dongles.html. host% apt-get install openocd Sysmic - J. Pouiller Formation à Linux Embarqué 201 / 241

OpenOCD Il est nécessaire de corriger un bug dans le fichier de configuration de notre cible : host% ln -s at91sam9260.cfg /usr/share/openocd/ scripts/target/at91sam9260minimal.cfg Nous pouvons maintenant utiliser notre sonde Jtag host$ openocd -f interface/calao-usb-a9260-c01.cfg host$ telnet 127.0.0.1 4444 > help > reset init > arm reg > arm disassemble 0x00000000 5 > arm disassemble 0x00000058 5 > ^C Sysmic - J. Pouiller Formation à Linux Embarqué 202 / 241

OpenOCD avec gdb Lancement de gdb host$ arm-linux-gdb Connexion avec OpenOCD gdb> target remote localhost:3333 monitor permet d envoyer des commande brutes à OpenOCD gdb> monitor reset init gdb> monitor help Vu que nous ne sommes pas lié à une binaire, nos commandes sont limitées. Nous pouvons néanmoins dumper la mémoire et placer des breakpoints gdb> x/10i 0 gdb> hbreak *0x58 gdb> b *0x0 Sysmic - J. Pouiller Formation à Linux Embarqué 203 / 241

OpenOCD Deux mots sur la configuration : Les fichiers de interfaces/ contiennent les informations sur le driver à utiliser et comment s y connecter. Le repertoire target/ contient la configuration du microcontrolleur en lui-même. La documentation se trouve sur http://openocd.sourceforge.net/doc/openocd.html ou dans /usr/share/doc/openocd Il est possible d avoir l aide contextuelle sur une commande help command Sysmic - J. Pouiller Formation à Linux Embarqué 204 / 241

Debuguer U-Boot Notre fichier de configuration de OpenOCD ne lance pas la cible à la vitesse maximum. Laissons cette tâche à u-boot, puis arrêtons la cible. Hit any key to stop autoboot: 0 u-boot> Arrêtons la cible afin de pouvoir travailler dessus telnet> halt Configurons une vitesse de transmission raisonnable telnet> jtag_hkz 10000 telnet> arm7_9 dcc_downloads enable Chargeons l image ELF de u-boot telnet> load_image.../u-boot (elf,13secondes) Sysmic - J. Pouiller Formation à Linux Embarqué 205 / 241

Debuguer U-Boot Vérifions que nous retrouvons bien le code assembleur de U-boot à l endroit indiqué telnet> disassemble XXXX Sautons jusqu à cette addresse telnet> resume XXX Arrêtons le démarrage telnet> halt Sysmic - J. Pouiller Formation à Linux Embarqué 206 / 241

Debugguer U-Boot Maintenant que notre cible est correctement initialisées, nous pouvons prendre la main dessus avec gdb : host$ arm-linux-gdb u-boot gdb> target remote localhost:3333 gdb> c ^C gdb> hbreak run_command gdb> c u-boot> help Sysmic - J. Pouiller Formation à Linux Embarqué 207 / 241