2016-04-03

ioctl 이란 ?

ioctl 이란?



리눅스에서 디바이스 파일을 자체를 제어 하기 위해서 사용한다
즉, 일반적인 읽기 쓰기 작업을 Read/Write 저레벨 함수를 사용하고, ioctl 커맨드를 구현하여 데이타의 R/W과 구분하여 드라이버를 제어한다.

CMD 구성 (32bits)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
R/W 구분 데이터 크기 매직번호 구분번호
2bit : R/W 구분
14bit : 데이터 크기
8bit : 매직번호
8bit : 구분번호

매직번호 TYPE : 0~255 ioCtl 명령을 드라이버가 인식하기 위한 고유번호
구분번호 NR : ioCtl 명령들을 서로 구분하기 위해서 사용한다.
데이커 크기  SIZE : arg에 넘어오는 데이터의 크기를 나타낸다.
R/W 구분 Direction :  읽기인지 쓰기인지 명령을 구분한다.


Centos7 에서 테스트 하면
 커널 버전이 3.14 이기 떄문에 ioctl 함수가 존재 하지 않는다.
BKL(Big Kernel Lock) 문제 때문인데, 이는 드라이버 하나의 ioctl을 호출 할때마다 커널에 락이 걸리는 비 효율성이 나타나는 문제이다.

특히 SMP 구조를 가지는 컴퓨팅 환경에서는 , 그 특성이 크리티컬 자원을 공유하는 특성을 가지기 때문에 더 큰 비효율성을 가져온다.

따라서 3.x 커널 버전에서는 unlocked_ioctl을 제공한다.

No comments:

Post a Comment