2017-02-18 2 views

답변

1

먼저 파일 시스템의 기능이 선언 된 linux/fs.h 헤더 파일이 필요합니다. 이것은 문자 드라이버가 일반적으로 /dev에 파일로 표현 된 문자 장치에 대한 액세스를 관리하기 때문에 필요합니다.

당신이 /dev에서 ls -l를 실행하면이 같은 일부 라인을 참조하십시오

crw-rw----. 1 root lp   6, 0 14. Feb 18:23 lp0 
crw-rw----. 1 root lp   6, 1 14. Feb 18:23 lp1 
crw-rw----. 1 root lp   6, 2 14. Feb 18:23 lp2 
crw-rw----. 1 root lp   6, 3 14. Feb 18:23 lp3 
crw-rw-rw-. 1 root tty   5, 0 15. Feb 10:57 tty 
crw--w----. 1 root tty   4, 0 14. Feb 18:23 tty0 

행 시작 부분의 c는 문자 장치 파일을 나타냅니다. 이 노드는 드라이버를 통해 장치와 통신 할 수있는 파일 시스템의 노드입니다. 날짜 이전의 두 숫자는 해당 장치에 사용되는 드라이버를 나타냅니다. 예를 들어, lp060입니다. 첫 번째 숫자는 메이저 (major)와 두 번째 마이너 (minor)라고 부릅니다. 주 번호는 커널이이 장치에 맞는 드라이버를 선택하는 데 사용됩니다. /proc/devices에는이 번호에 대한 실제 드라이버 인 커널 모듈 이름이 있습니다. 두 번째 숫자는 드라이버에 의해서만 사용되므로 하나의 드라이버로 둘 이상의 장치를 관리 할 수 ​​있습니다. 예를 들어 위의 lp0-3은 주 번호가 6 인 모든 드라이버를 사용합니다.

/dev/devices에 드라이버를 등록하고 항목을 생성하는 이전 방법은 다음 기능을 호출하는 것입니다.

int register_chrdev(unsigned int major, const char *name, 
         const struct file_operations *fops) 

major가 여러분의 드라이버의 주 번호이며, name/dev/devicesfops가 여러분의 드라이버의 모든 기능과 함께 점프 테이블에 대한 포인터가에 표시되는 이름입니다. 이는 file_operations 구조체로 실현됩니다. 지원되는 기능을 알기 위해서는 커널의 fe.h에서이 구조체를 찾아야합니다. 드라이버에서이 구조체를 정의하고 드라이버의 함수 이름을 넣거나 드라이버가 지원하지 않는 함수에 NULL을 넣으면됩니다. NULL 항목의 경우 일부 기본값이 사용됩니다. 더 편한 것은 C tagged structure initialization syntax을 사용하는 것입니다. 가장 중요한 기능은 lseek, readwrite입니다. 이 장치는 linux/fs.h에 정의 된 file 구조체로 표시됩니다.

위의 코드 대신 cdev 구조체를 linux/cdev.h에 사용합니다. 이 방법과 드라이버 프로그래밍에 대한 자세한 내용은 다음을 권장합니다 : http://www.oreilly.com/openbook/linuxdrive3/book/ch03.pdf.

컴파일 된 드라이버가있는 경우 커널에 insmod으로로드 할 수 있습니다. modprobe을 사용하려면 시스템에 따라 구성 방법이 달라집니다. 장치에 대해 /dev의 노드를 가져 오려면 mknod을 사용합니다. 주 번호가 10이고 부 번호가 0 인 문자 장치의 경우 다음과 같습니다.

mknod /dev/my_device c 10 0