bunta의 보조기억장치

[3주차 TIL] KnockOn Bootcamp 메모리 구조와 매핑 본문

KnockOn Bootcamp

[3주차 TIL] KnockOn Bootcamp 메모리 구조와 매핑

bunta 2025. 4. 20. 21:46
반응형

💡 메모리 섹션

메모리에서 프로그램이 실행될 때 운영체제는 해당 프로그램을 여러 구역으로 나눠서 관리한다.

이 중 대표적인 Code Section, Data Section, Heap, Stack에 대해서 다뤄보고자 한다.

메모리의 영역


🔎 Code Section

실행할 프로그램의 기계어 코드(명령어)가 저장되는 영역이다.

보통 읽기 전용으로 설정되어 있어서 코드 수정이 불가능하며, 프로그램이 실행되면 이 영역의 명령어를 CPU가 순차적으로 읽어 수행하게 된다.


🔎 Data Section

전역 변수, 정적 변수가 저장되는 영역이다.

프로그램이 실행되는 동안 항상 메모리에 존재하며, 초기화된 데이터와 초기화되지 않은 데이터를 나누어 저장한다.


🔎 Heap

동적 메모리 할당을 위한 영역이다.

프로그래머가 직접 malloc(), new, free() 등의 함수를 통해 수동으로 할당과 해제를 관리해야 한다.

크기와 생존 기간을 런타임으로 결정할 수 있어 유연하게 사용이 가능하지만 잘못 관리할 경우 메모리 누수나 오류가 발생할 수 있는 문제가 있다.

낮은 주소에서 높은 주소 방향으로 확장된다.


🔎 Stack

함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등을 저장하는 영역이다.

함수가 호출되면 그에 따른 스택 프레임(Stack Frame)이 생성되고 함수가 끝나면 자동으로 소멸된다.

후입선출(LIFO) 구조로 작동하며 높은 주소에서 낮은 주소 방향으로 확장된다.

일반적으로 해당 영역은 운영체제가 자동으로 관리한다.


🔎 각 영역의 권한

  읽기 쓰기 실행
Code Section O X O
Data Section O O X
Heap O O X
Stack O O X

 


🔎 /proc/{PID}/maps

Linux 환경에서 프로세스 메모리 배치와 권한을 조회할 수 있는 경로이다.

디버깅, 메모리 보호 확인, 버그 추적, 보안 취약점 분성 등에 자주 활용된다.

 

예시)

cat /proc/$$/maps → $$는 현재 쉘의 PID를 의미, 즉 현재 쉘에 대한 정보를 출력

 

출력 결과)

