강좌 & 팁
안녕하세요 판다 이우영입니다.
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 명령은 내부에 비트단위로 영역을 나누어 자료를 담고 있습니다.
|
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을 통해 장치를 제어해보겠습니다.
그럼 다음시간에 만나요~
*참고문헌 리눅스 디바이스 드라이버 -유영창저-