01.01.2015 Views

device_driver-08.pdf(1.9MB)

device_driver-08.pdf(1.9MB)

device_driver-08.pdf(1.9MB)

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

struct file_operations<br />

221<br />

struct file_operations<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

struct file_operations<br />

222<br />

file_operations 구조체 필드<br />

<br />

<br />

struct module *owner<br />

loff_t (*llseek) (struct file *, loff_t, int);<br />

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);<br />

<br />

ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);<br />

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);<br />

<br />

ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t,<br />

loff_t);<br />

unsigned int (*poll) (struct file *, struct poll_table_struct *);<br />

<br />

int (*ioctl) (struct t inode *, struct t *file, unsigned int, unsigned long);<br />

int (*mmap) (struct file *, struct vm_area_struct *);<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


디바이스 드라이버 구성도<br />

223<br />

open() : xxx_open()<br />

close() : xxx_close()<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

디바이스 드라이버 구성도<br />

224<br />

read() : xxx_read()<br />

write() : xxx_write()<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


디바이스 드라이버 구성도<br />

225<br />

lseek() : xxx_llseek()<br />

ioctl() : xxx_ioctl()<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버의 등록과 해제 및 구성<br />

226<br />

등록<br />

<br />

<br />

<br />

해제<br />

<br />

<br />

register_chrdev<br />

int register_chrdev(unsigned int major, const char *name, struct<br />

file_operations *fops)<br />

#include <br />

unregister _ chrdev<br />

int unregister_chrdev(unsigned int major, const char *name)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버의 등록과 해제 및 구성<br />

227<br />

문자 디바이스 드라이버의 구성<br />

<br />

<br />

<br />

<br />

<br />

<br />

커널 소스 헤더 파일<br />

문자 디바이스 드라이버 구현을 위해 저수준 파일 입출력에 대응<br />

하는 file_operations 구조체에 등록할 함수<br />

인터럽트를 사용하는 하드웨어 장치라면 인터럽트 함수 서비스<br />

함수<br />

file_operations 변수<br />

문자 디바이스 드라이버를 등록하는 모듈 초기화 함수<br />

문자 디바이스 드라이버를 제거하는 모듈 종료 함수<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버의 등록과 해제 및 구성<br />

228<br />

디바이스 드라이버와 커널간의 통신<br />

<br />

<br />

<br />

문자 드라이버 : chrdevs[] 테이블 이용<br />

블록 드라이버 : blkdevs[], blk_dev[] 테이블 이용<br />

네트웍 드라이버 : <strong>device</strong> 구조 이용<br />

Major number<br />

0<br />

MAX_CHRDEV - 1<br />

http://eoslab.ssu.ac.kr<br />

chrdevs[]<br />

/* fs/<strong>device</strong>s.c */<br />

1<br />

struct <strong>device</strong>_struct { file_operations<br />

name;<br />

2<br />

lseek<br />

fops;<br />

read,<br />

} chrdevs[]; write,<br />

readdir<br />

poll,<br />

ioctl,<br />

mmap,<br />

open,<br />

flush,<br />

release<br />

fsync,<br />

…..<br />

…<br />

Linux Device Driver


문자 디바이스 드라이버의 등록과 해제 및 구성<br />

229<br />

모듈 형태로 구성한 문자 디바이스 드라이버<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버 작성 예제<br />

230<br />

예제 소스 – call_dev.c<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버 작성 예제<br />

231<br />

예제 소스 – call_dev.c<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버 작성 예제<br />

232<br />

예제 소스 – call_app.c<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버 작성 예제<br />

233<br />

예제 소스 – Makefile<br />

실행 방법<br />

[root@] # mknod /dev/calldev c 240 32<br />

<br />

<br />

<br />

<br />

• 디바이스 파일 생성<br />

[root@] # make<br />

• 디바이스 드라이버 모듈 컴파일<br />

[root@] # insmod call_dev.o<br />

• 디바이스 드라이버 모듈 적재<br />

[root@] # gcc –o call_app call_app.c<br />

• 응용 프로그램 컴파일<br />

[root@] # ./call_app<br />

app<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버의 등록과 해제 및 구성<br />

234<br />

