모듈 프로그래밍
&
디바이스 드라이버
2013.04.23
고급데이터베이스시스템
이윤수
목차
• 리눅스 모듈
• 모듈 프로그래밍
• 모듈 프로그래밍 예제
• 디바이스 드라이버
• 사용자 입장에서 디바이스 드라이버
• 개발자 입장에서 디바이스 드라이버
• 문자 디바이스 드라이버
• 블록 디바이스 드라이버
• 네트워크 디바이스 드라이버
리눅스 모듈
• 커널이 만들어진 초기 작성한 디바이스 드라이버를 반드시 커널 소
스에 포함 시키고 컴파일 하여 테스트해야 했다.
• 리눅스 커널 개발팀은 이러한 비효율성을 개선하기 위해 모듈기능
을 개발했다.
사용자공간
커널영역
모듈
적재
제거
모듈 프로그래밍
• 모듈이 커널에 적재되면 커널은 디바이스 드라이버의 초기화
를 위해 특별한 함수를 호출한다 (module init)
• 모듈을 제거할때도 디바이스드라이버를 안정된 상태로 제거
하기위해 내부종료를 처리하는 특별한 함수 사용(module_exit)
모듈 프로그래밍
• make를 사용하여 *.ko파일을 커널에 적재
한다.
디바이스 드라이버
• 유닉스 계열 시스템에서 모든 것은 파일로
취급된다.
디스크에 저장되어 있는
파일(*.txt,*.c…..)
정규파일
모니터 , 키보드, 마우스,
하드디스크, RAM…..
장치파일
리눅스파일
open(),write(),read(),ioctl()………………
사용자 입장에서 디바이스 드라이버
• 사용자 태스크가 file_operation구조체에 정의되
어 있는 함수를 통해 장치파일에 접근할 때 호출
할 함수를 정의하고 구현해 주는 것
linux/include/linux/fs.h
주번호
• 리눅스는 시스템에 존재하는 여러 개의 디
바이스 드라이버를 구분하기 위해 각 디바
이스 드라이버마다 고유한 번호를 정해준
다.
• 0~255까지의 주번호 지원
• inode 객체의 i_redv에 저장
부번호
• 사용용도
– 디바이스 드라이버가 다루는 실제 디바이스의
구분
– 블록 디바이스의 파티션 구분
각 디바이스 이름과 주/부 번호의 예
디바이스 드라이버 유형
• 문자 디바이스 드라이버
– 가장 보편적 디바이스 드라이버
• 블록디바이스드라이버
– 블록단위로 입출력 데이터를 저장하는 장치를
다룸
• 네트워크 디바이스 드라이버
장치파일 생성
• mknod 명령어 사용
– ex)mknod /dev/example [c|b] 주번호 부번호
• 생성파일 inode의 i_name : 파일이름
i_rdev : 주번호 부번호
i_mode : 장치 파일 유형
개발자 입장에서 디바이스 드라이버
• 사용자 태스크는 시스템 콜을 통해 장치
파일에 접근한다. 이 때 호출가능한 함수
는 파일 오퍼레이션 구조체에 정의 되있다.
• 반대로 드라이버 개발자는 파일 오퍼레이
션 구조체에 정의되어 있는 함수를 디바이
스 드라이버 내에 구현해 줌으로써 필요한
인터페이스를 제공한다.
개발자 입장에서 디바이스 드라이버
디바이스 드라이버 관리구조
…
i_name
i_mode
i_rdev
…
inode
VFS
장치파일 이름
S_IFCHR or S_IFBLK
Major : Minor
0 1 … 255 0 1 … 255
blkdevs chrdevs
name
f_op
…
name
f_op
…
device driver device driver
struct block_device_operations idedisk_ops{
.open : idedisk_open,
.release : idedisk_release,
.ioctl : idedisk_ioctl
…
}
register_blkdev(3,”ide”,&idedisk_ops)
struct file_operations tty_fops{
.open : tty_open,
.read : tty_read,
.write : tty_write
…
}
register_blkdev(4,”tty”,&tty_fops)
리눅스에서 각 디바이스가 사용하는 주 번호
• 현재 실제 사용중인 주 번호
– cat /proc/devices
Major Character devices Block devices
0
1 Memory device RAM disk
2 Pseudo-TTY Floppy disk
3 Pseudo-slaves IDE disk
…
231~239 Unassigned
240~254 Locl / Experimental use
255 Reserved
…
i_name
i_mode
i_rdev
…
inode
VFS
장치파일 이름
S_IFCHR
Major : Minor
0 1 … 253 255chrdevs
name
f_op
…
device driver
struct file_operations mydrv_fops{
.open : my_open,
.read : my_read,
.write : my_write
…
}
register_blkdev(4253”mydrv”,&mydrv_fops)
chrdev_open()호출
device driver…
…
d_inode
…
dentry
…
fdentry
f_pos
f_op
…
0 1 … 253 255
blkdevs
file
task
open(“/dev/mydrv”);
System call interface
User level
Kernel level
files
task_struct
fd[0]
fd[1]
fd[2]
fd[3]
file_struct
insmod mydrv.ko
mknod /dev/mydrv c 253 0
./test_app
블록 디바이스 드라이버
• 블록 디바이스 드라이버는 문자 디바이스 드라이버와는 달리 사용
자의 read()/write()와 1:1 로 사상되지 않는다.
• 대신 리눅스 버퍼캐시를 이용하여 통신,
->블록단위로 입출력을 하기 때문
• 버퍼캐시와 블록 디바이스 드라이버간의 통신은 큐를 사용한다.
• 큐에 들어온 요청을 살펴보고 적절한 동작을 수행
리눅스커널-디바이스드라이버_모듈_프로그래밍
리눅스커널-디바이스드라이버_모듈_프로그래밍
리눅스커널-디바이스드라이버_모듈_프로그래밍

