it-swarm-ko.tech

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

lxr.linux.no 에서 Linux 2.6.36 소스 코드를 살펴본 결과 file_operations에서 ioctl() 메서드를 찾을 수 없습니다. 대신 unlocked_ioctl()compat_ioctl()이라는 두 가지 새로운 호출을 찾았습니다. ioctl(), unlocked_ioctl()compat_ioctl()의 차이점은 무엇입니까?

40
Sen

메타-응답 : 리눅스 커널에서 일어나는 모든 원시 작업은 lkml (Linux 커널 메일 링리스트) 를 거칩니다. 설명 요약을 보려면 lwn (Linux 주간 뉴스) 을 읽거나 검색하십시오.

답 : From ioctl ()의 새로운 방법Jonathan Corbet :

ioctl()은 BKL (Big Kernel Lock) 하에서 실행되는 커널의 나머지 부분 중 하나입니다. 과거에는 BKL을 사용하여 장기 실행 ioctl() 메소드를 사용하여 관련없는 프로세스에 대해 긴 대기 시간을 만들 수있었습니다.

unlocked_ioctlcompat_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 ()을 사용해야합니다.

4
Pawel Szyszuk