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