누구나 linux char 드라이버 및 해당 구성 요소를 제공하는 인터페이스를 설명 할 수 있습니까?리눅스 문자 드라이버의 인터페이스
답변
먼저 파일 시스템의 기능이 선언 된 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
는 문자 장치 파일을 나타냅니다. 이 노드는 드라이버를 통해 장치와 통신 할 수있는 파일 시스템의 노드입니다. 날짜 이전의 두 숫자는 해당 장치에 사용되는 드라이버를 나타냅니다. 예를 들어, lp0
은 6
및 0
입니다. 첫 번째 숫자는 메이저 (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/devices
및 fops
가 여러분의 드라이버의 모든 기능과 함께 점프 테이블에 대한 포인터가에 표시되는 이름입니다. 이는 file_operations
구조체로 실현됩니다. 지원되는 기능을 알기 위해서는 커널의 fe.h
에서이 구조체를 찾아야합니다. 드라이버에서이 구조체를 정의하고 드라이버의 함수 이름을 넣거나 드라이버가 지원하지 않는 함수에 NULL을 넣으면됩니다. NULL 항목의 경우 일부 기본값이 사용됩니다. 더 편한 것은 C tagged structure initialization syntax을 사용하는 것입니다. 가장 중요한 기능은 lseek
, read
및 write
입니다. 이 장치는 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