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)