제 9 장 디바이스 드라이버

Preview:

DESCRIPTION

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

Citation preview

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

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

2005. 5. 9( 월 )한 민 규

hufs96mk@hufs.ac.kr

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

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

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

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

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

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

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

System Call interface

ttydriver

Network

driver

Diskdriver

File System

DDI(device driver interface)

kernel

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

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

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

include/linux/major.h

디바이스 드라이버 일반디바이스 드라이버 일반 (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

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

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

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

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

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

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

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

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

Major number

0

1

2

MAX_CHRDEV-1

Chrdevs[]

/fs/devices.c

Register_chrdev(4,”tty”,&tty_fops)

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

sys_open()

filp_open()

open_namei()

chrdev_open()

tty_open()

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

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

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

buffer cache

hd_open()

hd_release()

hd_request()

hd_ioctl()

hd_init()

hd_interrupt()

hd_out()

check_status()

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

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

구조

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

init process init_module

hd_init()

register_blkdev()

블록 디바이스 드라이버블록 디바이스 드라이버 (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()

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

블록 디바이스 드라이버블록 디바이스 드라이버 (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

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

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() 사용

Recommended