Segmentation - Kasimashi/Systemes-embarques GitHub Wiki
Segmentation
Comment est composé un programme ? (Segmentation)
Nom de la section | Description | Memory Type | Location | Why |
---|---|---|---|---|
.text | Code | Initialialisé | FLASH | Must exist after reset |
.switch | Tables for switch instructions | Initialialisé | ||
.const | Global and static string literals | Initialialisé | ||
.cinit | Initial values for global/static vars | Initialialisé | FLASH | Must exist after reset |
.pinit | Initial values for C++ constructors | Initialialisé | ||
.bss | Global and static variables | Non Initialialisé | Internal | Must be in RAM Memory |
.far | Aggregates (arrays & structures) | Non Initialialisé | ||
.stack | Stack (local variables) | Non Initialialisé | Internal | Must be in RAM Memory |
.sysmem | Memory for malloc fcns (heap) | Non Initialialisé | ||
.cio | Buffers for stdio functions | Non Initialialisé |
La mémoire d’un programme informatique est divisée ainsi :
- Un segment de données (Données + BSS + tas) ;
- Une pile d'exécution, souvent abrégée par "la pile" ;
- Un segment de code.
Segment .rodata (Read Only Data)
Le segment .rodata contient des constantes statiques plutôt que des variables.
Segment de données .data
Le segment .data contient toutes les variables globales ou statiques qui ont une valeur prédéfinie et peuvent être modifiées. Il s'agit de toutes les variables qui ne sont pas définies dans une fonction (et qui peuvent donc être accédées de n'importe où) ou qui sont définies dans une fonction mais qui sont définies comme statiques afin qu'elles conservent leur adresse lors des appels suivants.
Les valeurs de ces variables sont initialement stockées dans la mémoire morte (généralement dans .text ) et sont copiées dans le segment .data pendant la routine de démarrage du programme. Notez que dans l'exemple ci-dessus, si ces variables avaient été déclarées à partir d'une fonction, elles seraient stockées par défaut dans le cadre de la pile locale.
Segment .text
Le segment .text est l'endroit qui correspond à l'espace d'addressage du programme en ce qui concerne les instructions éxecuté par le programme. Cette zone est généralement en lecture seule et de taille fixe.
Segment .bss
Le segment BSS aussi connu comme zone de données non initialisées commence à la fin du segment de données et contient toutes les variables globales et toutes les variables statiques qui sont initialisées à zéro ou n’ont pas d’initialisation explicite dans le code source.
Par exemple, une variable déclarée static int i;
sera « contenue » dans le segment BSS.
Segment Heap : "Le Tas"
La zone de tas commence généralement à la fin des segments .bss et .data et se développe vers des adresses plus grandes à partir de là. La zone de tas est gérée par malloc , calloc, realloc et free. La zone de tas est partagée par tous les threads, bibliothèques partagées et modules chargés dynamiquement dans un processus.
Segment Stack : "La Pile"
La zone de pile contient la pile de programmes , une structure LIFO (Last In First Out). Généralement située dans les parties supérieures de la mémoire. Un registre "pointeur de pile" suit le haut de la pile; il est ajusté chaque fois qu'une valeur est "poussée" sur la pile.
Un exemple simple pour illustrer le cas d'une variable en pile et une autre en heap est la suivante :
La zone mémoire ou sont conservés les varibales dépend ou est déclaré la variable dans le programme prenons l'exemple de ce programme :
uint32_t myvarOutMain; //Saved int the data section of the RAM in the heap
int main(void)
{
uint32_t myvarInMain = 0xDEADBEEF; //Saved in the stack
return 0;
}
Dans le premier cas pour la variables myvarOutMain
cette dernière est conservée dans le "heap", et pour la variables myvarInMain
cette dernière est conservée dans la pile.
More
https://mcuoneclipse.com/2013/04/14/text-data-and-bss-code-and-data-size-explained/