память кучи нулевого размера в выравнивании по страницам - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь изучить, как поведет себя Linux, если бы я выделил 10 байтов памяти на каждой границе страницы в общей сложности на десяти страницах. Вот программа, которую я мог бы придумать:

  1 #include <stdlib.h>$
  2 #include <stdio.h>$
  3 #include <time.h>$
  4 #include <unistd.h>$
  5 #include <string.h>$
  6 $
  7 #define PAGESIZE getpagesize()$
  8 int main () {$
  9     int *ArrP[10] = {NULL};$
 10     int pgSz = PAGESIZE;$
 11     int randnum;$
 12 $
 13     
 14     for (int i = 0; i < (sizeof(ArrP)/sizeof(int*)); i++) {$
 15         if(posix_memalign((void **)&ArrP[i], pgSz, 10)) {$
 16             perror("error getting page aligned mem: ");$
 17             exit(1);$
 18         }$
 19         else$
 20             printf("ArrP[%d] = %lu\n", i, ArrP[i]);$
 21     }$
 22 $
 23     srand(time(0));$
 24     while(1) {$
 25         for (int i = 0; i <(sizeof(ArrP)/sizeof(int*)); i++) {$
 26             randnum = rand();$
 27             memcpy(ArrP[i], &randnum, sizeof(int));$
 28         }$
 29     }$
 30     return 0;$
 31 }$

Однако, когда я ее запускаю, файл / proc / pid / maps показывает размер кучи 0. Вот содержимое этого файла:

555555554000-555555555000 r--p 00000000 08:01 1966744                    /home/AB1/ProgPractice/InternalFragmentation
555555555000-555555556000 r-xp 00001000 08:01 1966744                    /home/AB1/ProgPractice/InternalFragmentation
555555556000-555555557000 r--p 00002000 08:01 1966744                    /home/AB1/ProgPractice/InternalFragmentation
555555557000-555555558000 r--p 00002000 08:01 1966744                    /home/AB1/ProgPractice/InternalFragmentation
555555558000-555555559000 rw-p 00003000 08:01 1966744                    /home/AB1/ProgPractice/InternalFragmentation
555555559000-55555557a000 rw-p 00000000 00:00 0                          [heap]
7ffff7dd8000-7ffff7dfd000 r--p 00000000 08:01 2234184                    /usr/lib/libc-2.30.so
7ffff7dfd000-7ffff7f4a000 r-xp 00025000 08:01 2234184                    /usr/lib/libc-2.30.so
7ffff7f4a000-7ffff7f94000 r--p 00172000 08:01 2234184                    /usr/lib/libc-2.30.so
7ffff7f94000-7ffff7f95000 ---p 001bc000 08:01 2234184                    /usr/lib/libc-2.30.so
7ffff7f95000-7ffff7f98000 r--p 001bc000 08:01 2234184                    /usr/lib/libc-2.30.so
7ffff7f98000-7ffff7f9b000 rw-p 001bf000 08:01 2234184                    /usr/lib/libc-2.30.so
7ffff7f9b000-7ffff7fa1000 rw-p 00000000 00:00 0
7ffff7fce000-7ffff7fd1000 r--p 00000000 00:00 0                          [vvar]
7ffff7fd1000-7ffff7fd2000 r-xp 00000000 00:00 0                          [vdso]
7ffff7fd2000-7ffff7fd4000 r--p 00000000 08:01 2234140                    /usr/lib/ld-2.30.so
7ffff7fd4000-7ffff7ff3000 r-xp 00002000 08:01 2234140                    /usr/lib/ld-2.30.so
7ffff7ff3000-7ffff7ffb000 r--p 00021000 08:01 2234140                    /usr/lib/ld-2.30.so
7ffff7ffc000-7ffff7ffd000 r--p 00029000 08:01 2234140                    /usr/lib/ld-2.30.so
7ffff7ffd000-7ffff7ffe000 rw-p 0002a000 08:01 2234140                    /usr/lib/ld-2.30.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

Я отключил ASLR, но это не имеет значения. Любые предложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...