커널에서 특정 가상 주소가 heap인지 아닌지를 알 수 있나요
/proc/[pid]/maps를 보면
08048000-08191000 r-xp 00000000 03:01 901246 /usr/bin/vim.basic
08191000-0819d000 rw-p 00149000 03:01 901246 /usr/bin/vim.basic
0819d000-0826a000 rw-p 0819d000 00:00 0 [heap]
...
b7f96000-b7fcd000 r-xp 00000000 03:01 2654285 /lib/libncurses.so.5.5
b7fcd000-b7fd5000 rw-p 00037000 03:01 2654285 /lib/libncurses.so.5.5
b7fd5000-b7fd6000 rw-p b7fd5000 00:00 0
...
위와 같은 식으로 나타납니다. 위에서 특정 주소에 [heap] 이라고 쓰여 있고
또 프로세스의 mm_struct 구조체를 보면 start_brk와 brk라는 field가 있지만
실제로 malloc 등으로 좀 크기가 큰 영역을 할당하면, 바로 mmap을 호출해서
저 영역 외에도 heap이 잡히게 됩니다. 그러므로 mm_struct의 start_brk & brk 필드나
저 /proc/[pid]/maps 에서 보여주는 [heap] 영역만 가지고는 특정 주소나 영역이
heap인지 아닌지 알 수 없다는 의미입니다. [heap] 이라고 쓰여 있지 않고 그냥
아무것도 쓰여있지 않은 경우 (맨 밑줄)도 heap일 수 있다는 이야기입니다.
하지만 그런 영역이 모두 heap은 아닌 것이, shared library의 bss 영역일 가능성이
더 높습니다.
가상 주소를 알면 find_vma 함수로 해당하는 vm_area_struct 객체를 찾을 수 있습니다.
그렇다면 이 특정 vm_area_struct 구조체의 instance를 보고
이 vma가 동적으로 할당된 heap인지 아닌지를 알 방법이 있나요?
vma의 여러 flag들을 검사해 보았지만 heap에 특정하게 나타나는 flag를 찾지 못했습니다.
do_mmap에 넘어오는 flag에서 MAP_ANONYMOUS가 set 되어 있는 경우를 트래킹 해 보기도
했습니다만, 동적 할당이 아닌 경우(위의 shared library의 bss와 같은)에도 모두
MAP_ANONYMOUS flag가 붙습니다.
정리하면, 커널에서 어떤 virtual address가 현재 heap에 해당하는지 아닌지 알 수 있는
방법이 있나요?
그리고 제가 위에 적은 사항이나, 시도해 본 것들 중에 잘못된 것이 있다면
알려주시면 감사하겠습니다. (__);


댓글 달기