ioctl(), Unlocked_ioctl() 및 compat_ioctl()의 차이점은 무엇입니까?

ioctl(), Unlocked_ioctl() 및 compat_ioctl()의 차이점은 무엇입니까?

Linux 2.6.36 소스 코드 보기:lxr.linux.noioctl(), 방법 을 찾을 수 없습니다 file_operations. 대신에 두 개의 새로운 호출을 발견했습니다: unlocked_ioctl()compat_ioctl(). ioctl(), , 그리고 unlocked_ioctl()의 차이점은 무엇인가요 compat_ioctl()?

답변1

메타 답변: Linux 커널에서 발생하는 모든 원시 작업은 통과합니다.lkml(리눅스 커널 메일링 리스트). 설명 요약을 보려면 읽거나 검색하세요.lwn (리눅스 주간 뉴스).

답: 에서ioctl()의 새로운 방식통과조나단 코베트:

ioctl()BKL(Big Kernel Lock) 하에서 실행되는 커널의 나머지 부분 중 하나입니다. 과거에는 BKL을 사용하면 장기 실행 ioctl()방법으로 인해 관련 없는 프로세스에 대해 오랜 지연이 발생할 수 있었습니다.

unlocked_ioctl다음은 2.6.11에 도입된 패치에 대한 설명이다 compat_ioctl. 이것ioctl필드 삭제2.6.36에 매우 늦게 일어났습니다.

설명: ioctl실행시 비용이 발생합니다.큰 커널 잠금(BKL)이므로 동시에 다른 항목을 실행할 수 없습니다. 이는 다중 프로세서 시스템에서는 매우 좋지 않기 때문에 BKL을 제거하기 위해 많은 노력을 기울였습니다. 먼저 unlocked_ioctl소개가 주어집니다. 이를 통해 각 드라이버 작성자는 사용할 잠금을 선택할 수 있습니다. 이는 어려울 수 있으므로 이전 드라이버가 여전히 작동 ioctl하지만(사용되는) 새 드라이버는 향상된 인터페이스( unlocked_ioctl)를 사용할 수 있는 전환 기간이 있습니다. 결국 모든 드라이버가 변환되어 ioctl제거될 수 있습니다.

compat_ioctl실제로는 관련이 없지만 동시에 추가되었습니다. 그 목적은 32비트 사용자 모드 프로그램을 ioctl64비트 커널에서 호출할 수 있도록 하는 것입니다. 마지막 매개변수의 의미는 ioctl드라이버에 따라 다르므로 드라이버 독립적인 변환은 불가능합니다.

답변2

어떤 경우에는 (include/linux/fs.h) 구조체 파일 작업 메서드 ioctl()을 compat_ioctl()로 바꾸는 것이 커널 2.6.36(예: 일부 장치 드라이버의 경우)에서 작동하지 않으며 Unlocked_ioctl을 사용해야 합니다().

관련 정보