190 likes | 579 Views
제 9 장 디바이스 드라이버. 2005. 5. 9( 월 ) 한 민 규 hufs96mk@hufs.ac.kr. 디바이스 드라이버 일반 (1). 정의 디바이스와 시스템 메모리 간에 데이터의 전달을 담당하는 커널 내부 기능이다 . 분류 문자 디바이스 드라이버 순차접근 , 임의접근 가능 터미널 드라이버 블록 디바이스 드라이버 임의접근 , 블록 단위로 데이터를 전송 디스크 드라이버 네트웍 디바이스 드라이버 네트웍에 프레임을 전송하거나 받음 이더넷 드라이버.
E N D
제 9 장 디바이스 드라이버 2005. 5. 9(월) 한 민 규 hufs96mk@hufs.ac.kr
디바이스 드라이버 일반(1) • 정의 • 디바이스와 시스템 메모리 간에 데이터의 전달을 담당하는 커널 내부 기능이다. • 분류 • 문자 디바이스 드라이버 • 순차접근, 임의접근 가능 터미널 드라이버 • 블록 디바이스 드라이버 • 임의접근, 블록 단위로 데이터를 전송 디스크 드라이버 • 네트웍 디바이스 드라이버 • 네트웍에 프레임을 전송하거나 받음 이더넷 드라이버
디바이스 드라이버 일반(2) System Call interface kernel File System DDI(device driver interface) tty driver Disk driver Network driver
디바이스 드라이버 일반(3) • 특성 • 각 디바이스는 고유한 이름을 갖는다. • IDE 방식의 디스크는 hd • SCSI 방식의 디스크는 sd • 터미널 tty, 이더넷 eth • 각 디바이스의 이름에는 major number와 minor number 가 할당된다. include/linux/major.h
디바이스 드라이버 일반(4) • 디바이스의 이름과 major/minor number 예 /dev/tty0 4,0 /dev/tty1 4,1 /dev/tty2 4,2 /dev/tty3 4,3 /dev/hdb /dev/hdb1 3,67 /dev/hdb1 3,65 /dev/hdb1 3,65 System /dev/hda /dev/hda3 3,3 /dev/hda1 3,1 /dev/hda2 3,2
디바이스 드라이버 일반(5) • 새로운 디바이스 드라이버를 Linux에 추가할 때 필요한 과정 (3단계) • 디바이스 드라이버 함수를 구현한다. • 파일시스템과 인터페이스 • 디바이스와 인터페이스 • 드라이버 초기화 인터페이스 • 디바이스 드라이버를 커널에 등록한다. • register_chrdev() – 문자 디바이스 드라이버 등록 • register_blkdev() – 블록 디바이스 드라이버 등록 • register_netdev() – 네트웍 디바이스 드라이버 등록 • 디바이스 드라이버를 위한 파일을 생성한다. • mknod /dev/장치파일이름 c 251 0
문자 디바이스 드라이버 구조 tty_ init() [파일시스템과 인터페이스를 갖는함수] tty_open() Application tty_read() tty_struct tty_write() tty_ioctl() tty_release() [터미널 하드웨어와 인터페이스를 갖는함수] rs_interrupt() receive_chars() transmit_chars() /driver/char/tty_io.c
문자 디바이스 드라이버 등록 • register_chrdev() Major number Register_chrdev(4,”tty”,&tty_fops) Chrdevs[] 0 /fs/devices.c 1 2 MAX_CHRDEV-1
터미널 디바이스 드라이버 호출 sys_open() filp_open() open_namei() chrdev_open() tty_open()
블록 디바이스 드라이버(1) • 하드디스크 드라이버 • 파일시스템에서 논리적인 블록에 대한 읽기/쓰기 요청이 발생했을 때 이 논리적인 블록을 물리적인 주소로 변환 시키는 것이다. 물리적인 주소에서 실제 데이터를 주 메모리로(버퍼 캐쉬 공간) 읽는 것이다. 또한 디스크에서 사건의 발생을 알렸을 때(입터럽트 발생), 그 사건을 처리하는 것 등을 수행해야 한다.
블록 디바이스 드라이버(2) • 구조 hd_init() [파일시스템과 인터페이스를 갖는함수] hd_interrupt() hd_open() buffer cache hd_release() hd_out() hd_request() check_status() hd_ioctl() [하드웨어와 인터페이스를 갖는함수]
블록 디바이스 드라이버(3) • 디스크 드라이버 초기화 init process init_module hd_init() register_blkdev()
블록 디바이스 드라이버(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()
블록 디바이스 드라이버(6) bread block_read request_fn block_read Buffer cache Block device driver ll_rw_block make_request hd_out queue req req req • block_read() • 캐쉬 버퍼 공간할당 • 큐에 넣고, request_fn함수 호출 • hd_request call • 버퍼캐쉬를 이용(block_read(), block_write())
네트웍 디바이스 드라이버 el3_probe() protocol stack ip_output() el3_open() ip_rcv() el3_start_xmit() el3_out() el3_rx() el3_interrupt() el3_close() el3_ioctl() • 네트웍 디바이스 드라이버는 통신 프로토콜 스택과 인터페이스를 갖는다. • 파일 연산 자료구조가 없다 • 커널자료구조 struct device가 그 역할을 한다. • register_netdev() 사용