Je lisais quelque part que le tas commence juste après le segment BSS. J'ai essayé de le vérifier avec le code suivant et je me décharge de base (très probablement d'un accès mémoire illégale):Zone entre le segment BSS et le saut de programme (fin de segment)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern char etext, edata, end;
int main(int argc, char **arg, char **envp) {
printf("Size of virtual memory pages %ld\n", sysconf(_SC_PAGESIZE));
printf("BSS segment ends at %p\n", &end);
printf("Program break (heap) ends at %p\n", sbrk(0));
printf("Assuming segment above %p and below %p is heap\n", &end, sbrk(0));
int *heap_ptr = (int *)sbrk(0);
//Subtract 40 bytes from heap end assuming heap is allocated
heap_ptr = heap_ptr - 10;
*heap_ptr = 21548;
printf("Reading value %d\n", *heap_ptr);
exit(EXIT_SUCCESS);
}
sortie de l'exécution:
Size of virtual memory pages 4096
BSS segment ends at 0x601060
Program break (heap) ends at 0x8da000
Assuming segment above 0x601060 and below 0x8da000 is heap
Segmentation fault (core dumped)
Est-ce que cela signifie qu'il ya un ' trou 'entre la fin de BSS et le début de tas? Il semble qu'il n'y ait pas de pages de tas pré-allouées et qu'elles ne commencent pas juste après la fin du segment BSS.