■ Introduction
   데이터를 전송하기 위해 write()함수를 사용하고, 반대로 데이터를 읽기 위해 read()함수를 이용한다.
   상호간에 통신을 위해서는 제어기능과 디바이스상태를 확인할 수 있는 방법이 필요하다.
   제어 데이터와 전송될 데이터, 상태 데이터와 수신 데이터간의 구별을 할 수 있는 방법이 필요하다.

■ 매개변수 전달
   ret = ioctl(int fd, int request, char* argp)

   int xxx_ioctl(struct inode, struct firle *filp, unsigned int cmd, unsigned long arg)
   {
      return ret;
   }

  
   - fd : 입출력 지정자로써 일반 파일, 소켓, 장치 등을 말한다.
   - request : ioctl()로 요청할 정보를 지정하기 위해 사용된다.
   - argp : request를 통해 얻은 정보를 저장하기 위한 버퍼이다.

■ 특징
   - read(), write()함수와 같이 쓰기와 읽기 처리가 가능하다.
   - 하드웨어의 제어나 상태를 얻기 위해 사용된다
.
   - 응용 프로그램의 명령에 따라 디바이스 드라이버의 매개변수 해석이 달라진다.
   - ioctl은 cmd인자에 따라 올바른 동작을 선택하기 때문에 switch문으로 구성된다.

■ 단점
   추가되는 인자에 대해서 타입 체크를 하지 않기 때문에, ioctl에 잘못된 인자를 넘겨주더라도 컴파일러가 그것에 대해
   경고할 수 없으며, 프로그래머는 실행 전까지 에러를 발견하지 못한다.

■ cmd 구성

사용자 삽입 이미지


   - Direction : 읽기를 위한 요구 명령인지 쓰기를 위한 요구 명령인지 구분하는 속성
   - Size : 매개변수 arg를 통해 전달되는 메모리의 크기
   - Type(Magic Number) : 다른 디바이스 드라이버의 ioctl명령과 구분하기 위한 값
   - Number : 명령을 구분하는 명령어의 순차 번호

■ Macro
   ○ cmd 명령을 만드는 macro 함수
     _IO(type, number) : 부가적인 데이터가 없는 명령을 만드는 macro
     _IOR(type, number) : 디바이스 드라이버에서 데이터를 읽어오기 위한 명령을 만드는 macro
     _IOW(type, number, size) : 디바이스 드라이버에 데이터를 쓰기를 수행하기 위한 명령을 만드는 macro
     _IOWR(type, number, size) : 디바이스 드라이버에 읽고 쓰기를 수행하기 위한 명령을 만드는 macro

   ○ cmd 명령을 해석하는 macro 함수
     _IOC_DIR(cmd) : Direction 필드 값을 읽는 macro
          _IOC_NONE : 속성이 없다
          _IOC_READ : 읽기 속성
          _IOC_WRITE : 쓰기 속성
          _IOC_READ|_IOC_WRITE : 읽기 쓰기 속성
     _IOC_SIZE(cmd) : Size 필드 값을 읽는 macro
     _IOC_TYPE(cmd) : Magic number 필드 값을 읽는 macro
     _IOC_NR(cmd) : Number 필드 값을 읽는 macro

   ○ Return Value
     -EINVAL : 잘못된 명령 번호(POSIX에서는 -ENOTTY) 


by 민트앤라떼 2011. 4. 1. 11:45