5장. Enhanced Char Driver Operations 과제

Slides:



Advertisements
Similar presentations
Term Project Hints Topics Keep-alive CGI Multi-thread Multi-process Event-based.
Advertisements

- 1 - 정보 보안 개론과 실습 시스템 해킹과 보안 팀원 : 박진영 한동섭 · 권혁진.
1.
제10장 디바이스 드라이버.
KEY 디바이스 드라이버 Lecture #12. 2 차례 GPIO 및 Control Registers KEY 하드웨어 구성 KEY Driver 프로그램 key-driver.c 시험 응용 프로그램 key-app.c.
Project #2-2. Pintos User Program
TextLCD 디바이스.
Chapter 5. Enhanced Char Driver Operations
Chapter 9. Interrupt Handling
6 레이스 컨디션.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
FND 디바이스 드라이버 Lecture #11.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
Linux System Programming
Department of Computer Engineering
Signal & Inter-Process Communication
08. 디바이스 드라이버의 읽기와 쓰기 김진홍
디바이스 드라이버 (Device Driver)
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버 응용 디바이스와 주소 디바이스 드라이버 구현 일반 LED 디바이스 드라이버 FND 디바이스 드라이버
디바이스 드라이버.
이식성과 데이터형 서로 다른 프로세서 상에서의 이식성을 위해 가급적 리눅스 커널이 제공하는 데이터형을 사용하는 것이 좋다.
디바이스 드라이버 개요 가상 디바이스드라이버 실습
Linux System Programming
Department of Computer Engineering
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
Network Lab. Seoung Hyeon, Lee
6 프로세스 생성과 실행.
Linux System Programming
Unix Project2 <test character device 생성>
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
제 12장 I/O멀티플렉싱(Multiplexing)
FND (Flexible Numeric Display)
Department of Computer Engineering
Department of Computer Engineering
Step Motor Device Driver
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
멀티쓰레드 기반의 서버구현 School of Electronics and Information.
07. 디바이스 드라이버의 초기화와 종료 김진홍
21장. 문자와 문자열 처리 함수.
9장 파일 입출력.
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
Term Project Team Member
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
Advanced Socket Programming
(ioctl, mmap, fsync&flush)
4장 파일.
6장 파일 및 레코드 잠금.
커널 모듈 프로그래밍 (Kernel Module Programming)
Department of Computer Engineering
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
FILE I/O 번째주 Dept. of Computer Science & Engineering
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
adopted from KNK C Programming : A Modern Approach
문자 디바이스 드라이버 임베디드 시스템.
Signal & Inter-Process Communication
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
Device Driver 임베디드 시스템 I.
리눅스 디바이스 드라이버 (Linux Device Driver)
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
Department of Computer Engineering
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
argc, argv 의 사용방법 #include <stdio.h>
06. 디바이스의 등록과 해제 김진홍
Signal & Inter-Process Communication
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
3장 파일 다루기 한빛미디어(주).
Presentation transcript:

5장. Enhanced Char Driver Operations 과제 20047044 김희자 heeja89@sch.ac.kr http://cs.sch.ac.kr/~heeja

목차 하드웨어 제어 iotcl 예제 블로킹 sleepy 예제 비블로킹 nbtest 예제 순천향대학교 정보기술공학부 김 희 자

하드웨어 제어 ioctl 예제 순천향대학교 정보기술공학부 김 희 자

scull ioctl 실행 [root@UPnP1 scull]# make [root@UPnP1 scull]# sh scull_load [root@UPnP1 scull]# cc myioctl.c -o myioctl [root@UPnP1 scull]# ./myioctl quantum: 4000 순천향대학교 정보기술공학부 김 희 자

소스 분석 : scull.h #define SCULL_IOC_MAGIC 'k' #define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0) #define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, scull_quantum) #define SCULL_IOCSQSET _IOW(SCULL_IOC_MAGIC, 2, scull_qset) #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3) #define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4) #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, scull_quantum) #define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, scull_qset) #define SCULL_IOCQQUANTUM _IO(SCULL_IOC_MAGIC, 7) #define SCULL_IOCQQSET _IO(SCULL_IOC_MAGIC, 8) #define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, scull_quantum) #define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, scull_qset) #define SCULL_IOCHQUANTUM _IO(SCULL_IOC_MAGIC, 11) #define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12) 순천향대학교 정보기술공학부 김 희 자

