여기를 참조 했다.
#include <stdio.h> #include <sys/mman.h> int main(int argc, char *argv[]) { char *ptr; int ret; ptr = (char *) mmap((void *) 0x10000, 512 * 1024, PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); printf("page size is %0x\n",getpagesize()); printf("ptr is %p\n",ptr); sleep(10); /* all done with 'p', so give back the 512 KB mapping */ ret = munmap (ptr, 512 * 1024); if (ret) perror ("munmap"); }
pi@raspberrypi:~/Project/cCode/systemProgram $ ./a.out & [1] 3566 pi@raspberrypi:~/Project/cCode/systemProgram $ page size is 1000 ptr is 0xb6ff0000 pi@raspberrypi:~/Project/cCode/systemProgram $ cat /proc/3566/maps 00010000-00011000 r-xp 00000000 b3:02 386325 /home/pi/Project/cCode/systemProgram/a.out 00020000-00021000 r--p 00000000 b3:02 386325 /home/pi/Project/cCode/systemProgram/a.out 00021000-00022000 rw-p 00001000 b3:02 386325 /home/pi/Project/cCode/systemProgram/a.out 014a8000-014c9000 rw-p 00000000 00:00 0 [heap] b6e54000-b6f8c000 r-xp 00000000 b3:02 2038 /lib/arm-linux-gnueabihf/libc-2.28.so b6f8c000-b6f9c000 ---p 00138000 b3:02 2038 /lib/arm-linux-gnueabihf/libc-2.28.so b6f9c000-b6f9e000 r--p 00138000 b3:02 2038 /lib/arm-linux-gnueabihf/libc-2.28.so b6f9e000-b6f9f000 rw-p 0013a000 b3:02 2038 /lib/arm-linux-gnueabihf/libc-2.28.so b6f9f000-b6fa2000 rw-p 00000000 00:00 0 b6fb1000-b6fb5000 r-xp 00000000 b3:02 12827 /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so b6fb5000-b6fc4000 ---p 00004000 b3:02 12827 /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so b6fc4000-b6fc5000 r--p 00003000 b3:02 12827 /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so b6fc5000-b6fc6000 rw-p 00004000 b3:02 12827 /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so b6fc6000-b6fe6000 r-xp 00000000 b3:02 1963 /lib/arm-linux-gnueabihf/ld-2.28.so b6ff0000-b6ff6000 rw-p 00000000 00:00 0 b6ff6000-b6ff7000 r--p 00020000 b3:02 1963 /lib/arm-linux-gnueabihf/ld-2.28.so b6ff7000-b6ff8000 rw-p 00021000 b3:02 1963 /lib/arm-linux-gnueabihf/ld-2.28.so bec5d000-bec7e000 rw-p 00000000 00:00 0 [stack] bef82000-bef83000 r-xp 00000000 00:00 0 [sigpage] bef83000-bef84000 r--p 00000000 00:00 0 [vvar] bef84000-bef85000 r-xp 00000000 00:00 0 [vdso] ffff0000-ffff1000 r-xp 00000000 00:00 0 [vectors]
0x10000에 메모리를 요청했으나, 불가능하여 0xb6ff0000에 0x2000 byte를 얻었다. 512 KB로 다시 맵핑하여 cat/proc/PID/maps로 확인했다.
- heap 영역 밖 노란열에 512KB를 할당 받았다.(anonymous memory mapping)
- a.out이 3KB(1K+1K+1K)메모리를 사용한다. 10,000~11,000까지 한 블럭, 20,000 ~ 21,000까지 한 블록. 나머지 21,000 ~ 22,000는 offset 1K를 주고 사용한다.
- a.out 파일 크기는 8KB 이다. 나머지는 메모리의 다른 영역에 넣는 듯 하다.
- libc-2.28.so는 817KB 메모리를 사용한다.(0x138+0x10+0x2+0x1).
- b5dbd000 ~ d6ef5000에서 0x138KB를 사용하고, 그 다음 주소에 libc-2.28.so 파일 offset 0x138KB만큼 주고 사용한다. 그 뒤로 같은 방식으로 사용한다.
- 별도 설정을 하지 않을 경우, heap과 stack은 같은 크기를 갖는다??