Académique Documents
Professionnel Documents
Culture Documents
Paul BESSON
Informatique Industrielle et Instrumentation Rapport de stage (quatrime anne)
Tome principal
4
4 5 6 7 7 8 9
2 Le projet APES
. . . . . . . . . . . . DNA-OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
10 11 13 14 17 18 19 21 22 24 25
19
26 27 27
A.1 En-tte du chier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 A.2 En-tte des sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 A.3 En-tte des segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
B Exemple de chier
ldscript
29
Chapitre 1
Lieu du stage
J'ai eectu mon stage de deuxime anne au laboratoire TIMA (Techniques de l'Informatique et de la Microlectronique pour l'Architecture des systmes intgrs) au sein du groupe SLS (System Level Synthesis ). Les paragraphes suivants dcrivent succintement le laboratoire TIMA et les sujets de recherche du groupe SLS.
TIMA compte une centaine de membres, y compris les doctorants, auxquels s'ajoutent de 20 30 stagiaires au second semestre de l'anne universitaire. Le laboratoire est trs international et accueille des chercheurs et des stagiaires du monde entier. Une grande partie de la recherche s'eectue dans le contexte de projets coopratifs, avec des partenaires industriels et acadmiques, nancs par des contrats rgionaux, nationaux, et europens.
1. Lieu du stage
Chapitre 2
Le projet APES
Durant mon stage, j'ai travaill sur le projet APES (APplication Elements for System on chips ) [1] [2]. Ce projet s'intgre dans des projets plus importants que sont SoCLib, SHAPES et EURETILE (projets nancs par l'Agence Natianale de la Recherche et la Communaut Europenne).
APES est un ensemble de composants logiciels destins faciliter le dveloppement d'applications embarques pour des systmes multiprocesseurs (homognes ou htrognes) sur puce.
2.1 Problmatique
Pour obtenir la puissance de calcul ncessaire aux applications embarques modernes, les concepteurs de ces applications s'appuient de plus en plus sur des systmes multiprocesseurs (MP-SoC 1 ) ou intgrant plusieurs processeurs de type dirent (plateformes htrognes dites HMP-SoC 2 ) sur puce. Pour raliser une application sur ce type de plateforme, le dveloppeur peut au choix : 1. Programmer sparment chaque processeur 2. Utiliser un systme d'exploitation de haut niveau La premire solution demande un travail long et fastidieux qui n'est pas envisageable mme pour une application de taille moyenne. De plus, l'application dveloppe n'est pas portable. La deuxime solution ore la portabilit est la simplicit de programmation mais oblige l'utilisation d'un systme lourd qui demande de nombreux calculs supplmentaires et entraine une utilisation mmoire beaucoup plus importante. Le framework APES se veut un compromis entre ces deux solutions. Il est n de la ncessit d'orir une couche logicielle la plus gnrique possible (c'est dire capable de fonctionner sur des plateformes trs direntes) et ore de nombreuses fonctionnalits tout en restant peu gourmand en ressources matrielles.
1. 2.
2. Le projet APES
Application
Noyau Modules
DNA-OS HAL
2.3.1 SoClib
SoClib est une plateforme de simulation ddie au dveloppement matriel et logiciel d'architecture MP-SoC et HMP-SoC. SoClib est capable de simuler une large varit de processeurs. Des composants logiciels APES sont dj crits pour fonctionner avec la plupart de ces processeurs.
3. DNA's Not just Another Operating System
2. Le projet APES
2.3.2 SHAPES
SHAPES est un projet europen qui a pour but de construire un ensemble de tuiles bases sur des architectures multiple processeurs htrognes pour faire tourner des applications demandant de lourds calculs (simulation de physique nuclaire, traitement du signal, . . .). APES ore la possibilit d'utiliser la mme application pour chaque tuiles indpendamment des spcicits matrielles.
2.3.3 EURETILE
EURETILE est la suite du projet SHAPES. Il a pour but d'associer un grand nombre de tuiles du projet SHAPES pour excuter des calculs en parallle. Ce projet soulve comme principaux problmes le chargement des programmes et la dtections des erreurs matrielles.
2. Le projet APES
10
Chapitre 3
11
ses mtadonnes (taille, type, date de modication, permissions. . .) et l'adresse du dbut des donnes (qui pourront tre d'autres inodes s'il s'agit d'un rpertoire).
Copie de la FAT
Blocs de donnes
Espace inutilis
ID
Le Volume ID est le premier secteur de la partition. Il contient des informations permettant de dcrire la partition (version du FAT, taille des blocs, adresse du rpertoire racine, etc.).
Les blocs
Les blocs occupent la majorit de l'espace et contiennent les donnes des chiers ou des entres s'il s'agit de rpertoires. Une entre, dnie sur 32 octets, contient le nom, les mtadonnes du chier et le numro du bloc contenant les donnes s'il s'agit d'un chier o des entres s'il s'agit d'un rpertoire. Une telle entre impose un nom de chier limit 8 caractres pour le nom et 3 pour l'extension.
12
Pour grer des noms plus longs, plusieurs autres entres contenant le nom complet prcde cette ultime entre.
La FAT
La FAT est un immense tableau d'adresses avec autant de cases que de blocs de donnes (l'indice du tableau correspond au numro du bloc). La valeur contenu dans la case est galement un numro de bloc (correspondant au bloc de donne suivant ou -1 pour le dernier bloc ou 0 si le bloc est libre). La taille d'une case est de 32 octets pour le FAT32, d'o la limitation du nombre de blocs. Si l'on considre un chier de 8 kilo-octets, il occupe donc deux blocs de donns. Si le premier bloc de donnes du chier est le numro 0x1000 et le second et 0x2000, alors, dans la FAT, on pourra lire l'indice 0x1000 la valeur 0x2000 et l'indice 0x2000 la valeur -1 puisqu'il n'y plus de blocs de donnes pour ce chier. La FAT est donc indispensable pour accder tous les blocs d'un chier, c'est pour cela qu'une copie est prsente. Si un secteur est illisible dans la premire FAT, l'information est disponible dans la deuxime.
FAT
entres ... 0x400 : 0x500 ... 0x500 : 0x501 0x501 : -1 ...
Blocs
Figure 3.2 Accs aux donnes d'un chier sur un volume FAT
13
Application
read()
vfs_read() OS fs_read()
FS
14
Structure vnode
La structure vnode (pour virtal inode ) reprsente un inode dans le VFS. Elle contient principalement : Un numro d'identiant unique du vnode au sein du VFS. L'identiant du volume auquel il est ratach. Les donnes de l'inode rl du FS.
15
3.
entre retourne
4.
5.
chier | mtadonnes | 0x1234
16
vfs_open("/dossier/chier") vfs_walk("/dossier/chier")
fs_open(inode_chier)
De plus, compte tenu de la structure du systme FAT, pour accder facilement une entre de rpertoire pour en lire son contenu, il a t dcid que l'identiant d'un inode (entier de 64 bits retourn par fatfs_walk()) serait compos du numro de bloc du rpertoire parent sur les 32 bits de poids fort et le numro de l'entre dans le rpertoire pour les 32 bits de poids faible.
17
it, cette fonction se contente de retourner les mtadonnes du chier partir du vnode correspondant. fatfs_close() : Comme la fonction fatfs_open() ne cre pas d'objet en mmoire, cette fonction ne fait rien. fatfs_read() : A partir des mtadonnes donnes par fatfs_open(), cette fonction lit sur le disque les secteurs contenant les octets compris entre oset et oset + nombre d'octet qui sont des paramtres. Comme pour fatfs_read_vnode(), cette fonction utilise la bibliothque pour tenir compte de la FAT.
18
Enn, le test ultime pour valider le composant logiciel FATFS a t d'excuter un serveur HTTP lger sur la carte ATMEL et d'accder un mini site web depuis le rseau, dont le contenu tait stock sur la carte SD.
19
Chapitre 4
20
Le format ELF dnit un certain nombre de sections standard. Les principales sections que l'on retrouve dans un excutable intgrant DNA-OS sont : .bss : Cette section contient les variables non initialises. .data et rodata : Pour les variables initialises. Dans la section .rodata les sections sont accessibles en lecture seulement. .text : Le code machine des instructions du programme. .shstrtab et .strtab : Ces sections contiennent les noms des sections et des symboles. .symtab : Cette section contient la table des symboles. Dans un excutable intgrant DNA-OS, on trouve galement les sections particulires suivantes : .reset et .excep : Ces sections contiennent le code d'initialisation et les vecteurs d'interruption. .hal et os_config : Ces sections contiennent les valeurs des symboles propres la HAL et la conguration de DNA dnies dans le chier de commande de l'diteur de lien (nomm ldscript, voir paragraphe 4.1.3).
21
Ce chier est lu et analys par le programme de dmarrage an de remplir la structure de donnes suivante :
22
struct _dna_arg { int argc; char * arg_opt[]; char * arg_param[]; };
O argc est un entier reprsentant le nombre d'arguments, arg_opt est un tableau de chanes de caractres dont chaque lment est le nom d'une option et arg_param est galement un tableau de chanes de caractres dont chaque case contient le paramtre de l'option. Les tableaux arg_opt et arg_param sont indics dans le mme ordre. Si une option n'a pas de paramtre associ, le paramtre enregistr est une chane vide (contenant le caractre nul \0). L'adresse mmoire o est enregistre cette structure est ensuite copie l'adresse pointe par le symbole DNA_ARG_ADDR pour que le programme charg en ait connaissance. Cette adresse est ensuite passe chaque fonction de DNA-OS qui est libre d'analyser le contenu de la structure pour vrier si une option la concerne.
23
Copier les segments de type PT_LOAD leur adresse physique Chercher le symbole DNA_ARG_ADDR Copier l'adresse de _dna_arg l'adresse pointe par DNA_ARG_ADDR Sauter au point d'entre du programme charg
24
composants intgrs l'application, du compilateur utilis et du chier ldscript utilis lors de l'dition des liens. La spcicit du bootloader ne se fait rellement que dans ce chier. Pour le cas d'application utilisant deux processeurs htrognes, le bootloader serait identique. Puisque dans la majorit des cas, le processeur a accs la mmoire du processeur secondaire. Dans le cas de tuiles le procd peut tre plus compliqu. On peut imaginer deux cas : 1. Rassembler tous les binaires sur une carte mmoire et un bootloader principal irait charger chaque binaire sur la bonne tuile puis ensuite dmarrer chaque tuile. 2. Chaque tuile possde son propre bootloader qui chargerait le binaire de l'application. Quelque soit la solution envisage, le programme que j'ai dvelopp ore une structure simple (contenue dans environ 400 lignes de code) et facilement modiable pour ajouter le cas chant, le chargement d'autres binaires pour d'autres processeurs.
25
Une fois ce test concluant, j'ai test le bootloader sur le simulateur. La seule modication a t de re-compiler l'application de test et le programme de dmarrage avec le ldscript du simulateur. Un dernier test a consist utiliser le bootloader pour charger une application plus lourde, contenant le serveur Web lger dont il est question dans le chapitre prcdent.
26
Chapitre 5
Conclusion
Ce stage, eectu au laboratoire TIMA, portait sur l' Extension des services d'un systme d'exploitation embarqu et tait compos de deux objectifs : la prise en charge du systme de chiers FAT32 par le systme d'exploitation embarqu et la ralisation d'un programme de dmarrage. Ce stage s'inscrivait dans le projet APES visant fournir des outils logiciels facilant la programmation d'applications pour systmes embarqus. La plus grande dicult du premier objectifs, qui devait permettre au systme d'exploitation DNA-OS de pouvoir accder des chiers contenus sur un priphrique format en FAT, rsidait dans la dirence de formalisme entre le VFS de DNA-OS intgr au noyau et la bibliothque utilise, dont le composant logiciel programm dpend. A l'heure actuelle, le composant logiciel est fonctionnel en lecture mais pourrait tre optimis pour s'excuter plus rapidement et occup moins de place en mmoire. Le second objectif consistait en la ralisation d'un programme dont le but est de charger une application sur le systme embarqu. Ce programme peut servir de base pour la ralisation d'un programme de dmarrage plus volu capable de charger une application s'xcutant sur une architecture complexe base de tuiles. A l'heure actuelle, le frabiquant de la carte de test n'a pas transmis les informations necssaires pour permettre au programme de dmarrage de se lancer automatiquement. Cependant, celui-ci est capable de charger une application sur un systme embarqu. Il a t conu sous forme d'application intgrant DNA-OS ant d'tre le plus gnrique possible. Ces travaux, s'intgrant au projet APES, sont diuss librement (license GNU General Public License) et seront disponible sur le site du laboratoire (http ://tima-sls.imag.fr/ ) partir du mois de septembre 2010.
27
Annexe A
Annexes
[ 3] . debug_abbrev PROGBITS 00000000 0826 b2 01206 f 00 0 0 1 [ 4] . debug_line PROGBITS 00000000 094721 02220 a 00 0 0 1 [ 5] . debug_ranges PROGBITS 00000000 0 b692b 000 ab8 00 0 0 1 [ 6] . debug_str PROGBITS 00000000 0 b73e3 009 bfc 01 MS 0 0 1 [ 7] . debug_frame PROGBITS 00000000 0 c0fe0 003 f18 00 0 0 4 [ 8] . debug_loc PROGBITS 00000000 0 c4ef8 00 b488 00 0 0 1 [ 9] . debug_pubnames PROGBITS 00000000 0 d0380 002 fd7 00 0 0 1 [10] . comment PROGBITS 00000000 0 d3357 001488 00 0 0 1 [11] . reset PROGBITS 00300000 008000 000020 00 AX 0 0 16 [12] . excep PROGBITS 00300020 008020 0001 c0 00 AX 0 0 16 [13] . text PROGBITS 20800000 010000 012564 00 AX 0 0 16 [14] . rodata PROGBITS 20812568 022568 000878 00 A 0 0 4 [15] . data PROGBITS 20812 de0 022 de0 005 ac4 00 WA 0 0 16384 [16] . os_config PROGBITS 208188 a8 0288 a8 000034 00 WA 0 0 1 [17] . hal PROGBITS 208188 e0 0288 e0 000030 00 WA 0 0 1 [18] . bss NOBITS 20822910 02 a910 001100 00 WA 0 0 4 [19] . ARM . attributes ARM_ATTRIBUTES 00001488 0 d47df 000010 00 0 0 1 [20] . shstrtab STRTAB 00000000 0 d47ef 0000 e1 00 0 0 1 [21] . symtab SYMTAB 00000000 0 d4c68 006500 10 22 1199 4 [22] . strtab STRTAB 00000000 0 db168 002 bff 00 0 0 1 Key to Flags : W ( write ) , A ( alloc ) , X ( execute ) , M ( merge ) , S ( strings ) I ( info ) , L ( link order ) , G ( group ) , x ( unknown ) O ( extra OS processing required ) o ( OS specific ) , p ( processor specific )
Section to Segment mapping : Segment Sections ... 00 . reset 01 . excep 02 . text 03 . rodata . data . os_config . hal 04 05 06 . debug_aranges . debug_info . debug_abbrev . debug_line . debug_ranges . debug_str . debug_frame . debug_loc . debug_pubnames . comment 07 . bss
29
Annexe B
ENTRY ( _start ) STARTUP ( crt0 . o ) GROUP ( - lc - lgcc ) MEMORY { reset : ORIGIN = 0 x00300000 , memory : ORIGIN = 0 x20800000 , } PHDRS { reset PT_LOAD ; excep PT_LOAD ; text PT_LOAD ; data PT_LOAD ; heap PT_NULL ; stack PT_NULL ; debug PT_NULL ; bss PT_LOAD ; } SECTIONS { . debug_aranges 0 x0 : { *(. debug_aranges *) } : debug . debug_info 0 x0 : { *(. debug_info *) } : debug . debug_abbrev 0 x0 : { *(. debug_abbrev *) } : debug . debug_line 0 x0 : { *(. debug_line *) } : debug . debug_ranges 0 x0 : { *(. debug_ranges *) } : debug
Annexes
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
. debug_str 0 x0 : { *(. debug_str *) } : debug . debug_frame 0 x0 : { *(. debug_frame *) } : debug . debug_loc 0 x0 : { *(. debug_loc *) } : debug . debug_pubnames 0 x0 : { *(. debug_pubnames *) } : debug . pdr 0 x0 : { *(. pdr *) } : debug . comment 0 x0 : { *(. comment *) } : debug . gnu . attributes 0 x0 : { *(. gnu . attributes *) } : debug . reset 0 x00300000 : { *(. reset ) } > reset : reset . excep ALIGN (0 x8 ) : { *(. excep ) } > reset : excep . init 0 x20800000 : { *(. init *) } > memory : text . ctors ALIGN (8) : { *(. ctors *) } > memory : text . text ALIGN (8) : { *(. text *) } > memory : text . fini ALIGN (8) : { *(. fini *) } > memory : text . dtors ALIGN (8) : { *(. dtors *) } > memory : text . jcr ALIGN (8) : { *(. jcr *) } > memory : text . sdata ALIGN (8) : { *(. sdata *) *(. scommon *) } > memory : data . sbss ALIGN (0 x8 ) : { *(. sbss *) } > memory : bss . rodata ALIGN (0 x8 ) : { *(. rodata *) } > memory : data . reginfo ALIGN (0 x8 ) : { *(. reginfo *) } > memory : data . data ALIGN (0 x8 ) : { *(. data *) *(. glue_7 *) *(. eh_frame *) } > memory : data . os_config ALIGN (0 x8 ) : { OS_N_DRIVERS = .; LONG (0 x2 ) OS_DRIVERS_LIST = .; LONG ( d940_system_module ) LONG ( d940_mmc_module ) OS_N_FILESYSTEMS = .; LONG (0 x3 ) OS_FILESYSTEMS_LIST = .; LONG ( rootfs_module ) LONG ( devfs_module ) LONG ( fatfs_module ) OS_N_MODULES = .; LONG (0 x1 ) OS_MODULES_LIST = .; LONG ( mmc_module ) /* LONG ( mbr_module ) */ OS_THREAD_STACK_SIZE = .; LONG (0 x8000 ) OS_KERNEL_HEAP_ADDRESS = .; LONG ( ADDR (. kheap ) ) OS_KERNEL_HEAP_SIZE = .; LONG (0 x100000 ) OS_DNA_ARG_ADDR = .; LONG (0 x0 ) ; } > memory : data . hal ALIGN (0 x8 ) : { APP_ENTRY_POINT = .; LONG ( _main ) ; CPU_OS_ENTRY_POINT = system_kickstart ; CPU_SVC_STACK_ADDR = ABSOLUTE ( ADDR (. sysstack ) ) ;
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
Annexes
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
31
= ABSOLUTE ( ADDR (. irqstack ) ) ; = ABSOLUTE ( ADDR (. fiqstack ) ) ;
CPU_IRQ_STACK_ADDR CPU_FIQ_STACK_ADDR
CPU_BSS_START = .; LONG ( ADDR (. bss ) ) CPU_BSS_END = .; LONG ( __hal_bss_end ) PLATFORM_BMX_BASE = .; LONG (0 xFFFFEE00 ) PLATFORM_AIC_BASE = .; LONG (0 xFFFFF000 ) PLATFORM_DBGU_BASE = .; LONG (0 xFFFFF200 ) PLATFORM_PIOA_BASE = .; LONG (0 xFFFFF400 ) PLATFORM_PIOB_BASE = .; LONG (0 xFFFFF600 ) PLATFORM_PIOC_BASE = .; LONG (0 xFFFFF800 ) PLATFORM_PMC_BASE = .; LONG (0 xFFFFFC00 ) PLATFORM_SYSC_BASE = .; LONG (0 xFFFFFD00 ) PLATFORM_MCI_BASE = .; LONG (0 xFFFA8000 ) } > memory : data . sysstack ALIGN (0 x8 ) + 0 x8000 : { } > memory : stack . fiqstack ALIGN (0 x8 ) + 0 x1000 : { } > memory : stack . irqstack ALIGN (0 x8 ) + 0 x1000 : { } > memory : stack . bss ALIGN (0 x8 ) : { *(. bss *) *(. rel *) *( COMMON ) __hal_bss_end = .; } > memory : bss . kheap ALIGN (0 x8 ) : {} > memory : heap } . uheap ALIGN (0 x8 ) + 0 x100000 : { _end = .;} > memory : heap
32
3.1 Structure d'un volume FAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.2 Accs aux donnes d'un chier sur un volume FAT . . . . . . . . . . . . . . . . . 12 3.3 Place du VFS entre l'utilisateur et le priphrique . . . . . . . . . . . . . . . . . . 13 3.4 Algorithme d'ouverture d'un chier par la bibliothque . . . . . . . . . . . . . . . 15 3.5 Algorithme d'ouverture d'un chier par DNA-OS . . . . . . . . . . . . . . . . . . 16 4.1 Organigramme du programme de dmarrage . . . . . . . . . . . . . . . . . . . . . 23
33
Bibliographie
[1] X. Gurin, F. Ptrot, A System Framework for the Design of Embedded Software Targeting Heterogeneous Multi-Core SoCs , in 20th IEEE International Conference on
Application-specic Systems, Architectures and Processors (ASAP'09), Boston (Ma), USA, July 7-9, IEEE Computer Society, pages 153-160, 2009 [2] X. Gurin, Approche ecace de dveloppement de logiciel embarqu pour des systmes multiprocesseurs sur puce, thse de doctorat, Grenoble Universits, Mai 2010 [3] Microsoft Corporation, FAT: General Overview of On-Disk Format in Hardware White Paper, Version 1.02, 1999
[4] Rob Riglar, FAT16 / FAT32 File IO Library, http://www.robs-projects.com/, Mai 2010 [5] Tool Interface Standards (TIS), Executable and Linkable Format (ELF) , in Portable Formats Specications, Version 1.1, 1993 [6] University of New South Wales, LibELF, http://www.cse.unsw.edu.au/, Juin 2010
BESSON Paul Laboratoire TIMA 46, avenue Flix Viallet 38031 GRENOBLE Cedex +33 4 76 57 45 86
3i4
Tlcopie : +33 4 76 57 49 81
Responsable administratif : BORRIONE Dominique Directrice Tlphone : +33 4 76 57 49 82 Ml : Dominique.Borrione@imag.fr Matre de stage : Tlphone : Ml : Tuteur enseignant : Tlphone : Ml :
ROUSSEAU Frdric +33 4 76 57 46 41 Professeur
Frederic.Rousseau@imag.fr
yves.lavault@imag.fr