답변:
메타-응답 : 리눅스 커널에서 일어나는 모든 원시 작업은 lkml (리눅스 커널 메일 링리스트) 을 거치게 됩니다. 설명 요약은 lwn (Linux 주간 뉴스)을 읽거나 검색 하십시오 .
답변 :에서 의 ioctl ()의 새로운 방법 에 의해 조나단 Corbet이 :
ioctl()
BKL (Big Kernel Lock)에서 실행되는 커널의 나머지 부분 중 하나입니다. 과거에는 BKLioctl()
을 사용하여 장기 실행 방법으로 관련없는 프로세스에 대한 긴 대기 시간을 만들 수있었습니다.
도입 패치에 대한 설명은 다음 unlocked_ioctl
과 compat_ioctl
2.6.11로합니다. 들판 의 제거는ioctl
2.6.36에서 훨씬 나중에 일어났다.
설명 : ioctl
실행될 때 BKL ( Big Kernel Lock )을 사용하여 다른 어떤 것도 동시에 실행할 수 없었습니다. 이것은 다중 프로세서 시스템에서 매우 나쁘므로 BKL을 제거하기 위해 많은 노력을 기울였습니다. 먼저 unlocked_ioctl
소개되었습니다. 각 드라이버 작성자가 대신 사용할 잠금을 선택할 수 있습니다. 이 작업은 어려울 수 있으므로 이전 드라이버가 계속 작동하는 동안 (을 사용하여 ioctl
) 전환 기간이 있었지만 새 드라이버는 향상된 인터페이스를 사용할 수 있습니다 ( unlocked_ioctl
). 결국 모든 드라이버가 변환되어 ioctl
제거 될 수있었습니다.
compat_ioctl
동시에 추가되었지만 실제로는 관련이 없습니다. 그 목적은 32 비트 사용자 프로그램 ioctl
이 64 비트 커널에서 호출 할 수 있도록하는 것 입니다. 마지막 인수의 의미는 ioctl
드라이버 에 따라 다르므로 드라이버 독립적 변환을 수행 할 방법이 없습니다.
unlocked_ioctl
A의를 struct file_ops
시작할 때, 이들은로부터 채워 struct file_ops
파일이 열릴 때, 파일 객체로. mknod
이것에 아무런 역할을하지 않습니다.
mknod
관련 파일 작업을 자신을 통해 (을 통해 unlocked_ioctl
) 리디렉션하기 전에 먼저 문자 장치를 통해 인터페이스를 노출 해야한다고 생각했습니다 .
커널 2.6.36에서 (include / linux / fs.h) struct file_operations 메소드 ioctl ()을 compat_ioctl ()로 대체 할 수없는 경우 (예 : 일부 장치 드라이버의 경우) 및 unlocked_ioctl ()을 사용해야하는 경우가 있습니다.
unlocked_ioctl
이런 것을? 함수 포인터가 파일 (이 경우 astruct file
) 마다 사용된다는 사실에 가깝습니다. 은unlocked_ioctl
후 드라이버의 초기화에 문자 파일에 등록mknod
?