55af50521000-55af50550000 r--p 00000000 08:20 1462                       /usr/bin/bash
55af50550000-55af5062f000 r-xp 0002f000 08:20 1462                       /usr/bin/bash
55af5062f000-55af50669000 r--p 0010e000 08:20 1462                       /usr/bin/bash
55af5066a000-55af5066e000 r--p 00148000 08:20 1462                       /usr/bin/bash
55af5066e000-55af50677000 rw-p 0014c000 08:20 1462                       /usr/bin/bash
55af50677000-55af50682000 rw-p 00000000 00:00 0
55af8d53a000-55af8d6de000 rw-p 00000000 00:00 0                          [heap]
7f4cdcb3d000-7f4cdcb94000 r--p 00000000 08:20 55270                      /usr/lib/locale/C.utf8/LC_CTYPE
7f4cdcb94000-7f4cdcb95000 r--p 00000000 08:20 55276                      /usr/lib/locale/C.utf8/LC_NUMERIC
7f4cdcb95000-7f4cdcb96000 r--p 00000000 08:20 55279                      /usr/lib/locale/C.utf8/LC_TIME
7f4cdcb96000-7f4cdcb97000 r--p 00000000 08:20 55269                      /usr/lib/locale/C.utf8/LC_COLLATE
7f4cdcb97000-7f4cdcb98000 r--p 00000000 08:20 55274                      /usr/lib/locale/C.utf8/LC_MONETARY
7f4cdcb98000-7f4cdcb9f000 r--s 00000000 08:20 50986                      /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7f4cdcb9f000-7f4cdcba2000 rw-p 00000000 00:00 0
7f4cdcba2000-7f4cdcbca000 r--p 00000000 08:20 50689                      /usr/lib/x86_64-linux-gnu/libc.so.6
7f4cdcbca000-7f4cdcd5f000 r-xp 00028000 08:20 50689                      /usr/lib/x86_64-linux-gnu/libc.so.6
7f4cdcd5f000-7f4cdcdb7000 r--p 001bd000 08:20 50689                      /usr/lib/x86_64-linux-gnu/libc.so.6
7f4cdcdb7000-7f4cdcdb8000 ---p 00215000 08:20 50689                      /usr/lib/x86_64-linux-gnu/libc.so.6
7f4cdcdb8000-7f4cdcdbc000 r--p 00215000 08:20 50689                      /usr/lib/x86_64-linux-gnu/libc.so.6
7f4cdcdbc000-7f4cdcdbe000 rw-p 00219000 08:20 50689                      /usr/lib/x86_64-linux-gnu/libc.so.6
7f4cdcdbe000-7f4cdcdcb000 rw-p 00000000 00:00 0
7f4cdcdcb000-7f4cdcdd9000 r--p 00000000 08:20 12062                      /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3
7f4cdcdd9000-7f4cdcdea000 r-xp 0000e000 08:20 12062                      /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3
7f4cdcdea000-7f4cdcdf8000 r--p 0001f000 08:20 12062                      /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3
7f4cdcdf8000-7f4cdcdfc000 r--p 0002c000 08:20 12062                      /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3
7f4cdcdfc000-7f4cdcdfd000 rw-p 00030000 08:20 12062                      /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3
7f4cdcdfd000-7f4cdcdfe000 r--p 00000000 08:20 55273                      /usr/lib/locale/C.utf8/LC_MESSAGES/SYS_LC_MESSAGES
7f4cdcdfe000-7f4cdcdff000 r--p 00000000 08:20 55277                      /usr/lib/locale/C.utf8/LC_PAPER
7f4cdcdff000-7f4cdce00000 r--p 00000000 08:20 55275                      /usr/lib/locale/C.utf8/LC_NAME
7f4cdce00000-7f4cdce01000 r--p 00000000 08:20 55268                      /usr/lib/locale/C.utf8/LC_ADDRESS
7f4cdce01000-7f4cdce02000 r--p 00000000 08:20 55278                      /usr/lib/locale/C.utf8/LC_TELEPHONE
7f4cdce02000-7f4cdce03000 r--p 00000000 08:20 55272                      /usr/lib/locale/C.utf8/LC_MEASUREMENT
7f4cdce03000-7f4cdce05000 rw-p 00000000 00:00 0
7f4cdce05000-7f4cdce07000 r--p 00000000 08:20 50686                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f4cdce07000-7f4cdce31000 r-xp 00002000 08:20 50686                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f4cdce31000-7f4cdce3c000 r--p 0002c000 08:20 50686                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f4cdce3c000-7f4cdce3d000 r--p 00000000 08:20 55271                      /usr/lib/locale/C.utf8/LC_IDENTIFICATION
7f4cdce3d000-7f4cdce3f000 r--p 00037000 08:20 50686                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7f4cdce3f000-7f4cdce41000 rw-p 00039000 08:20 50686                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ffdd81c2000-7ffdd81e3000 rw-p 00000000 00:00 0                          [stack]
7ffdd81f1000-7ffdd81f5000 r--p 00000000 00:00 0                          [vvar]
7ffdd81f5000-7ffdd81f7000 r-xp 00000000 00:00 0                          [vdso]

 

 

위의 결과에서 각 영역의 의미는 부분은 아래와 같다.

 

메모리 위치 권한 offset device incode path
55af50521000-55af50550000 r--p 00000000 08:20 1462 /usr/bin/bash

 

반응형
Comments