8 메모리 매핑.

Slides:



Advertisements
Similar presentations
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
Advertisements

인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Chapter 6. 리눅스 백도어 황 선 환.
Linux System Programming
-Part2- 제3장 포인터란 무엇인가.
9 파이프.
Signal & Inter-Process Communication
08. 디바이스 드라이버의 읽기와 쓰기 김진홍
Linux System Programming
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
6 프로세스 생성과 실행.
6 프로세스 생성과 실행.
Department of Computer Science and Engineering
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
레이스 컨디션.
Unix Project2 <test character device 생성>
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
Department of Computer Engineering
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
제 3장. C보다 나은 C++ II.
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
Input/Output Control.
07. 디바이스 드라이버의 초기화와 종료 김진홍
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
레이스 컨디션 컴퓨터공학과 4학년 이교욱.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
Signal & Inter-Process Communication
Department of Computer Engineering
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
파이프와 exec 시스템 호출 (ls | wc)
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
(ioctl, mmap, fsync&flush)
4장 파일.
임베디드 실습 # LED, 7’Segment 제어
6장 파일 및 레코드 잠금.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
DK-128 실습 EEPROM 제어 아이티즌 기술연구소
MicroC/OS-II 3. Memory Management ITISN Technical Lab.
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
FILE I/O 번째주 Dept. of Computer Science & Engineering
Department of Computer Engineering
Cross Compiler를이용한 커널 컴파일 및 포팅
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
Signal & Inter-Process Communication
13장 프로세스 사이의 통신.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
School of Electronics and Information. Kyung Hee University.
Department of Computer Engineering
Signal & Inter-Process Communication
Department of Computer Engineering
3. 모듈 (5장. 모듈).
시스템 인터페이스 Lab1 X-window 및 명령어 사용.
구조체(struct)와 공용체(union)
Chapter 12 파일 입출력.
9 파이프.
Department of Computer Engineering
06. 디바이스의 등록과 해제 김진홍
Signal & Inter-Process Communication
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
3장 파일 다루기 한빛미디어(주).
Signal & Inter-Process Communication
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

8 메모리 매핑

학습목표 통신프로그램이 무엇인지 이해한다. 메모리 매핑을 이용한 IPC 기법을 이해한다. 메모리 매핑 함수를 사용해 프로그램을 작성할 수 있다.

목차 메모리 매핑의 개념 메모리 매핑 함수 메모리 매핑 해제 함수 메모리 매핑의 보호모드 변경 파일의 크기 확장 매핑된 메모리 동기화 데이터 교환하기

메모리 매핑의 개념 메모리 매핑 메모리 매핑과 기존 방식의 비교 파일을 프로세스의 메모리에 매핑 프로세스에 전달할 데이터를 저장한파일을 직접 프로세스의 가상 주소 공간으로 매핑 read, write 함수를 사용하지 않고도 프로그램 내부에서 정의한 변수를 사용해 파일에서 데이터를 읽거나 쓸 수 있음 메모리 매핑과 기존 방식의 비교 기존 방식 메모리매핑 함수 사용 fd = open(…); lseek(fd, offset, whence); read(fd, buf, len); fd = open(…); addr = mmap((caddr_t)0, len, (PROT_READ|PROT_WRITE), MAP_PRIVATE, fd, offset); read 함수를 사용하지 않고도 데이터 접근 가능

메모리 매핑 함수 메모리 매핑: mmap(2) fildes가 가리키는 파일에서 off로 지정한 오프셋부터 len크기만큼 데이터를 읽어 addr이 가리키는 메모리 공간에 매핑 prot : 보호모드 PROT_READ : 매핑된 파일을 읽기만 함 PROT_WRITE : 매핑된 파일에 쓰기 허용 PROT_EXEC : 매핑된 파일을 실행가능 PROT_NONE : 매핑된 파일에 접근 불가 prot에 PROT_WRITE를 지정하려면 flags에 MAP_PRIVATE를 지정하고, 파일을 쓰기 가능 상태로 열어야함 flags : 매핑된 데이터를 처리하기 위한 정보 저장 MAP_SHARED : 다른 사용자와 데이터의 변경 내용공유 MAP_PRIVATE : 데이터의 변경 내용 공유 안함 MAP_FIXED : 매핑할 주소를 정확히 지정(권장 안함) MAP_NORESERVE : 매핑된 데이터를 복사해 놓기 위한 스왑영역 할당 안함 MAP_ANON : 익명의 메모리 영역 주소를 리턴 MAP_ALIGN : 메모리 정렬 지정 MAP_TEXT : 매핑된 메모리 영역을 명령을 실행하는 영역으로 사용 MAP_INITDATA : 초기 데이터 영역으로 사용 #include <sys/mman.h> void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);

