16
커커 커커커커커 커커 커커커커커 9 9 커 커커커커 커커커커 커 커커커커 커커커커 2005. 5. 9( 커 ) 커 커 커 [email protected]

제 9 장 디바이스 드라이버

Embed Size (px)

DESCRIPTION

제 9 장 디바이스 드라이버. 2005. 5. 9( 월 ) 한 민 규 [email protected]. 디바이스 드라이버 일반 (1). 정의 디바이스와 시스템 메모리 간에 데이터의 전달을 담당하는 커널 내부 기능이다 . 분류 문자 디바이스 드라이버 순차접근 , 임의접근 가능  터미널 드라이버 블록 디바이스 드라이버 임의접근 , 블록 단위로 데이터를 전송  디스크 드라이버 네트웍 디바이스 드라이버 네트웍에 프레임을 전송하거나 받음  이더넷 드라이버. - PowerPoint PPT Presentation

Citation preview

Page 1: 제  9  장 디바이스 드라이버

커널 프로그래밍커널 프로그래밍

제 제 9 9 장 디바이스 장 디바이스 드라이버드라이버

2005. 5. 9( 월 )한 민 규

[email protected]

Page 2: 제  9  장 디바이스 드라이버

디바이스 드라이버 일반디바이스 드라이버 일반 (1)(1) 정의

디바이스와 시스템 메모리 간에 데이터의 전달을 담당하는 커널 내부 기능이다 .

분류 문자 디바이스 드라이버

순차접근 , 임의접근 가능 터미널 드라이버 블록 디바이스 드라이버

임의접근 , 블록 단위로 데이터를 전송 디스크 드라이버 네트웍 디바이스 드라이버

네트웍에 프레임을 전송하거나 받음 이더넷 드라이버

Page 3: 제  9  장 디바이스 드라이버

디바이스 드라이버 일반디바이스 드라이버 일반 (2)(2)

System Call interface

ttydriver

Network

driver

Diskdriver

File System

DDI(device driver interface)

kernel

Page 4: 제  9  장 디바이스 드라이버

디바이스 드라이버 일반디바이스 드라이버 일반 (3)(3) 특성

각 디바이스는 고유한 이름을 갖는다 . IDE 방식의 디스크는 hd SCSI 방식의 디스크는 sd 터미널 tty, 이더넷 eth

각 디바이스의 이름에는 major number 와 minor number 가 할당된다 .

include/linux/major.h

Page 5: 제  9  장 디바이스 드라이버

디바이스 드라이버 일반디바이스 드라이버 일반 (4)(4) 디바이스의 이름과 major/minor number 예

/dev/tty0 4,0

/dev/tty1 4,1

/dev/tty2 4,2

/dev/tty3 4,3System

/dev/hda1 3,1 /dev/hda2 3,2

/dev/hda3 3,3

/dev/hda

/dev/hdb

/dev/hdb1 3,65

/dev/hdb1 3,67

/dev/hdb1 3,65

Page 6: 제  9  장 디바이스 드라이버

디바이스 드라이버 일반디바이스 드라이버 일반 (5)(5) 새로운 디바이스 드라이버를 Linux 에 추가할 때

필요한 과정 (3 단계 ) 디바이스 드라이버 함수를 구현한다 .

파일시스템과 인터페이스 디바이스와 인터페이스 드라이버 초기화 인터페이스

디바이스 드라이버를 커널에 등록한다 . register_chrdev() – 문자 디바이스 드라이버 등록 register_blkdev() – 블록 디바이스 드라이버 등록 register_netdev() – 네트웍 디바이스 드라이버 등록

디바이스 드라이버를 위한 파일을 생성한다 . mknod /dev/ 장치파일이름 c 251 0

Page 7: 제  9  장 디바이스 드라이버

문자 디바이스 드라이버 구조문자 디바이스 드라이버 구조

Application

tty_open()

tty_read()

tty_write()

tty_ioctl()

tty_release()

tty_ init()

tty_struct

rs_interrupt() receive_chars() transmit_chars()

[ 파일시스템과 인터페이스를 갖는 함수 ]

[ 터미널 하드웨어와 인터페이스를 갖는함수 ]

/driver/char/tty_io.c

Page 8: 제  9  장 디바이스 드라이버

문자 디바이스 드라이버 등록문자 디바이스 드라이버 등록 register_chrdev()

Major number

0

1

2

MAX_CHRDEV-1

Chrdevs[]

/fs/devices.c

Register_chrdev(4,”tty”,&tty_fops)

Page 9: 제  9  장 디바이스 드라이버

터미널 디바이스 드라이버 호출터미널 디바이스 드라이버 호출

sys_open()

filp_open()

open_namei()

chrdev_open()

tty_open()

Page 10: 제  9  장 디바이스 드라이버

블록 디바이스 드라이버블록 디바이스 드라이버 (1)(1) 하드디스크 드라이버

파일시스템에서 논리적인 블록에 대한 읽기 / 쓰기 요청이 발생했을 때 이 논리적인 블록을 물리적인 주소로 변환 시키는 것이다 . 물리적인 주소에서 실제 데이터를 주 메모리로 ( 버퍼 캐쉬 공간 ) 읽는 것이다 . 또한 디스크에서 사건의 발생을 알렸을 때 ( 입터럽트 발생 ), 그 사건을 처리하는 것 등을 수행해야 한다 .

Page 11: 제  9  장 디바이스 드라이버

블록 디바이스 드라이버블록 디바이스 드라이버 (2)(2)

buffer cache

hd_open()

hd_release()

hd_request()

hd_ioctl()

hd_init()

hd_interrupt()

hd_out()

check_status()

[ 파일시스템과 인터페이스를 갖는 함수 ]

[ 하드웨어와 인터페이스를 갖는함수 ]

구조

Page 12: 제  9  장 디바이스 드라이버

블록 디바이스 드라이버블록 디바이스 드라이버 (3)(3) 디스크 드라이버 초기화

init process init_module

hd_init()

register_blkdev()

Page 13: 제  9  장 디바이스 드라이버

블록 디바이스 드라이버블록 디바이스 드라이버 (4)(4) 디스크 드라이버 open

register_blkde() 사용 blkdevs 테이블에 등록 tty_read,tty_write hd_request 버퍼캐쉬를 이용 (block_read(), block_write())

sys_open

filp_open

open_namei()

blkdev_open() hd_open()

Page 14: 제  9  장 디바이스 드라이버

블록 디바이스 드라이버블록 디바이스 드라이버 (5)(5)

Page 15: 제  9  장 디바이스 드라이버

블록 디바이스 드라이버블록 디바이스 드라이버 (6)(6)

Buffer cache

bread

request_fn

reqreq req

Block device driver

block_read

block_read

hd_outll_rw_block

make_request

block_read() 캐쉬 버퍼 공간할당 큐에 넣고 , request_fn 함수 호출 hd_request call 버퍼캐쉬를 이용 (block_read(), block_write())

queue

Page 16: 제  9  장 디바이스 드라이버

네트웍 디바이스 드라이버네트웍 디바이스 드라이버

ip_output()

ip_rcv()

el3_open()

el3_start_xmit()

el3_rx()

el3_close()

el3_ioctl()

el3_out()

el3_interrupt()

el3_probe()protocol stack

네트웍 디바이스 드라이버는 통신 프로토콜 스택과 인터페이스를 갖는다 .

파일 연산 자료구조가 없다 커널자료구조 struct device 가 그 역할을 한다 .

register_netdev() 사용