공유메모리 int shmget(key_t key, size_t size, int permflags);

Slides:



Advertisements
Similar presentations
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
Advertisements

Chapter 7. Getting Hold of Memory
패러럴 포트를 이용한 Text LCD 제어 6월 17일 허정수 나선웅.
TextLCD 디바이스.
제14장 동적 메모리.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
커널 컴파일 및 개발 환경 구축 IT EXPERT 리눅스 커널 프로그래밍 Author : Byungki Kim
08. 디바이스 드라이버의 읽기와 쓰기 김진홍
디바이스 드라이버.
이식성과 데이터형 서로 다른 프로세서 상에서의 이식성을 위해 가급적 리눅스 커널이 제공하는 데이터형을 사용하는 것이 좋다.
디바이스 드라이버 개요 가상 디바이스드라이버 실습
Module Programming Linux Kernel 수업 4번째.
Windows Server 장. 사고를 대비한 데이터 백업.
Unix Project2 <test character device 생성>
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
FND (Flexible Numeric Display)
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
제 3장. C보다 나은 C++ II.
리눅스 커널과 디바이스드라이버.
07. 디바이스 드라이버의 초기화와 종료 김진홍
Root Filesystem Porting
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
파이프와 exec 시스템 호출 (ls | wc)
Root Filesystem Porting
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
WinCE Device Driver 실습 #3
WinCE Device Driver 실습 #2
커널 모듈 프로그래밍 (Kernel Module Programming)
Lecture 4 Debugging Technique & LKM
Cross Compiler 설치.
DK-128 실습 EEPROM 제어 아이티즌 기술연구소
HBE-SMIII-SV210 리눅스 커널과 디바이스 드라이버
ATmega128 FND 실습 휴먼네트웍스 기술연구소
MicroC/OS-II 3. Memory Management ITISN Technical Lab.
모듈 초기화 module_init(hello_init); module_exit(hello_exit);
망고100 보드로 놀아보자 -13 리눅스 디바이스 드라이버 개요
Cross Compiler를이용한 커널 컴파일 및 포팅
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
문자 디바이스 드라이버 임베디드 시스템.
리눅스 시스템 & 커널 기초 P.46 – P.53 이름: nsh009 학번: 112 1/20.
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
Device Driver 임베디드 시스템 I.
메모리 관리 & 동적 할당.
영상처리 실습 인공지능연구실.
뇌를 자극하는 Windows Server 2012 R2
Analog to Digital Converter
DK-128 FND 실습 아이티즌 기술연구소
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
School of Electronics and Information. Kyung Hee University.
패러럴 포트를 이용한 Text LCD 제어 6월 17일 허정수 나선웅.
Stepper Motor 디바이스 드라이버
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
Kernel, Ramdisk, JFFS2 Porting
( Windows Service Application Debugging )
DK-128 개발환경 설정 아이티즌 기술연구소
3. 모듈 (5장. 모듈).
구조체(struct)와 공용체(union)
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
과제 4: Thread (5월 9일까지) 4장 연습문제 풀이
06. 디바이스의 등록과 해제 김진홍
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
08. 블록 디바이스 드라이버 김진홍
22. 블록 디바이스 드라이버 김진홍
Presentation transcript:

공유메모리 int shmget(key_t key, size_t size, int permflags); - size : 공유할 메모리 영역의 필요한 최소 크기를 바이트 단위로 표시 - IPC_CREAT | IPC_EXCL int *shmat(int shmid, const void *daddr, int shmflags); daddr * NULL : 시스템의 의해 결정 shmflags SHM_RDONLY, SHM_RND

공유메모리 int shmctl (int shmid, int command, struct shmid_ds *shmstat); -command : IPC_STAT, IPC_SET, IPC_RMID (예제) – test1.c (p288)

공유메모리 (실습) shmcpy를 수정 - 3개의 자식 프로세스를 생성하여 자식 0는 0~63, 1은 64~127, 2는 128~191을 공유메모리에 넣는 프로그램을 작성. 공유 메모리에 넣을 때 P, V를 실행시킨다. (실습) 위 프로그램을 message queue로 수정함 - 자식 0가 0~63을 부모에게 보내면 부모를 이를 화면으로 출력 - 자식 1이 64~127을 부모에게 보내서 부모가 이를 화면으로 출력 - 자식 2가 128~191을 부모에게 보내서 부모가 이를 화면으로 출력

커널 컴파일 버전 커널 컴파일 과정 커널 2.4 Loadable module support ----- > [*] Enable loadable module support [*] Set version information on all module symbols [*] Kernel module loader 커널 2.6 [*] module unloading [*] Forced module unloading [*] Module versioning support (EXPERIMENTAL) [*] Automatic kernel module loading

디바이스 파일(1)

디바이스 파일(2) mknod 명령 디바이스 파일 생성 mknod [디바이스 파일명] [파일 형] [주 번호] [부 번호] mknod /dev/devfile c 240 1 디바이스 드라이버 탐색 실질적인 디바이스 탐색