[예제 8-1] mmap 함수 사용하기(1) ... 08 int main(int argc, char *argv[]) { ex8_1.c ... 08 int main(int argc, char *argv[]) { 09 int fd; 10 caddr_t addr; 11 struct stat statbuf; 12 13 if (argc != 2) { 14 fprintf(stderr, "Usage : %s filename\n", argv[0]); 15 exit(1); 16 } 17 18 if (stat(argv[1], &statbuf) == -1) { perror("stat"); 20 exit(1); 21 } 22 23 if ((fd = open(argv[1], O_RDWR)) == -1) { 24 perror("open"); 25 exit(1); 26 } 27 (다음 쪽) 명령행 인자로 매핑할 파일명 입력

[예제 8-1] mmap 함수 사용하기(2) ex8_1.c 28 addr = mmap(NULL, statbuf.st_size, PROT_READ|PROT_WRITE, 29 MAP_SHARED, fd, (off_t)0); 30 if (addr == MAP_FAILED) { 31 perror("mmap"); 32 exit(1); 33 } 34 close(fd); 35 36 printf("%s", addr); 37 38 return 0; 39 } 파일 내용을 메모리에 매핑 매핑한 파일내용 출력 # cat mmap.dat HANBIT BOOK # ex8_1.out Usage : ex8_1.out filename # ex8_1.out mmap.dat

메모리 매핑 해제 함수 메모리 매핑 해제: munmap(2) #include <sys/mman.h> addr이 가리키는 영역에 len 크기만큼 할당해 매핑한 메모리 해제 해제한 메모리에 접근하면 SIGSEGV 또는 SIGBUS 시그널 발생 #include <sys/mman.h> int munmap(void *addr, size_t len); ... 08 int main(int argc, char *argv[]) { 09 int fd; 10 caddr_t addr; 11 struct stat statbuf; 12 13 if (argc != 2) { 14 fprintf(stderr, "Usage : %s filename\n", argv[0]); 15 exit(1); 16 } 17 18 if (stat(argv[1], &statbuf) == -1) { [예제 8-2] munmap 함수 사용하기 ex8_2.c

[예제 8-2] munmap 함수 사용하기(2) ex8_2.c 19 perror("stat"); 20 exit(1); } 23 if ((fd = open(argv[1], O_RDWR)) == -1) { 24 perror("open"); 25 exit(1); 26 } 27 28 addr = mmap(NULL, statbuf.st_size, PROT_READ|PROT_WRITE, 29 MAP_SHARED, fd, (off_t)0); 30 if (addr == MAP_FAILED) { 31 perror("mmap"); 32 exit(1); 33 } 34 close(fd); 35 36 printf("%s", addr); 37 38 if (munmap(addr, statbuf.st_size) == -1) { 39 perror("munmap"); 40 exit(1); 41 } 42 43 printf("%s", addr); 44 45 return 0; 46 } 파일 내용을 메모리에 매핑 메모리 매핑 해제 매핑이 해제된 메모리에 접근 # ex8_2.out mmap.dat HANBIT BOOK 세그멘테이션 결함(Segmentation Fault)(코어 덤프)

메모리 매핑의 보호모드 변경 보호모드 변경: mprotect(2) #include <sys/mman.h> mmap 함수로 메모리 매핑을 수행할 때 초깃값을 설정한 보호모드를 mprotect 함수로 변경 가능 prot에 지정한 보호모드로 변경 #include <sys/mman.h> int mprotect(void *addr, size_t len, int prot);

경로명을 사용한 파일 크기 확장: truncate(3) 파일의 크기 확장 함수 파일의 크기와 메모리 매핑 존재하지 않거나 크기가 0인 파일은 메모리 매핑할 수 없음 빈 파일 생성시 파일의 크기를 확장한 후 메모리 매핑을 해야함 경로명을 사용한 파일 크기 확장: truncate(3) path에 지정한 파일의 크기를 length로 지정한 크기로 변경 파일 기술자를 사용한 파일 크기 확장: ftruncate(3) 일반 파일과 공유메모리에만 사용가능 이 함수로 디렉토리에 접근하거나 쓰기 권한이 없는 파일에 접근하면 오류 발생 #include <unistd.h> int truncate(const char *path, off_t length); #include <unistd.h> int ftruncate(int fildes, off_t length);

[예제 8-3] ftruncate 함수 사용하기(1) ex8_3.c ... 09 int main(void) { 10 int fd, pagesize, length; 11 caddr_t addr; 12 13 pagesize = sysconf(_SC_PAGESIZE); 14 length = 1 * pagesize; 15 16 if ((fd = open("m.dat", O_RDWR | O_CREAT | O_TRUNC, 0666)) == -1) { 17 perror("open"); 18 exit(1); 19 } 20 21 if (ftruncate(fd, (off_t) length) == -1) { 22 perror("ftruncate"); 23 exit(1); 24 } 25 메모리의 페이지 크기정보 검색 빈 파일의 크기 증가

[예제 8-3] ftruncate 함수 사용하기(2) ex8_3.c 26 addr = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, (off_t)0); 27 if (addr == MAP_FAILED) { 28 perror("mmap"); 29 exit(1); 30 } 31 32 close(fd); 33 34 strcpy(addr, "Ftruncate Test\n"); 35 36 return 0; 37 } 메모리 매핑 매핑한 메모리에 데이터 쓰기 # ls m.dat m.dat: 해당 파일이나 디렉토리가 없음 # ex8_3.out # cat m.dat ftruncate Test

