anonymous memory mapping, p308

https://www.miroch.ru/2017/01/17/linux-process-memory-layout/
proc pid maps

여기를 참조 했다.

#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은 같은 크기를 갖는다??

코멘트

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.