일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 리눅스
- kernel
- 커널
- 시스템해킹
- 시스템
- C언어
- Pwnable.kr
- 시스템 프로그래밍
- radare2
- pwn.college
- 워게임
- 리눅스커널
- C++
- write up
- 어셈블리어
- Bandit
- 시스템프로그래밍
- 드론
- 리버싱
- 취약점
- pwncollege
- Leviathan
- px4
- 리눅스 커널
- 프로그래밍
- 컴퓨터구조
- wargame
- 시그널
- 알고리즘
- css
- Today
- Total
Computer Security
#16 Memory map 본문
OS 상에 동작하고있는 프로세스들이 동시에 실행 되고 있는데, 각각의 프로세스가 자기만의 독립적인공간(address space) 를 가지고 있다 착각하게 만들어주는게 OS의 역할중 하나이다.
Process address space
프로그램(Program)이 실행되면 프로세스 주소 공간(Process Address Space)이 Memory에 할당(생성) 되는것을 볼 수 있다.
할당 된 process를 실행시키는것은 CPU가 되게 된다.
Process Address Space | |
Code Segment (코드 부분) | 프로그램의 코드가 저장되어있다. |
읽기만 가능하다. | |
Data Segment (데이터 부분) | 전역 변수(global variables) 같은 데이터가 저장되어 있다. |
읽고 쓰기가 가능하다. | |
Stack Segment (스택 부분) | 함수(function) 나 지역 변수(local variables)가 저장되어 있다. |
읽고 쓰기가 가능하다. |
1) Code Segment
코드가 저장되어 있는 부분
프로그램의 코드는 바뀌어서는 안되므로 읽기만 가능한 부분
2) Data Segment
전역 변수 같은 데이터를 관리하는 부분
함수의 바깥에 있는 데이터(전역 변수)를 저장해 놓는다.
변수는 변할 수 있으므로 읽고 쓰기가 가능하다.
3) Stack Segment
함수나 함수 안에 있는 지역 변수를 저장해 놓는다.
변수는 변할 수 있으므로 읽고 쓰기가 가능하다.
Process Address Space 내부
Program이 실행되면 Process가 생성이 되고 Memory에 그 process의 Address Space가 할당되게 된다.
Address Space안은 위 그림과 같이 Code, Data, Stack 부분으로 이루어져 있다.
메모리 매핑 API
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
파라미터
- addr : mapping 될 address (요청한 주소로 매핑 할 수 있으면 매핑 하지만, 어려우면 다른 주소로 할 수 있다.) (강제성X)
- length : mapping 할 길이
- prot : 권한 설정
- PROT_EXEC
- PROT_READ
- PROT_WRITE
- PROT_NONE
- flags :
- MAP_SHARED : 파일을 매핑하면서 다른 프로세스와 공유 할 것 인지 본인만 쓸 것인지
- MAP_PRIVATE : 파일을 매핑하면서 다른 프로세스와 공유 할 것 인지 본인만 쓸 것인지
- MAP_FIXED : addr 가 강제성이 생긴다. 고정된 주소를 못받으면 FAIL 처리된다.
- fd : 어떤 파일의 있는 내용을 매핑할 것인지 결정
- offset : 파일의 어느 위치부터 mapping 할 것 인지(반드시 page size의 배수)
반환 값
- 성공 시 mapping 된 주소
- 실패 시 MAP_FAILED
메모리 매핑 해제 API
#include <sys/mman.h>
int munmap(void *addr, size_t length);
파라미터
- addr : mapped address(매핑된 메모리의 시작 주소)
- length : mapped 길이
반환 값
- 성공 시 0
- 실패 시 -1
munmap 함수는 addr이 가리키는 영역에 len크기만큼 할당해 매핑한 메모리를 해제한다.
munmap메모리에 매핑된 (addr+len)크기만큼 메모리영역을 해제한다.
'리눅스 시스템 프로그래밍' 카테고리의 다른 글
#18 파일을 이용한 동기화(Race condition) (2) | 2022.09.23 |
---|---|
#17 Memory map (실습) (0) | 2022.09.22 |
#15 디렉토리 다루기 (실습) (0) | 2022.09.20 |
#14 디렉토리 다루기 (2) | 2022.09.19 |
#13 파일 속성(실습) (0) | 2022.09.18 |