장치 파일, ioctl, sysfs, netlink의 사용량 차이


12

Linux에서 장치와 상호 작용하는 가장 유용한 (기능 측면에서) 방법을 명확하게하려고합니다. 내가 이해하는 것처럼 장치 파일은 기능의 일부 (블록 장치의 주소 블록, 문자 장치의 스트림 등) 만 노출합니다. ioctl(2)가장 일반적으로 사용되는 것으로 보이지만 일부 사람들은 안전하지 않다고 말합니다.

좋은 기사 나 다른 관련 조언을 환영합니다.

답변:


9

ioctl/dev출품작 과 손을 잡고 경향이있다 . 일반적인 코드는

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);

이것은 완벽한 표준 유닉스 행동입니다. 커널 드라이버 안에는 액세스 제어를 할 수 있습니다 (예 : root일부 작업 만 수행하거나보다 세밀한 액세스를 위해 특정 기능이 필요할 수 있음).

물론 이것은 장치가 블록 / 문자 읽기 / 쓰기 활동을 사용하는 것보다 훨씬 더 많이 노출 할 수 있음을 의미합니다. 많은 일들이 ioctl전화 를 통해 이루어질 수 있습니다 . 그리 쉬운에서 아주 쉽게 쉘 스크립트에서 사용할 수 있지만,하기 C또는 perl또는 python또는 유사한.

sysfs항목은 드라이버와 상호 작용하는 또 다른 방법입니다. 일반적으로 각 명령 유형은 서로 다른 항목을 가지므로 드라이버 작성이 복잡 할 수 있지만 사용자 공간을 통해 쉽게 액세스 할 수 있습니다. 간단한 쉘 스크립트는 많은 것을 조작 할 수 있지만 매우 효율적이지 않을 수 있습니다

netlink주로 네트워크 데이터 전송에 중점을두고 있지만 다른 용도로도 사용될 수 있습니다. 대량의 데이터 전송에 실제로 유용하며 ioctl경우에 따라 후속 작업이 될 수 있습니다 .

모든 옵션이 좋습니다. 사용 사례는 드라이버에서 노출 할 인터페이스 유형을 더 잘 결정할 수 있습니다.


1
혼란에 더 추가 : "ioctl : 그러나 ioctl은 커널에서 더 이상 사용되지 않으며 ioctl을 새로 사용하여 업스트림에서 허용하는 드라이버를 얻는 것이 어려울 것입니다. 커널 관리자는 커널 코드와 응용 프로그램 코드를 너무 상호 의존적으로 만들기 때문에 ioctl을 싫어합니다 커널 버전과 아키텍처에서 두 단계를 모두 단계적으로 유지하기가 어렵습니다. " [쪽 255] Chris Simmonds의 "2017 년 임베디드 리눅스 프로그래밍 마스터 링".
Israr

여기에 질문이 추가됩니다. 그러면 C에서 sysfs에 액세스 할 수 있습니까?
Israr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.