Computer Security

#16 Memory map 본문

리눅스 시스템 프로그래밍

#16 Memory map

쿠리 Kuri 2022. 9. 21. 18:30
반응형

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)크기만큼 메모리영역을 해제한다.

 

 

반응형
Comments