매핑된 메모리 동기화 매핑된 메모리 동기화 매핑된 메모리 동기화: msync(3) 매핑된 메모리의 내용과 백업 내용이 일치하도록 동기화 필요 매핑된 메모리 동기화: msync(3) addr로 시작하는 메모리 영역에서 len 길이만큼의 내용을 백업저장장치에 기록 flags : 함수의 동작 지시 MS_ASYNC : 비동기 쓰기 작업 MS_SYNC : 쓰기 작업을 완료할 때까지 msync 함수는 리턴 안함 MS_INVALIDATE : 메모리에 복사되어 있는 내용을 무효화 #include <sys/mman.h> int msync(void *addr, size_t len, int flags);

[예제 8-4] msync 함수 사용하기(1) ... 08 int main(int argc, char *argv[]) { ex8_4.c ... 08 int main(int argc, char *argv[]) { 09 int fd; 10 caddr_t addr; 11 struct stat statbuf; 12 13 if (argc != 2) { 14 fprintf(stderr, "Usage : %s filename\n", argv[0]); 15 exit(1); 16 } 17 18 if (stat(argv[1], &statbuf) == -1) { 19 perror("stat"); 20 exit(1); 21 } 22 23 if ((fd = open(argv[1], O_RDWR)) == -1) { 24 perror("open"); 25 exit(1); 26 } 파일의 상세 정보 검색

[예제 8-4] msync 함수 사용하기(2) ex8_4.c 28 addr = mmap(NULL, statbuf.st_size, PROT_READ|PROT_WRITE, 29 MAP_SHARED, fd, (off_t)0); 30 if (addr == MAP_FAILED) { 31 perror("mmap"); 32 exit(1); 33 } 34 close(fd); 35 36 printf("%s", addr); 37 38 printf("---------\n"); 39 addr[0] = 'D'; 40 printf("%s", addr); 41 42 msync(addr, statbuf.st_size, MS_SYNC); 43 44 return 0; 45 } 메모리 매핑 매핑된 내용 출력 # cat mmap.dat HANBIT BOOK # ex8_4.out mmap.dat --------- DANBIT 매핑된 내용 수정 수정된 내용 동기화

[예제 8-5] 데이터 교환하기(1) 메모리 매핑을 이용한 데이터 교환 ex8_5.c 메모리 매핑을 이용한 데이터 교환 부모 프로세스와 자식 프로세스가 메모리 매핑을 사용하여 데이터 교환 가능 ... 09 int main(int argc, char *argv[]) { 10 int fd; 11 pid_t pid; 12 caddr_t addr; 13 struct stat statbuf; 14 15 if (argc != 2) { 16 fprintf(stderr, "Usage : %s filename\n", argv[0]); 17 exit(1); } 19 20 if (stat(argv[1], &statbuf) == -1) { 21 perror("stat"); 22 exit(1); 24

[예제 8-5] 데이터 교환하기(2) 25 if ((fd = open(argv[1], O_RDWR)) == -1) { ex8_5.c 25 if ((fd = open(argv[1], O_RDWR)) == -1) { 26 perror("open"); 27 exit(1); } 29 30 addr = mmap(NULL, statbuf.st_size, PROT_READ|PROT_WRITE, 31 MAP_SHARED, fd, (off_t)0); 32 if (addr == MAP_FAILED) { 33 perror("mmap"); 34 exit(1); 35 } 36 close(fd); 37 38 switch (pid = fork()) { 39 case -1 : /* fork failed */ 40 perror("fork"); 41 exit(1); 42 break; 메모리 매핑 fork 함수로 자식 프로세스 생성

[예제 8-5] 데이터 교환하기(3) 43 case 0 : /* child process */ ex8_5.c 43 case 0 : /* child process */ 44 printf("1. Child Process : addr=%s", addr); 45 sleep(1); 46 addr[0] = 'x'; 47 printf("2. Child Process : addr=%s", addr); 48 sleep(2); 49 printf("3. Child Process : addr=%s", addr); 50 break; 51 default : /* parent process */ 52 printf("1. Parent process : addr=%s", addr); 53 sleep(2); 54 printf("2. Parent process : addr=%s", addr); 55 addr[1] = 'y'; 56 printf("3. Parent process : addr=%s", addr); break; 58 } 59 60 return 0; 61 } 자식 프로세스가 매핑된 내용 수정 # cat mmap.dat HANBIT BOOK # ex8_5.out mmap.dat 1. Child Process : addr=HANBIT BOOK 1. Parent process : addr=HANBIT BOOK 2. Child Process : addr=xANBIT BOOK 2. Parent process : addr=xANBIT BOOK 3. Parent process : addr=xyNBIT BOOK 3. Child Process : addr=xyNBIT BOOK xyNBIT BOOK # 부모 프로세스가 매핑된 내용 수정