lxr.linux.no 에서 Linux 2.6.36 소스 코드를 살펴본 결과 file_operations
에서 ioctl()
메서드를 찾을 수 없습니다. 대신 unlocked_ioctl()
및 compat_ioctl()
이라는 두 가지 새로운 호출을 찾았습니다. ioctl()
, unlocked_ioctl()
및 compat_ioctl()
의 차이점은 무엇입니까?
메타-응답 : 리눅스 커널에서 일어나는 모든 원시 작업은 lkml (Linux 커널 메일 링리스트) 를 거칩니다. 설명 요약을 보려면 lwn (Linux 주간 뉴스) 을 읽거나 검색하십시오.
답 : From ioctl ()의 새로운 방법Jonathan Corbet :
ioctl()
은 BKL (Big Kernel Lock) 하에서 실행되는 커널의 나머지 부분 중 하나입니다. 과거에는 BKL을 사용하여 장기 실행ioctl()
메소드를 사용하여 관련없는 프로세스에 대해 긴 대기 시간을 만들 수있었습니다.
unlocked_ioctl
및 compat_ioctl
를 2.6.11에 도입 한 패치에 대한 설명을 따릅니다. 2.6.36에서 ioctl
필드 제거 는 훨씬 나중에 발생했습니다.
설명 : ioctl
을 (를) 실행할 때 Big Kernel Lock (BKL)을 사용하여 다른 어떤 것도 동시에 실행할 수 없었습니다. 이것은 다중 프로세서 시스템에서 매우 나쁘므로 BKL을 제거하기 위해 많은 노력을 기울였습니다. 먼저 unlocked_ioctl
가 소개되었습니다. 각 드라이버 작성자가 대신 사용할 잠금을 선택할 수 있습니다. 이 작업은 어려울 수 있으므로 이전 드라이버 (ioctl
사용)가 계속 작동하는 전환 기간이 있었지만 새 드라이버는 향상된 인터페이스 (unlocked_ioctl
)를 사용할 수 있습니다. 결국 모든 드라이버가 변환되었으며 ioctl
을 (를) 제거 할 수 있습니다.
compat_ioctl
는 동시에 추가되었지만 실제로는 관련이 없습니다. 이는 32 비트 사용자 프로그램이 64 비트 커널에서 ioctl
호출을 할 수 있도록하기위한 것입니다. ioctl
에 대한 마지막 인수의 의미는 드라이버에 따라 다르므로 드라이버 독립적 변환을 수행 할 방법이 없습니다.
커널 2.6.36에서 (include/linux/fs.h) struct file_operations 메소드 ioctl ()을 compat_ioctl ()로 대체 할 수없는 경우가 있으며 (예 : 일부 장치 드라이버의 경우) unlocked_ioctl ()을 사용해야합니다.