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


37

lxr.linux.no의 리눅스 2.6.36 소스 코드를 살펴보면 에서 ioctl()메소드를 찾을 수 없습니다 file_operations. 대신에 나는 두 개의 새로운 통화를 발견 unlocked_ioctl()하고 compat_ioctl(). 차이점은 무엇이며 ioctl(), unlocked_ioctl()그리고는 compat_ioctl()?

답변:


39

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

답변 :에서 의 ioctl ()의 새로운 방법 에 의해 조나단 Corbet이 :

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

도입 패치에 대한 설명은 다음 unlocked_ioctlcompat_ioctl2.6.11로합니다. 들판제거는ioctl 2.6.36에서 훨씬 나중에 일어났다.

설명 : ioctl실행될 때 BKL ( Big Kernel Lock )을 사용하여 다른 어떤 것도 동시에 실행할 수 없었습니다. 이것은 다중 프로세서 시스템에서 매우 나쁘므로 BKL을 제거하기 위해 많은 노력을 기울였습니다. 먼저 unlocked_ioctl소개되었습니다. 각 드라이버 작성자가 대신 사용할 잠금을 선택할 수 있습니다. 이 작업은 어려울 수 있으므로 이전 드라이버가 계속 작동하는 동안 (을 사용하여 ioctl) 전환 기간이 있었지만 새 드라이버는 향상된 인터페이스를 사용할 수 있습니다 ( unlocked_ioctl). 결국 모든 드라이버가 변환되어 ioctl제거 될 수있었습니다.

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


1
나는 최신 ioctl 소스를 살펴보고 syscall이 몇 가지 검사를 한 다음 여기 로 점프하는 것을 보았다 . ioctl 시스템에 대한 추가 정보를 어디서 수집 할 수 있는지 알고 있습니까? 문자 파일의 ioctl 명령이 적절한 드라이버로 라우팅되는 방법에 관심이 있습니다. 그것을 통해 unlocked_ioctl이런 것을? 함수 포인터가 파일 (이 경우 a struct file) 마다 사용된다는 사실에 가깝습니다. 은 unlocked_ioctl후 드라이버의 초기화에 문자 파일에 등록 mknod?
sherrellbc

1
@sherrellbc 장치 드라이버와 같은 처리 방법 파일 레지스터 unlocked_ioctlA의를 struct file_ops시작할 때, 이들은로부터 채워 struct file_ops파일이 열릴 때, 파일 객체로. mknod이것에 아무런 역할을하지 않습니다.
Gilles 'SO- 악의를 멈추십시오'

내가 참조. 나는 장치 드라이버가 mknod관련 파일 작업을 자신을 통해 (을 통해 unlocked_ioctl) 리디렉션하기 전에 먼저 문자 장치를 통해 인터페이스를 노출 해야한다고 생각했습니다 .
sherrellbc

4

커널 2.6.36에서 (include / linux / fs.h) struct file_operations 메소드 ioctl ()을 compat_ioctl ()로 대체 할 수없는 경우 (예 : 일부 장치 드라이버의 경우) 및 unlocked_ioctl ()을 사용해야하는 경우가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.