소스 코드 분석 : scull_ioctl() 1/5 int scull_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { int err = 0, tmp; int ret = 0; if (_IOC_TYPE(cmd) != SCULL_IOC_MAGIC) return -ENOTTY; if (_IOC_NR(cmd) > SCULL_IOC_MAXNR) return -ENOTTY; if (_IOC_DIR(cmd) & _IOC_READ) err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) & _IOC_WRITE) err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); if (err) return -EFAULT; 순천향대학교 정보기술공학부 김 희 자

소스 코드 분석 : scull_ioctl() 2/5 switch(cmd) { case SCULL_IOCRESET: scull_quantum = SCULL_QUANTUM; scull_qset = SCULL_QSET; break; case SCULL_IOCSQUANTUM: /* Set: arg points to the value */ if (! capable (CAP_SYS_ADMIN)) return -EPERM; ret = __get_user(scull_quantum, (int *)arg); case SCULL_IOCTQUANTUM: /* Tell: arg is the value */ scull_quantum = arg; case SCULL_IOCGQUANTUM: /* Get: arg is pointer to result */ ret = __put_user(scull_quantum, (int *)arg); 순천향대학교 정보기술공학부 김 희 자

소스 코드 분석 : scull_ioctl() 3/5 case SCULL_IOCQQUANTUM: /* Query: return it (it's positive) */ return scull_quantum; case SCULL_IOCXQUANTUM: /* eXchange: use arg as pointer */ if (! capable (CAP_SYS_ADMIN)) return -EPERM; tmp = scull_quantum; ret = __get_user(scull_quantum, (int *)arg); if (ret == 0) ret = __put_user(tmp, (int *)arg); break; case SCULL_IOCHQUANTUM: /* sHift: like Tell + Query */ scull_quantum = arg; return tmp; 순천향대학교 정보기술공학부 김 희 자

소스 코드 분석 : scull_ioctl() 4/5 case SCULL_IOCSQSET: if (! capable (CAP_SYS_ADMIN)) return -EPERM; ret = __get_user(scull_qset, (int *)arg); break; case SCULL_IOCTQSET: scull_qset = arg; case SCULL_IOCGQSET: ret = __put_user(scull_qset, (int *)arg); case SCULL_IOCQQSET: return scull_qset; 순천향대학교 정보기술공학부 김 희 자

소스 코드 분석 : scull_ioctl() 5/5 case SCULL_IOCXQSET: if (! capable (CAP_SYS_ADMIN)) return -EPERM; tmp = scull_qset; ret = __get_user(scull_qset, (int *)arg); if (ret == 0) ret = put_user(tmp, (int *)arg); break; case SCULL_IOCHQSET: scull_qset = arg; return tmp; 순천향대학교 정보기술공학부 김 희 자

scull ioctl 예제 변경 및 실행 1/2 #include <stdio.h> #include <fcntl.h> #include "/usr/src/linux/include/asm/ioctl.h" #define SCULL_IOC_MAGIC 'k' #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3) #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, quantum) int main(int argc, char *argv[]) { int fd, n; int quantum = 0, read_quantum = 0; if(argc > 1) quantum = atoi(argv[1]); fd = open("/dev/scull1", O_RDWR, 0); 순천향대학교 정보기술공학부 김 희 자

scull ioctl 예제 변경 및 실행 2/2 // 커널의 퀀텀 크기 변경하기 if(!ioctl(fd, SCULL_IOCTQUANTUM, quantum)) printf("write quantum : %d\n", quantum); else printf("write quantum error\n"); // 커널의 퀀텀 크기 읽어오기 (변경 확인) if(!ioctl(fd, SCULL_IOCGQUANTUM, &read_quantum)) printf("read quantum: %d\n", read_quantum); printf("!! Something must be wrong\n"); return 0; } // 실행 결과 [root@UPnP1 scull]# ./myioctl 2000 write quantum : 2000 read quantum: 2000 순천향대학교 정보기술공학부 김 희 자

블로킹 sleepy 예제 순천향대학교 정보기술공학부 김 희 자

sleepy 실행 1/2 // 컴파일 [root@UPnP1 misc-modules]# gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -O2 -I.. -c -o sleepy.o sleepy.c // 모듈 적재 [root@UPnP1 misc-modules]# /sbin/insmod sleepy.o // 모듈 적재 확인 [root@UPnP1 misc-modules]# more /proc/modules sleepy 1576 0 (unused) scull 10512 0 …… // 디바이스 드라이버 파일 주번호 확인 [root@UPnP1 misc-modules]# more /proc/devices Character devices: 1 mem 2 pty ... 253 sleepy 254 scull … 순천향대학교 정보기술공학부 김 희 자

sleepy 실행 2/2 // 디바이스 노드 만들기 [root@UPnP1 misc-modules]# mknod /dev/sleepy c 253 0 [root@UPnP1 misc-modules]# ls -l /dev/sleepy crw-r--r-- 1 root root 253, 0 4월 12 20:24 /dev/sleepy // sleepy_read 실행 [root@UPnP1 misc-modules]# cat /dev/sleepy > test.out & [1] 21917 // sleepy_write 실행 [root@UPnP1 misc-modules]# ls > /dev/sleepy [1]+ Done cat /dev/sleepy >test.out [root@UPnP1 misc-modules]# tail /var/log/messages Apr 12 23:01:26 UPnP1 kernel: sleepy_read Apr 12 23:01:34 UPnP1 kernel: write Apr 12 23:01:34 UPnP1 kernel: sleep awoken // ctrl+c를 누를 때 인터럽트에 의해 종료되는 경우  수면 상태에서 바로 빠져 나옴 [root@UPnP1 misc-modules]# cat /dev/sleepy > test.out [root@UPnP1 misc-modules]# 순천향대학교 정보기술공학부 김 희 자

소스 코드 분석 : sleepy_init() int sleepy_major=0; struct file_operations sleepy_fops = { read: sleepy_read, write: sleepy_write, }; // sleepy.o 모듈 적재시 실행 int sleepy_init(void) { int result; SET_MODULE_OWNER(&sleepy_fops); /* * Register your major, and accept a dynamic number */ result = register_chrdev(sleepy_major, "sleepy", &sleepy_fops); if (result < 0) return result; if (sleepy_major == 0) sleepy_major = result; /* dynamic */ return 0; } 순천향대학교 정보기술공학부 김 희 자

소스 코드 분석 : read(), write() DECLARE_WAIT_QUEUE_HEAD(wq); // 대기 큐가 정적으로 선언된 경우 초기화 // /dev/sleepy 노드에 데이터를 읽는 경우 실행 ssize_t sleepy_read (struct file *filp, char *buf, size_t count, loff_t *pos) { printk(KERN_DEBUG "process %i (%s) going to sleep\n", current->pid, current->comm); interruptible_sleep_on(&wq); printk(KERN_DEBUG "awoken %i (%s)\n", current->pid, current->comm); return 0; /* EOF */ } // /dev/sleepy 노드에 데이터를 쓰는 경우 실행 ssize_t sleepy_write (struct file *filp, const char *buf, size_t count, loff_t *pos) printk(KERN_DEBUG "process %i (%s) awakening the readers...\n", wake_up_interruptible(&wq); return count; /* succeed, to avoid retrial */ 순천향대학교 정보기술공학부 김 희 자

비블록킹 nbtest 예제 순천향대학교 정보기술공학부 김 희 자

nbtest 실행 [root@UPnP1 misc-progs]# cc nbtest.c -o nbtest [root@UPnP1 misc-progs]# ./nbtest 3 test 순천향대학교 정보기술공학부 김 희 자

nbtest 소스 분석 char buffer[4096]; int main(int argc, char **argv) { int delay=1, n, m=0; if (argc>1) delay=atoi(argv[1]); fcntl(0, F_SETFL, fcntl(0,F_GETFL) | O_NONBLOCK); /* stdin */ fcntl(1, F_SETFL, fcntl(1,F_GETFL) | O_NONBLOCK); /* stdout */ while (1) { n=read(0, buffer, 4096); if (n>=0) m=write(1, buffer, n); if ((n<0 || m<0) && (errno != EAGAIN)) break; sleep(delay); } perror( n<0 ? "stdin" : "stdout"); exit(1); 순천향대학교 정보기술공학부 김 희 자