모듈 형태로 구성한 문자 디바이스 드라이버(kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버 작성 예제<br />

235<br />

예제 소스 – call_dev.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버 작성 예제<br />

236<br />

예제 소스 – call_dev.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버 작성 예제<br />

237<br />

예제 소스 – call_dev.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버 작성 예제<br />

238<br />

예제 소스 – call_app.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버 작성 예제<br />

239<br />

예제 소스 – 실행 결과<br />

call_dev.c(kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버 작성 예제<br />

240<br />

예제 소스 – 실행 결과<br />

call_app.c(kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

241<br />

디바이스 드라이버에는 하드웨어를 다루고 커널 내에서<br />

디바이스 드라이버로 동작하기 위한 소프트웨어적인 처<br />

리 수반<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

디바이스 드라이버의 등록과 해제<br />

디바이스 드라이버에 내부 구조체의 메모리 할당과 해제<br />

여러 프로세스가 하나의 디바이스에 접근할 때 필요한 사전 처리<br />

및종료시처리<br />

주번호에 종속된 부번호를 관리하기 위한 사전 처리 및 종료 시 처<br />

리<br />

하드웨어 검출 처리 및 에러 처리<br />

하드웨어 초기화와 제거 가능한 하드웨어의 제거 처리<br />

응용 프로그램에서 디바이스 드라이버를 사용하는 경우의 초기<br />

처리및사용종료처리<br />

부번호에 관련된 프로세스별 처리<br />

프로세스별 메모리 할당과 해제<br />

사용하는 모듈수의 관리<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

242<br />

두 가지 초기화 처리 시점과 종료 처리 시점 존재<br />

<br />

<br />

모듈 적재와 커널 부팅 처리 과정 또는 제거 과정<br />

• insmod 명령 : module_init<br />

• rmmod 명령 : module_exit<br />

exit<br />

응용 프로그램이 디바이스 파일을 여는 과정과 닫는 과정<br />

• open() 함수 : file_operations.open<br />

• close() 함수 : file_operations.close<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

243<br />

module_init의 초기화 처리<br />

<br />

<br />

<br />

<br />

<br />

<br />

디바이스 드라이버의 등록<br />

디바이스 드라이버에 내부 구조체의 메모리 할당<br />

여러 프로세스가 하나의 디바이스에 접근하는 경우에 필요한 사<br />

전처리<br />

주번호에 종속된 부번호를 관리하기 위한 사전 처리<br />

하드웨어 검출 처리 및 에러 처리<br />

하드웨어 초기화<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

244<br />

module_exit의 종료처리<br />

<br />

<br />

<br />

디바이스 드라이버의 해제<br />

디바이스 드라이버에 할당된 모든 메모리의 해제<br />

하드웨어 제거에 따른 처리<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

245<br />

처리 순서<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

246<br />

디바이스 드라이버 open() 함수<br />

<br />

응용 프로그램에서 디바이스 드라이버를 이용해 하드웨어를 제어<br />

하기 위해서는 디바이스 드라이버의 주번호 정보가 있는 디바이<br />

스 파일을 열어야 한다<br />

int fd;<br />

fd = open(DEVICE _ FILENAME, O_ RDWR | O_ NDELAY);<br />

if (fd < 0)<br />

{<br />

printf(“error number %d”, error);<br />

exit(1);<br />

}<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

247<br />

<br />

디바이스 파일이 있고 디바이스 파일의 주번호에 해당하는 디바<br />

이스 드라이버가 커널에 등록된 상태이면, 디바이스 드라이버의<br />

file_operations 구조체의 open 필드에 선언된 함수가 호출된다<br />

struct file_operations call_fops =<br />

{<br />

…<br />

open : xxx_open,<br />

…<br />

}<br />

<br />

file_operations 구조체의 open 필드에 대입되는 함수 형식<br />

int open(struct inode *inode, struct file *filp)<br />

{<br />

int err = 0;<br />

// open 시 처리 내용들<br />

…<br />

return error;<br />

}<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

248<br />

<br />

<br />

Error<br />

• ENODEV<br />

• ENOMEM<br />

• EBUSY<br />

: 하드웨어가 존재하지 않는다<br />

: 커널 메모리가 부족하다<br />

: 디바이스가 이미 사용중이다<br />

에러 값이 양수이므로 에러를 반환시에는 음수로 변환한 값을 사<br />

용<br />

• return –ENODEV;<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

249<br />

Open() 함수 호출 시 초기화 처리<br />

<br />

<br />

<br />

<br />

<br />

디바이스 드라이버가 처음 열렸을 때 하드웨어 초기화<br />

디바이스 드라이버의 동작에 필요한 에러 체크<br />

부번호에 대한 처리가 필요한 경우 파일 오퍼레이션 구조체의 갱<br />

신<br />

프로세스별 메모리 할당과 초기화<br />

모듈의 사용 횟수 증가<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

250<br />

디바이스 드라이버의 release() 함수<br />

<br />

<br />

<br />

응용 프로그램에서 하드웨어의 제어가 끝나 디바이스 드라이버를 사용할<br />

필요가 없다면 디바이스 파일을 닫아야 한다<br />

if (fd >= 0) close(fd);<br />

정상적으로 열린 디바이스 파일을 close() 함수를 이용해 닫으면, 등록된<br />

디바이스 드라이버의 file_operations 구조체의 release 필드에 선언된 함<br />

수가 호출 된다<br />

struct file_operations call_fops =<br />

{<br />

…<br />

release : xxx_release,<br />

…<br />

}<br />

file_operations 구조체의 release 필드에 대입되는 함수 형식<br />

int xxx_release(struct inode *inode, struct file *filp)<br />

{<br />

// close 시처리내용<br />

return 0;<br />

}<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

251<br />

release() 함수 호출 시 종료 처리<br />

<br />

<br />

프로세스별 할당 메모리 해제<br />

모듈 사용 횟수 감소<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

252<br />

모듈 사용 횟수 관리<br />

<br />

<br />

<br />

<br />

커널 24에서는 2.4에서는 디바이스 드라이버의 사용 횟수를 커널에서 관리<br />

하지 않고 디바이스 드라이버 자체에서 처리<br />

모듈 사용 횟수 관리 매크로<br />

• MOD_INC_USE_COUNT : 사용 횟수 증가<br />

• MOD_DEC_USE_COUNT : 사용 횟수 감소<br />

• MOD_IN_USE : 모듈 사용 횟수가 0이 아니면 참값을 반환<br />

open() 과 release() 함수에서 특별히 수행하는 것이 없더라도 모<br />

듈 사용 횟수 처리는 반드시 필요<br />

디바이스 드라이버가 open() 함수를 한번만 호출하도록 처리하고<br />

싶다면<br />

int xxx_open(struct inode *inode, struct file *filp)<br />

{<br />

if (MOD_IN_USE) return –EBUSY;<br />

MOD_INC_USE_COUNT;<br />

return 0;<br />

}<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

253<br />

I/O 포트 영역의 경쟁 처리 함수<br />

<br />

<br />

<br />

동일한 자원을 다른 목적으로 사용하는 디바이스 드라이버의 존<br />

재가능<br />

해당 영역의 충돌 문제를 처리할 수 있도록 함수 제공<br />

#include 필요<br />

• check_region : 등록할 수 있는 I/O 영역인지 확인<br />

• int check_region(unsigned long from, unsigned long extent);<br />

• 커널에 등록된 I/O 자원 중 from으로 지정된 주소부터 extent로 지정된<br />

크기와 일치하는 영역이 있는지 확인<br />

• request_region : I/O 영역을 등록<br />

• void request_region(unsigned long from, unsigned long extent, const<br />

char *name);<br />

• from으로 시작되는 I/O 영역을 name에에 지정된 이름으로, extent로로 지정<br />

된 크기만큼 등록<br />

• /proc/ioport 파일로 확인 가능<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

254<br />

<br />

• release_region : 등록된 I/O 영역을 해제<br />

• void release_region(unsigned region(unsigned long from, unsigned long extent);<br />

• 등록된 I/O 영역 중에서 from과 extent가 일치하는 등록 항목을 제거<br />

• 일부분만 제거는 불가능<br />

자원의 충돌을 해결하기 위한 함수 사용 순서<br />

• 디바이스 드라이버 초기화 루틴에서 check_region() 함수를 사용해<br />

해당 I/O 영역의 사용 여부 확인<br />

• 해당 영역을 사용하지 않고 있으면 request_region() 함수를 사용해<br />

점유 영역을 새로 등록<br />

• 디바이스 드라이버를 제거할 때는 release_region() 함수를 사용해<br />

등록된 영역을 제거<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

255<br />

I/O 메모리 영역의 경쟁 처리 함수<br />

<br />

<br />

<br />

PCI나 기타 내부적으로 I/O 제어를 위해 메모리 영역을 사용하는<br />

경우<br />

I/O 메모리 영역의 경쟁 문제를 해결할 수 있도록 함수 제공<br />

#include 필요<br />

• check_mem_region() : 등록된 자원인가를 확인<br />

• int check_mem_region(unsigned long from, unsigned long extent);<br />

• request_mem_region() : 자원을 등록<br />

• void request_mem_region(unsigned long from, unsigned long extent,<br />

const char *name);<br />

• release_mem_region() : 등록된 자원을 제거<br />

• void release_mem_region(unsigned long from, unsigned long extent);<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

256<br />

읽기와 쓰기의 구현<br />

<br />

디지털 입출력을 처리하는 디바이스 파일 “/dev/dio”에 데이터를<br />

써넣거나 읽을때의 처리<br />

int fd;<br />

char buff[128];<br />

fd = open(“/dev/dio”, O_ RDWR | O_ NDELAY);<br />

…<br />

read(fd, buff, 16);<br />

…<br />

write(fd, buff, 32);<br />

…<br />

close(fd);<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

257<br />

<br />

read(), write() 함수를 사용하면 디바이스 파일의 주번호에 의해 연결된<br />

커널 내에 디바이스 드라이버 file_operations 구조체 함수 필드 중 read<br />

필드와 write 필드가 각각 호출됨<br />

ssize_t xxx_read(struct file *filp, const char *buf, size_t count, loff_t *f_pos)<br />

{<br />

// 하드웨어에서 데이터 읽기<br />

}<br />

ssize_t write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)<br />

{<br />

// 하드웨어에 데이터 쓰기<br />

}<br />

struct file_operations xxx_fops =<br />

{<br />

…<br />

read : xxx_read,<br />

write : xxx_write,<br />

…<br />

};<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

258<br />

디바이스 드라이버의 읽기와 쓰기 구조<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

259<br />

read() 함수의 구현<br />

<br />

<br />

buf에 전달되는 값은 응용 프로그램에서 전달한 버퍼의 주소이므<br />

로 디바이스 드라이버에서 직접적으로 사용 불가능<br />

커널 메모리 공간과 사용자 메모리 공간의 이동을 위한 함수<br />

• copy_ to_ user(to, from, n)<br />

• 커널 메모리 from을 사용자 메모리 to로 n만큼 복사<br />

• put_user(x, ptr)<br />

• x 변수값을 ptr의 사용자 메모리값에 대입<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

260<br />

<br />

read() 함수에서 하드웨어를 다룰 경우에 대한 함수<br />

• inb, inw, inl, insb, insw, insl<br />

• outb, outw, outl, outsb, outsw, outsl<br />

• readb, readw, readl<br />

• writeb, writew, writel<br />

• memset_io, memcpy_fromio, memcpy_toio<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

261<br />

일반적인 read() 함수의 처리 구조<br />

<br />

read() 함수의 에러 : return 값이 음수인 경우<br />

• EAGAIN : O_NONBLOCK으로 열렸지만 즉시 읽을 수 있는 데이터<br />

가 없다<br />

• EIO : I/O 에러 발생<br />

• EFAULT : buf가 접근할 수 없는 주소 공간을 가리킨다<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

262<br />

write() 함수의 구현<br />

<br />

<br />

read() 함수와 마찬가지로 buf의 주소가 응용 프로그램에서의 주<br />

소이므로 디바이스 드라이버에서 직접적인 사용 불가능<br />

커널 메모리 공간과 사용자 메모리 공간의 이동을 위한 함수<br />

• copy_ from_ user(to, from, n)<br />

• 사용자 메모리 from을 커널 메모리 to로 n만큼 복사<br />

• get_user(x, ptr)<br />

• x 변수에 ptr의 사용자 메모리 값을 대입<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


263<br />

<br />

write() 함수의 에러<br />

• EAGAIN : O_NONBLOCK으로 열렸지만 write() 호출 시에 즉시 처리<br />

할 수 있는 상황이 아니다<br />

• EIO : I/O 에러 발생<br />

• EFAULT : buf가 접근할 수 없는 주소 공간을 가리킴<br />

• ENOSPC : 데이터를 위한 공간이 없다<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

264<br />

일반적인 write() 함수의 구조<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

265<br />

struct file *filp<br />

<br />

struct file의 형태<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

초기화와 종료 처리<br />

266<br />

<br />

자주 사용되는 필드<br />

• unsigned int f_flags;<br />

• 응용 프로그램에서 디바이스 파일을 열었을 때 flags에 설정된 값<br />

• O_RDONLY : 읽기 전용 처리<br />

• O_NONBLOCK, O_NDELAY : 블록 처리를 수행 안함<br />

• O_SYNC : 써넣는 데이터는 반드시 디바이스에 적용<br />

• loff_t f_pos;<br />

• f_pos 필드 변수는 현재의 읽기/쓰기 위치를 담으며, read(), write(),<br />

llseek()과 같이 읽기/쓰기의 위치를 변경할 수 있는 함수에 의해 변경<br />

• void *private_data;<br />

• 디바이스 드라이버에서 프로세스가 함수간 메모리를 공유할 필요가 있<br />

을 때 사용<br />

• struct file_operations *f_op;<br />

• 부번호에 따라 다른 응답을 처리해야 할 경우<br />

• open() 함수 처리시에 이 필드는 직접 변경하여 부번호에 따라 다르게 동<br />

작하는 디바이스 드라이버 작성 가능<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


초기화와 종료 처리<br />

267<br />

I/O 맵드 입출력 처리 함수<br />

메모리 맵드 입출력 처리 함수<br />

사용자 프로세스 공간과 커널 프로세스 공간<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

디바이스 드라이버 읽기/쓰기 구현 예제<br />

268<br />

예제 소스 – rdwr_dev.c<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


디바이스 드라이버 읽기/쓰기 구현 예제<br />

269<br />

예제 소스 – rdwr_dev.c<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

디바이스 드라이버 읽기/쓰기 구현 예제<br />

270<br />

예제 소스 – rdwr_app.c<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버의 읽기와 쓰기<br />

271<br />

예제 소스 – rdwr_dev.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버의 읽기와 쓰기<br />

272<br />

예제 소스 – rdwr_dev.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버의 읽기와 쓰기<br />

273<br />

예제 소스 – rdwr_dev.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버의 읽기와 쓰기<br />

274<br />

예제 소스 – rdwr_dev.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버의 읽기와 쓰기<br />

275<br />

예제 소스 – rdwr_app.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

문자 디바이스 드라이버의 읽기와 쓰기<br />

276<br />

예제 소스 – rdwr_app.c (kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


문자 디바이스 드라이버의 읽기와 쓰기<br />

277<br />

예제 소스 – 실행 결과<br />

rdwr_app.c(kernel 2.6)<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver<br />

주번호, 부번호, 디바이스 타입<br />

278<br />

주번호(Major Number)<br />

<br />

<br />

<br />

디바이스 파일<br />

• 커널 내부의 함수를 호출할 수 있는 정보만을 제공하는 파일<br />

• 디바이스 드라이버 타입 정보(문자형/블록형)<br />

• 주번호(Major Number)<br />

• 부번호(Minor Number)<br />

디바이스 드라이버 타입 정보와 주번호는 디바이스 드라이버가<br />

등록된 함수를 호출하는 정보로 사용<br />

제어하려는 디바이스를 구분하기 위한 디바이스 ID<br />

부번호(Minor ( Number)<br />

<br />

커널에 포함된 각 디바이스 드라이버에 의해 용도 결정<br />

• 디바이스 드라이버가 다루는 실제 디바이스의 구분<br />

• 용도에 따른 디바이스의 구분<br />

• 블록 디바이스의 파티션 구분<br />

• 일반적으로 같은 종류의 디바이스가 여럿 있을 때 그 중 하나를 선택<br />

하기 위해 사용<br />

http://eoslab.ssu.ac.kr<br />

Linux Device Driver


주번호, 부번호, 디바이스 타입<br />

279<br />

디바이스 타입 – kdev_t<br />

<br />

<br />

Kernel 2.4.X 의 디바이스 타입 변수형<br />

“include/linux/kdev_t.h” 파일에 선언<br />

typedef unsigned short kdev_t;<br />

#define MINORBITS 8<br />

#define MINORMASK ((1U > MINORBITS))<br />

#define MINOR(dev)<br />

((unsigned int)((dev) ) & MINORMASK))<br />

#define MKDEV(ma, mi) (((ma)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!