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.

Segmentation

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/