BSSセグメントの直後にヒープが始まるところを読んでいました。私は、次のコードでこれを確認しようとした私が(不正なメモリアクセスからの可能性が非常に高い)コアダンプを取得:実行からBSSセグメントとプログラムブレーク(ヒープエンド)の間の領域
#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);
}
出力:
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)
これは "があることを意味していますBSSの終わりからヒープの始まりまでの間に「穴」がありますか?あらかじめ割り当てられたヒープページはなく、BSSセグメントの終了直後に開始されないようです。