Adding a New Dev file

Similar documents
untitled

슬라이드 1

PowerPoint 프레젠테이션

망고100 보드로 놀아보자 -13

Chapter #01 Subject

슬라이드 1

PowerPoint 프레젠테이션

KEY 디바이스 드라이버

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

K&R2 Reference Manual 번역본

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

교육지원 IT시스템 선진화

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Embeddedsystem(8).PDF

Microsoft PowerPoint - lab14.pptx

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

°ø°³¼ÒÇÁÆ®-8È£

10.

untitled

디바이스드라이버 (Device Driver) Driver is literally a subject which drive a object. 응용프로그램에서하드웨어장치를이용해서데이터를직접읽고쓰거나제어해야하는경우에디바이스드라이버를이용 하드웨어를제어하는프로그램과애플리케이션에서

교육지원 IT시스템 선진화

PowerPoint 프레젠테이션

지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR

Microsoft PowerPoint - ch09_파이프 [호환 모드]

2009년 상반기 사업계획

PowerPoint 프레젠테이션

(Microsoft PowerPoint - Device Driver [\310\243\310\257 \270\360\265\345])

<4D F736F F F696E74202D205BBAB0C3B75D20B8AEB4AABDBA20B5F0B9D9C0CCBDBA20B5E5B6F3C0CCB9F620B8F0B5A82E >

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

06Àå

Microsoft Word doc

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

휠세미나3 ver0.4

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Mango-AM335x LCD Type 커널 Module Parameter에서 변경하기

슬라이드 제목 없음

Microsoft PowerPoint - chap10-함수의활용.pptx

(Microsoft PowerPoint - Device Driver [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint APUE(Intro).ppt

Microsoft PowerPoint - 10-EmbedSW-11-모듈

The Pocket Guide to TCP/IP Sockets: C Version

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

컴파일러

chap10.PDF

PowerPoint 프레젠테이션

Chap 6 모듈프로그래밍및 디바이스드라이버구현

슬라이드 1

02장.배열과 클래스

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

11장 포인터

Microsoft Word - MPC850 SPI Driver.doc

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint Presentation

Microsoft PowerPoint - lab15.pptx

MPLAB C18 C

vi 사용법

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

untitled

본 강의에 들어가기 전

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

윤성우의 열혈 TCP/IP 소켓 프로그래밍

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Solaris Express Developer Edition

PCServerMgmt7

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - chap12-고급기능.pptx

BMP 파일 처리

슬라이드 1

K7VT2_QIG_v3

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

No Slide Title

chap7.key

untitled

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Chapter 4. LISTS

C++-¿Ïº®Çؼ³10Àå

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

2주차: 입출력 제어 복습

The Pocket Guide to TCP/IP Sockets: C Version

Adobe Flash 취약점 분석 (CVE )

2009년 상반기 사업계획

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

untitled

슬라이드 1

임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - chap11-포인터의활용.pptx

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

C# Programming Guide - Types

Microsoft PowerPoint - 02_Linux_Fedora_Core_8_Vmware_Installation [호환 모드]

Transcription:

Adding a New Dev file - 김성영, 이재혁, 김남현 - 발표자 : 김남현

목차 01 Progress 02 Device file 03 How create dev file 04 Example

Progress 4 월 1 일 프로젝트방향설정 4 월 8 일 device file 추가방법조사 mem.c 파일분석 4 월 10 일 알고리즘제시필요한함수분석 4 월 16 일 발표자료조사및만들기

진행중어려운점 Google 예제의부족 디바이스드라이버를 built-in 형태로구현 Linux 버전에따른코드의수정 2.x 버젼의 nopage 가없어지고 3.x 버젼의 fault 로통합 Unmap 의방법

해야하는일 Fault handling PTE에서 physical page에접근하는것을막는방법 Fault가일어나는이유를구분

Device File System

디바이스드라이버 시스템이지원하는하드웨어를응용프로그램에서사용할수있도록커널에서제공하는라이브러리 하드웨어는디바이스드라이버를통해접근 응용프로그램이하드웨어를제어하려면커널에자원을요청하고, 커널은이런요청에따라시스템을관리

디바이스드라이버

디바이스파일 유닉스의철학 : Everything is a file 리눅스는시스템에있는모든자원을파일형식으로표현 램, 키보드, 보조기억장치인하드디스크도파일로표현 일반파일의목적이데이터를저장하는데있다면이들은하드웨어정보를제공하는데목적이있다. /dev/ 디렉터리에존재하며, 이파일하나하나는실질적인하드웨어를표현

디바이스드라이버의종류 문자디바이스드라이버 임의의길이를갖는문자열이나자료의순차성을지닌장치를다루는디바이스드라이버 버퍼캐쉬를사용하지않는다. Ex) Serial, Console, Keyboard, Printer, Mouse. 블록디바이스드라이버 일정크기의버퍼를통해데이터를처리하는디바이스드라이버 Ex) Hard disk, RAM. 네트워크디바이스드라이버 네트워크계층과연결되어네트워크통신을통해패킷을송수신할수있는기능을제공한다. Ex) 이더넷, PPP.

