panda.jpg 


안녕하세요 판다 이우영입니다.


2주 전부터 IOCTL 공부를 하고있었죠?


오늘도 복습을 통해 저번시간에 했던 기억을 끄집어내고 시작하겠습니다.


1. 복습!!!




저번 시간에는 file_operations 구조체를 등록하고 IOCTL 함수의 간단한 예를 보았습니다.


 struct file_operations ioctl_fops =                                                 

{

             .owner       = THIS_MODULE,

             .read        = ioctl_read,

             .poll        = ioctl_poll,

             .open        = ioctl_open,

     .ioctl       = ioctl_ioctl,

             .release     = ioctl_release,

};


IOCTL 함수는 위와 같이 넣어주시면 됩니다.


그리고 IOCTL의 동작은 request( cmd ) 를 통해 결정 한다고 했는데요


오늘은 이 request 와 같은 매크로 들과 cmd의 자료 구조를 알아 보도록 하겠습니다.


2. CMD 명령 자료구조




cmd 명령은 unsigned int 형을 가지고 있습니다.(32bit인거죠.)


cmd  명령은  내부에 비트단위로 영역을 나누어 자료를 담고 있습니다.


01.png  


1)    구분 번호

      명령을 구분하는 명령어의 순차 번호.

      보통 0부터 순서대로 붙여 나간다.

      같은 디바이스 드라이버에서는 중복해서 사용해도 되는데, 그 이유는 명령을 만드는 매크로에서 생성되는 값은 여러 필드를 조합하기 때문이다.

      구분 번호를 추출하기 위해 _IOC_NR 매크로 함수를 사용한다.


2)    매직 번호

      명령을 구분하는 명령어의 순차 번호

      매직 번호 값의 범위는 0~255 사이이다.

      보통 영문자 ‘A’ ~ ‘Z’ 또는 ‘a’ ~ ‘z’를 넣는다.

      잘못된 사용을 막는 초보적인 보안 장치이다.

      가급적 다른 디바이스 드라이버와 다르게 하는 것이 좋다.

      매직 번호를 추출하기 위해 _IOC_TYPE 매크로 함수를 사용한다.

 

3)    데이터 크기

      매개변수 arg를 통해 전달되는 메모리의 크기

 

4)   읽기 쓰기 구분

         읽기를 위한 요구 명령인지 쓰기를 위한 요구 명령인지 구분하는 속성


그럼 저 cmd 명령을 만들기 위해서는 어떻게 해야 할까요?


일일이 비트연산을 해야할까요?


그래서 cmd 명령을 만드는 매크로와 해석하는 매크로가 있습니다.



cmd 명령을 만드는 매크로 함수

 

_IO : 부가적인 데이터가 없는 명령을 만드는 매크로

_IOR : 디바이스 드라이버에서 데이터를 읽어오기 위한 명령을 만드는 매크로

_IOW : 디바이스 드라이버에서 데이터를 써넣기 위한 명령을 만드는 매크로

_IOWR : 디바이스 드라이버에서 읽기/쓰기를 위한 명령을 만드는 매크로

 

이 매크로의 형태는 다음과 같은 형식의 값을 입력하도록 되어 있다.

 

_IO ( 매직 번호, 구분 번호 )

_IOR ( 매직 번호, 구분 번호, 변수형 )

_IOW ( 매직 번호, 구분 번호, 변수형 )

_IOWR ( 매직 번호, 구분 번호, 변수형 )

 

cmd 명령을 해석하는 매크로 함수

 

_IOC_NR : 구분 번호 필드 값을 읽는 매크로

_IOC_TYPE : 매직 번호 필드 값을 읽는 매크로

_IOC_SIZE : 데이터의 크기 필드 값을 읽는 매크로

_IOC_DIR : 읽기와 쓰기 속성 필드 값을 읽는 매크로


오늘은 여기까지!!


가음시간에는 실제로 ioctl을 통해 장치를 제어해보겠습니다.


그럼 다음시간에 만나요~


*참고문헌 리눅스 디바이스 드라이버 -유영창저-