모듈 유틸리티 insmod rmmod lsmod 모듈을 커널에 적재한다. 커널에 등록된 모듈을 제거한다. 커널에 등록된 모듈의 상태를 보여준다.

모듈 소스 형식(1) 헤더 파일 선언 모듈 초기화 함수, 제거 함수 커널 2.6 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> 커널 2.6 module_init(hello_init); module_exit(hello_exit);

모듈 컴파일용 Makefile obj-m := test.o // 모듈로 생성할 이름 지정 KDIR := /lib/modules/$(shell uname -r)/build // 커널의 소스 위치 지정 PWD := $(shell pwd) // 컴파일 대상의 모듈 소스의 위치 default: // 모듈을 컴파일하는 명령 지정 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: // 컴파일 결과로 생성된 파일을 모 rm -rf *.ko // 두 지운다. rm -rf *.mod.* rm -rf .*.cmd rm -rf *.o

모듈 프로그램 맛보기(1) test.c #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int hello_init(void) { printk("Hello, world \n"); return 0; } static void hello_exit(void) printk("Goodbye, world\n"); module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("Dual BSD/GPL");

모듈 프로그램 맛보기(2) Makefile obj-m := test.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: rm -rf *.ko rm -rf *.mod.* rm -rf .*.cmd rm -rf *.o

모듈 프로그램 맛보기(3)

모듈 프로그램 맛보기(4)

모듈 프로그램 맛보기(5)

이식성과 데이터형 서로 다른 프로세서 상에서의 이식성을 위해 가급적 리눅스 커널이 제공하는 데이터형을 사용하는 것이 좋다. #include <asm/types.h>에 정의. 주로 사용되는 데이터형 App Kernel __s8 s8 부호있는 8비트 정수형 __u8 u8 부호없는 __s16 s16 16비트 정수형 __u16 u16 __s32 s32 32비트 정수형 __u32 u32 __s64 s64 64비트 정수형 __u64 u64

동적 메모리 할당 함수 할당 속도가 빠르고 사용법이 간단해 kmalloc() 디바이스 드라이버에서 가장 많이 kfree() 사용되는 함수(할당 크기 제한 있음). vmalloc() vfree() 가상공간이 허용하는 한 크기 제한 없이 할당 받을 수 있다. 큰 메모리 공간을 할당할 때 주로 사용한다(속도가 느리다). __get_free_pages() __free_pages() 잘 사용되지 않는 함수.

kmalloc(), kfree()-1 메모리주소 kmalloc(할당 받을 크기, 옵션); kfree(메모리주소); * 할당 가능한 최대 크기는 32 x PAGE_SIZE (일반적으로 128KB) #include <linux/slab.h> char *buf; buf = kmalloc(1024, GFP_KERNEL); if (buf != NULL) { … kfree(buf); }

kmalloc(), kfree()-2 메모리 할당 시 사용되는 옵션 (할당된 메모리에 특성을 주거나 할당 시점에 처리방식을 지정) GFP_KERNEL 동적 메모리 할당이 항상 성공하도록 요구한다. 메모리 부족 시 메모리가 사용 가능해 질 때까지 잠든다. 이런 특성으로 인해서 인터럽트에서는 사용하면 안 된다. GFP_ATOMIC 커널에 할당 가능한 메모리가 있으면 무조건 할당하고, 없으면 즉시 NULL을 반환한다. 프로세스가 잠드는 문제는 없지만 메모리 할당에 실패할 경우를 항상 염두 해 두어야 한다. GFP_DMA 연속된 물리 메모리를 할당 받을 때 사용한다. (DMA를 사용할 때 사용해야 한다.)

vmalloc(), vfree() 메모리주소 vmalloc(할당 받을 크기); vfree(메모리주소); #include <linux/vmalloc.h> char *buf; buf = vmalloc(1024); if (buf != NULL) { … vfree(buf); }

vmalloc(), vfree() 특징 가상 주소 공간에서 할당받기 때문에 해당주소의 영역이 하드디스크에 있을 수도 있어 실패할 수 있다. 커다란 연속된 공간을 할당하기 위해 가상메모리 관리 루틴이 수행되기 때문에 kmalloc() 보다 속도가 매우 느리다. 할당 시 프로세스가 잠들지 못하게 할 수 없기 때문에 인터럽트 서비스 함수 안에서는 사용할 수 없다.

__get_free_pages(), free_pages() #include <linux/mm.h> //2.4 #include <linux/gfp.h> //2.6 #include <asm/page.h> //get_order char *buf; buf = __get_free_pages(GFP_KERNEL, order); /* order=0이면 1개의 page, order=3이면 3개의 page /* MAX_ORDER은 11, 그러나 5이하의 값만 사용하는 것이 안전 (32*PAGE_SIZE) */ if (buf != NULL) { … free_pages(buf, order); }