리눅스커널-디바이스드라이버_모듈_프로그래밍

  • 1.
  • 2.
    목차 • 리눅스 모듈 •모듈 프로그래밍 • 모듈 프로그래밍 예제 • 디바이스 드라이버 • 사용자 입장에서 디바이스 드라이버 • 개발자 입장에서 디바이스 드라이버 • 문자 디바이스 드라이버 • 블록 디바이스 드라이버 • 네트워크 디바이스 드라이버
  • 3.
    리눅스 모듈 • 커널이만들어진 초기 작성한 디바이스 드라이버를 반드시 커널 소 스에 포함 시키고 컴파일 하여 테스트해야 했다. • 리눅스 커널 개발팀은 이러한 비효율성을 개선하기 위해 모듈기능 을 개발했다. 사용자공간 커널영역 모듈 적재 제거
  • 4.
    모듈 프로그래밍 • 모듈이커널에 적재되면 커널은 디바이스 드라이버의 초기화 를 위해 특별한 함수를 호출한다 (module init) • 모듈을 제거할때도 디바이스드라이버를 안정된 상태로 제거 하기위해 내부종료를 처리하는 특별한 함수 사용(module_exit)
  • 5.
    모듈 프로그래밍 • make를사용하여 *.ko파일을 커널에 적재 한다.
  • 7.
    디바이스 드라이버 • 유닉스계열 시스템에서 모든 것은 파일로 취급된다. 디스크에 저장되어 있는 파일(*.txt,*.c…..) 정규파일 모니터 , 키보드, 마우스, 하드디스크, RAM….. 장치파일 리눅스파일 open(),write(),read(),ioctl()………………
  • 8.
    사용자 입장에서 디바이스드라이버 • 사용자 태스크가 file_operation구조체에 정의되 어 있는 함수를 통해 장치파일에 접근할 때 호출 할 함수를 정의하고 구현해 주는 것
  • 9.
  • 10.
    주번호 • 리눅스는 시스템에존재하는 여러 개의 디 바이스 드라이버를 구분하기 위해 각 디바 이스 드라이버마다 고유한 번호를 정해준 다. • 0~255까지의 주번호 지원 • inode 객체의 i_redv에 저장
  • 11.
    부번호 • 사용용도 – 디바이스드라이버가 다루는 실제 디바이스의 구분 – 블록 디바이스의 파티션 구분
  • 12.
    각 디바이스 이름과주/부 번호의 예
  • 13.
    디바이스 드라이버 유형 •문자 디바이스 드라이버 – 가장 보편적 디바이스 드라이버 • 블록디바이스드라이버 – 블록단위로 입출력 데이터를 저장하는 장치를 다룸 • 네트워크 디바이스 드라이버
  • 14.
    장치파일 생성 • mknod명령어 사용 – ex)mknod /dev/example [c|b] 주번호 부번호 • 생성파일 inode의 i_name : 파일이름 i_rdev : 주번호 부번호 i_mode : 장치 파일 유형
  • 15.
    개발자 입장에서 디바이스드라이버 • 사용자 태스크는 시스템 콜을 통해 장치 파일에 접근한다. 이 때 호출가능한 함수 는 파일 오퍼레이션 구조체에 정의 되있다. • 반대로 드라이버 개발자는 파일 오퍼레이 션 구조체에 정의되어 있는 함수를 디바이 스 드라이버 내에 구현해 줌으로써 필요한 인터페이스를 제공한다.
  • 16.
  • 17.
    디바이스 드라이버 관리구조 … i_name i_mode i_rdev … inode VFS 장치파일이름 S_IFCHR or S_IFBLK Major : Minor 0 1 … 255 0 1 … 255 blkdevs chrdevs name f_op … name f_op … device driver device driver struct block_device_operations idedisk_ops{ .open : idedisk_open, .release : idedisk_release, .ioctl : idedisk_ioctl … } register_blkdev(3,”ide”,&idedisk_ops) struct file_operations tty_fops{ .open : tty_open, .read : tty_read, .write : tty_write … } register_blkdev(4,”tty”,&tty_fops)
  • 18.
    리눅스에서 각 디바이스가사용하는 주 번호 • 현재 실제 사용중인 주 번호 – cat /proc/devices Major Character devices Block devices 0 1 Memory device RAM disk 2 Pseudo-TTY Floppy disk 3 Pseudo-slaves IDE disk … 231~239 Unassigned 240~254 Locl / Experimental use 255 Reserved
  • 19.
    … i_name i_mode i_rdev … inode VFS 장치파일 이름 S_IFCHR Major :Minor 0 1 … 253 255chrdevs name f_op … device driver struct file_operations mydrv_fops{ .open : my_open, .read : my_read, .write : my_write … } register_blkdev(4253”mydrv”,&mydrv_fops) chrdev_open()호출 device driver… … d_inode … dentry … fdentry f_pos f_op … 0 1 … 253 255 blkdevs file task open(“/dev/mydrv”); System call interface User level Kernel level files task_struct fd[0] fd[1] fd[2] fd[3] file_struct insmod mydrv.ko mknod /dev/mydrv c 253 0 ./test_app
  • 23.
    블록 디바이스 드라이버 •블록 디바이스 드라이버는 문자 디바이스 드라이버와는 달리 사용 자의 read()/write()와 1:1 로 사상되지 않는다. • 대신 리눅스 버퍼캐시를 이용하여 통신, ->블록단위로 입출력을 하기 때문 • 버퍼캐시와 블록 디바이스 드라이버간의 통신은 큐를 사용한다. • 큐에 들어온 요청을 살펴보고 적절한 동작을 수행