디바이스 드라이버
커널 2.6.36 이상부터는 struct file_operations 구조체에서 ioctl() 함수가 완전히 사라졌다
아래의 글에 자세한 설명이 나온다.
http://forum.falinux.com/zbxe/?document_srl=553645
디바이스 드라이버 작성중 ioctl() 함수 에러가나 struct file_operations 구조체의 멤버중 .ioctl 멤버의 이름을 .unlock_ioctl 로 변경하였다.
컴파일 에러안나오고..(warning 은 나온다.. 대게 이런건 무시하는 경향이 있어서.) 잘 동작한다.
헌데 어플에서 ioctl 함수를 호출하면 ioctl() 함수의 리턴값이 -EINVAL 이 나왔다.
이런 당황스런 일이..
원인은 이렇다.
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
두함수의 인자 갯수가 틀리다.
커널 2.6.36 이상을 사용하려고 한다면 기존 드라이버소스 수정할때 주의 하자
저도 이것 때문에 삽질을 좀 하였는데요, 이 이슈 관련해서 제가 노트해 놓은걸 그대로 붙여넣습니다.
용어정리: BKL
빅 커널 락(Big Kernel Lock, BKL)이 있다.
커널 2.4는 CPU가 커널 영역에서 실행하기 위해 BKL을 획득하는 구조였다.
즉, CPU0이 BKL을 획득하고 커널 영역에서 실행중이라면 다른 CPU들은 커널 영역에 진입할 수 없었다.
커널 2.6에서는 BKL의 상당부분을 제거하고, 세마포어(semaphore, 원어로는 세머퍼라 읽는다), 스핀락(spinlock)을 이용하는 구조로 전환하였다.
이는 BKL에 비하면 커널 선점을 허용하면서 잠금을 관리하는 데 들어가는 비용이 낮다.
커널 2.6은 BKL을 완전히 제거하지는 못했다. 그저, 상당부분을 제거했을 뿐이다.
상당부분 제거했다고 하는 BKL 을 2.6.35에 들어서 완전히 제거해 버린 것이다!
그래서 앞으로 디바이스 드라이버를 개발할 때 ioctl 을 두개의 상황에 맞게 고려해야할 듯 하다.
BKL or BKL-Free.
오... 이런 변경점이 있었군요.
자칫잘못하면 삽질하게 되는 부분인데
좋은글 감사합니다.