Как получить правильный стартовый адрес кучи в Linux? - PullRequest
0 голосов
/ 23 февраля 2019

В моем коде C:

 unsigned char* p2 = NULL;
 p2 = malloc(0x1024);
 printf("start of heap = %p \r\n",p2);
 printf("end of heap = 0x%x \r\n",(unsigned long)sbrk(0));
 unsigned long sizeOfHeap = (unsigned long)sbrk(0) - (unsigned long)p2;
 printf("sizeOfHeap = 0x%x \r\n",sizeOfHeap);

И это показывает:

yangxiaoyu@STB-240:~/test/c/mem$ ./a.out   
start of heap = 0x1b26010 
end of heap = 0x1b48000 
sizeOfHeap = 0x21ff0 

Но когда я добавляю "while (1)" в конце этого кода, и cat procкарты,

yangxiaoyu@STB-240:~/test/c/mem$ ./a.out & 
[1] 163026
yangxiaoyu@STB-240:~/test/c/mem$ start of heap = 0xb7b010 
end of heap = 0xb9d000 
sizeOfHeap = 0x21ff0 

yangxiaoyu@STB-240:~/test/c/mem$ cat /proc/163026/map
map_files/ maps       
yangxiaoyu@STB-240:~/test/c/mem$ cat /proc/163026/map
map_files/ maps       
yangxiaoyu@STB-240:~/test/c/mem$ cat /proc/163026/maps 
00400000-00401000 r-xp 00000000 08:12 266873328                          /home/yangxiaoyu/test/c/mem/a.out
00600000-00601000 r--p 00000000 08:12 266873328                          /home/yangxiaoyu/test/c/mem/a.out
00601000-00602000 rw-p 00001000 08:12 266873328                          /home/yangxiaoyu/test/c/mem/a.out
00b7b000-00b9d000 rw-p 00000000 00:00 0                                  [heap]
7f499604e000-7f499620c000 r-xp 00000000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f499620c000-7f499640c000 ---p 001be000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f499640c000-7f4996410000 r--p 001be000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f4996410000-7f4996412000 rw-p 001c2000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f4996412000-7f4996417000 rw-p 00000000 00:00 0 
7f4996417000-7f499643a000 r-xp 00000000 08:03 9572106                    /lib/x86_64-linux-gnu/ld-2.19.so
7f4996624000-7f4996627000 rw-p 00000000 00:00 0 
7f4996638000-7f4996639000 rw-p 00000000 00:00 0 
7f4996639000-7f499663a000 r--p 00022000 08:03 9572106                    /lib/x86_64-linux-gnu/ld-2.19.so
7f499663a000-7f499663b000 rw-p 00023000 08:03 9572106                    /lib/x86_64-linux-gnu/ld-2.19.so
7f499663b000-7f499663c000 rw-p 00000000 00:00 0 
7ffde625a000-7ffde627b000 rw-p 00000000 00:00 0                          [stack]
7ffde633b000-7ffde633d000 r--p 00000000 00:00 0                          [vvar]
7ffde633d000-7ffde633f000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
yangxiaoyu@STB-240:~/test/c/mem$ 

вы можете получить

начало кучи = 0xb7b010 ,

и

00b7b000-00b9d000 rw-p 00000000 00:00 0 [куча]

Итак, как мне получить реальный адрес кучи в C-коде?ПОЧЕМУ адрес malloc (0xb7b010) не равен 0b7b000?

1 Ответ

0 голосов
/ 23 февраля 2019

00b7b000 - фактическое начало памяти кучи, выделенной программе.

Когда вы вызываете malloc, он сохранит некоторые данные до возврата указателя (в данном случае 16 байтов).Сохраненные данные зависят от конкретной реализации, но по крайней мере размер выделенной памяти должен быть сохранен.

Эта информация используется, когда вы вызываете free, чтобы должным образом освободить память для будущего использования.Он также используется для realloc функций.

Что касается конца, не соответствующего заданному размеру, то, вероятно, программа берет часть памяти из ОС для кучи и использует ее по мере необходимости.Таким образом, даже если вы выделили 0x21ff0 байт, еще можно выделить некоторые данные, прежде чем запрашивать у ОС больше памяти.

...