Download - 제 9 장 디바이스 드라이버
![Page 2: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/2.jpg)
디바이스 드라이버 일반디바이스 드라이버 일반 (1)(1) 정의
디바이스와 시스템 메모리 간에 데이터의 전달을 담당하는 커널 내부 기능이다 .
분류 문자 디바이스 드라이버
순차접근 , 임의접근 가능 터미널 드라이버 블록 디바이스 드라이버
임의접근 , 블록 단위로 데이터를 전송 디스크 드라이버 네트웍 디바이스 드라이버
네트웍에 프레임을 전송하거나 받음 이더넷 드라이버
![Page 3: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/3.jpg)
디바이스 드라이버 일반디바이스 드라이버 일반 (2)(2)
System Call interface
ttydriver
Network
driver
Diskdriver
File System
DDI(device driver interface)
kernel
![Page 4: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/4.jpg)
디바이스 드라이버 일반디바이스 드라이버 일반 (3)(3) 특성
각 디바이스는 고유한 이름을 갖는다 . IDE 방식의 디스크는 hd SCSI 방식의 디스크는 sd 터미널 tty, 이더넷 eth
각 디바이스의 이름에는 major number 와 minor number 가 할당된다 .
include/linux/major.h
![Page 5: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/5.jpg)
디바이스 드라이버 일반디바이스 드라이버 일반 (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 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/6.jpg)
디바이스 드라이버 일반디바이스 드라이버 일반 (5)(5) 새로운 디바이스 드라이버를 Linux 에 추가할 때
필요한 과정 (3 단계 ) 디바이스 드라이버 함수를 구현한다 .
파일시스템과 인터페이스 디바이스와 인터페이스 드라이버 초기화 인터페이스
디바이스 드라이버를 커널에 등록한다 . register_chrdev() – 문자 디바이스 드라이버 등록 register_blkdev() – 블록 디바이스 드라이버 등록 register_netdev() – 네트웍 디바이스 드라이버 등록
디바이스 드라이버를 위한 파일을 생성한다 . mknod /dev/ 장치파일이름 c 251 0
![Page 7: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/7.jpg)
문자 디바이스 드라이버 구조문자 디바이스 드라이버 구조
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 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/8.jpg)
문자 디바이스 드라이버 등록문자 디바이스 드라이버 등록 register_chrdev()
Major number
0
1
2
MAX_CHRDEV-1
Chrdevs[]
/fs/devices.c
Register_chrdev(4,”tty”,&tty_fops)
![Page 9: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/9.jpg)
터미널 디바이스 드라이버 호출터미널 디바이스 드라이버 호출
sys_open()
filp_open()
open_namei()
chrdev_open()
tty_open()
![Page 10: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/10.jpg)
블록 디바이스 드라이버블록 디바이스 드라이버 (1)(1) 하드디스크 드라이버
파일시스템에서 논리적인 블록에 대한 읽기 / 쓰기 요청이 발생했을 때 이 논리적인 블록을 물리적인 주소로 변환 시키는 것이다 . 물리적인 주소에서 실제 데이터를 주 메모리로 ( 버퍼 캐쉬 공간 ) 읽는 것이다 . 또한 디스크에서 사건의 발생을 알렸을 때 ( 입터럽트 발생 ), 그 사건을 처리하는 것 등을 수행해야 한다 .
![Page 11: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/11.jpg)
블록 디바이스 드라이버블록 디바이스 드라이버 (2)(2)
buffer cache
hd_open()
hd_release()
hd_request()
hd_ioctl()
hd_init()
hd_interrupt()
hd_out()
check_status()
[ 파일시스템과 인터페이스를 갖는 함수 ]
[ 하드웨어와 인터페이스를 갖는함수 ]
구조
![Page 12: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/12.jpg)
블록 디바이스 드라이버블록 디바이스 드라이버 (3)(3) 디스크 드라이버 초기화
init process init_module
hd_init()
register_blkdev()
![Page 13: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/13.jpg)
블록 디바이스 드라이버블록 디바이스 드라이버 (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 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/14.jpg)
블록 디바이스 드라이버블록 디바이스 드라이버 (5)(5)
![Page 15: 제 9 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/15.jpg)
블록 디바이스 드라이버블록 디바이스 드라이버 (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 장 디바이스 드라이버](https://reader036.vdocuments.mx/reader036/viewer/2022082318/56812b0f550346895d8f01fb/html5/thumbnails/16.jpg)
네트웍 디바이스 드라이버네트웍 디바이스 드라이버
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() 사용