디바이스파일 주번호와부번호 주번호 커널에서디바이스드라이버를구분하고연결하는데사용 주번호는제어하려는디바이스를구분하기위한디바이스의 ID 부번호 디바이스드라이버내에서장치를구분하기위해사용 같은종류의디바이스가여러개있을때그중하나를선택하기위해사용

디바이스파일 주번호와부번호 시리얼디바이스파일을살펴보면아래와같다. root@ubunt:~$ ls al /dev/ttys* crw-rw---- 1 root dialout 4, 64 Apr 17 02:31 /dev/ttys0 crw-rw---- 1 root dialout 4, 65 Apr 17 02:31 /dev/ttys1 crw-rw---- 1 root dialout 4, 74 Apr 17 02:31 /dev/ttys10 crw-rw---- 1 root dialout 4, 75 Apr 17 02:31 /dev/ttys11 crw-rw---- 1 root dialout 4, 76 Apr 17 02:31 /dev/ttys12. 시리얼 COM1 포트를나타내는 /dev/ttys0 와 COM2 포트를나타내는 /dev/ttys1 의주번호는 4 로같다. 즉시리얼포트라고하는같은종류의디바이스파일이다. 하지만이들을각각을구분해부번호는다르다.

Create Dev File

디바이스파일생성 mknod ( 쉘에서 ) 디바이스파일은일반파일과달리 create() 함수를사용하지않고, mknod 유틸리티에의해서생성 디바이스파일은주로 /dev/ 디렉터리에생성 mknod 를이용하여디바이스파일을만드는방법은아래와같다 root@ubuntu:# mknod /dev/ttys4 c 4 68 디바이스파일명은 ttys4 이고, 문자디바이스드라이버이고, 주번호가 4, 부번호가 68 인디바이스파일을생성한다.

디바이스파일생성 mknod ( 소스코드에서 ) 응용프로그램에서디바이스파일을만들어야할경우 int mknod(const char *pathnmae, mode_t mode, dev_t dev) Const char *pathname 작성할디바이스파일명 mode_t mode 접근허가및디바이스타입 (OR 연산으로설정 ) dev_t dev 디바이스주번호및부번호 ( 시프트연산으로같이입력 )

디바이스등록 register_chrdev 커널내부에등록된 device driver 를관리하는 chrdev[] 배열구조체에하나의배열을할당받는다. 배열안의필드에파일의이름과파일오퍼레이션을연결한다. int register_chrdev(unsigned int major, const char *name, struct file_operations *fops) unsigned int major 할당하고자하는주번호 const char *name 디바이스파일의이름 strtuct file_oprations *fops 드라이버의엔트리포인트를실행하는데사용되는함수구조체포인터

2 가지형태의구현방법 External Module 사용자에의해 modprobe 혹은 insmod 의명령어로동적으로모듈에적재된다. Built-in 부팅되는과정에서커널에적재된다.

/kernel/include/linux/init.h

External Module 방식 /* Each module must use one module_init(). */ #define module_init(initfn) \ static inline initcall_t inittest(void) \ { return initfn; } \ int init_module(void) attribute ((alias(#initfn))); /* This is only required if you want to be unloadable. */ #define module_exit(exitfn) \ static inline exitcall_t exittest(void) \ { return exitfn; } \ void cleanup_module(void) attribute ((alias(#exitfn)));

Built-in 방식 #define device_initcall(fn) define_initcall(fn,6)... #define initcall(fn) device_initcall(fn)... /** * module_init() - driver initialization entry point * @x: function to be run at kernel boot time or module insertion * * module_init() will either be called during do_initcalls() (if * builtin) or at module insertion time (if a module). There can only * be one per module. */ #define module_init(x) initcall(x);

#define define_initcall(level,fn,id) \ static initcall_t initcall_##fn##id used \ attribute (( section (".initcall" level ".init"))) = fn... #define device_initcall(fn) define_initcall(fn,6)

start_kernel(void) rest_init(void) kernel_init(void* unused) do_basic_setup(void) do_initcalls(void)

do_initcalls(void) extern initcall_t initcall_start[], initcall_end[], early_initcall_end[]; static void init do_initcalls(void) { initcall_t *call; for (call = early_initcall_end; call < initcall_end; call++) do_one_initcall(*call); /* Make sure there is no pending stuff from the initcall sequence */ flush_scheduled_work(); }

do_one_initcalls(initcall_f fn) int do_one_initcall(initcall_t fn) { int count = preempt_count(); ktime_t t0, t1, delta; char msgbuf[64]; int result; if (initcall_debug) { printk("calling %pf\n", fn); t0 = ktime_get(); } result = fn(); }...

Built-in Device Driver 소스코드작성 Kconfig 수정 Make file 수정 make menuconfig 수정

예제 /drivers/char my_driver.c 파일생성 static int my_dev_init(void) { int res; printk("initializer has been called\n"); res = register_chrdev(my_dev_major,my_dev_name,&mem_fops); if(res<0) return res; } return 0; module_init (my_dev_init);

/driver/char Kconfig 수정 menu "Character devices source "drivers/tty/kconfig config MYDEVDRIVER bool "my_dev_driver" default y... y 는선택되었다는것을의미한다. Make menuconfig 입력시, 메뉴화면은 Kconfig의내용을파싱한것임.

/driver/char Makefile 수정 obj-$(config_mydevdriver) obj-y obj-$(config_tty_printk) += my_driver.o += mem.o random.o += ttyprintk.o...

Make menuconfig Device Drivers -> Character devices

결과

Example

Google Example Code #include <linux/init.h> static char ker_buf[100]; //driver local buffer static int dev_open(struct inode *inod, struct file *fil); static ssize_t dev_read(struct file *filep,char *buf,size_t len,loff_t *off); static ssize_t dev_write(struct file *flip,const char *buff,size_t len,loff_t *off); static int dev_release(struct inode *inod,struct file *fil); //structure containing device operation static struct file_operations fops= {.read=dev_read,.write=dev_write,.open=dev_open,.release=dev_release, };

Google Example Code static int dev_open(struct inode *inod, struct file *fil) { printk("kern_alert device opened"); return 0; } static ssize_t dev_read(struct file *filep,char *buf,size_t len,loff_t *off) { copy_to_user(buf,ker_buf,len); return len; } static ssize_t dev_write(struct file *flip,const char *buf,size_t len,loff_t *off) { copy_from_user(ker_buf,buf,len); ker_buf[len]=0; return len; }

Google Example Code static int dev_release(struct inode *inod,struct file *fil) { printk("kern_alert device closed\n"); return 0; } static int hello_init(void) { int t=register_chrdev(90,"mydev",&fops); if(t<0) printk(kern_alert "device registration failed."); else printk(kern_alert "device registred\n"); return 0; } static void hello_exit(void) { unregister_chrdev(90,"mydev"); printk(kern_alert "exit"); } module_init(hello_init); module_exit(hello_exit);

감사합니다 - 김성영, 이재혁, 김남현