2024. 12. 29. 16:58ㆍ디바이스 드라이버
ioctl이란?
유닉스 및 리눅스 시스템에서 디바이스 드라이버와 사용자 공간 프로그램 간의 특별한 입출력 작업을 수행하기 위해 사용되는 시스템 콜
long (*unlocked_ioctl)(file,cmd,arg) : 파일의 특수 제어(ioctl) 동작을 구현
단순 읽기/쓰기 동작 이외의 명령을 디바이스에 전달하고 싶을 때 사용
● 일반적으로 디바이스를 설정하거나 설정을 확인하는 동작
기존의 lkm안에 있는 main.c에 추가한 부분이다. #define DEVICE_IOCTL_CLEAR _IO는 리눅스 커널에서 I/O 제어 명령을 정의할 때 사용되는 매크로이다. 여기서 c와 0은 각각 type과 number이다. type은 장치 유형을 나타내는 문자이고 c는 문자형 디바이스를 뜻한다. number는 명령 번호로 해당 장치에서 사용할 고유 번호이다. 여러개의 작업이 있으면 0,1,2등으로 구분짓는다.
만약 cmd값이 DEVICE_IOCTL_CLEAR일 경우, device_buf 버퍼를 0으로 초기화하는 작업을 수행한다.
ioctl은 unlocked_ioctl이라는 명령어로 동작한다.
그 다음 사용자 프로그램도 만들어준다.
open 함수를 통해 장치 파일을 읽기/쓰기 모드로 열여주고 만약 실패한다면 fail 문구가 뜨도록 실패 처리, 성공한다면 ioctl 명령을 실행시켜준다. ioctl(fd,DEVICE_IOCTL_CLEAR)함수가 만약 성공하면 0, 실패하면 -1이 반환된다.
사용자 프로그램은 툴체인을 사용하여 목적파일로 만들어준다.
그 다음 이 목적파일도 mnt/usr/bin에 복사해준다.
여기서 lib과 bin은 각각 라이브러리 파일과 사용자 어플리케이션의 실행파일이 저장되는 곳이므로 구분해서 복사해줘야한다.
그 다음 qemu 가상머신을 실행해서 문자형 디바이스 드라이버처럼 hello~라는 문구를 read한 다음 write하면 hello~!!라는 문구가 표시된다. ioctl명령을 한 뒤 다시 write를 하면 문구가 표시되지 않는데 이는 ioctl명령이 잘 실행됐음을 보여준다. 설정한 ioctl명령이 초기화 명령이기 때문이다.
왜 ioctl을 사용할까?
일반적인 파일 작업(read,write)으로는 특정 디바이스의 세부 동작이나 설정 작업을 수행하기 어렵기 때문이다. ioctl 명령을 통해 특정 작업(초기화,상태조회,설정 변경등)을 수행할 때 사용되는데 대표적인 예시로는 특정 하드웨어의 LED를 켜거나 끄는 명령, 네트워크 장치의 설정 변경, 커널 드라이버의 상태를 사용자 공간으로 읽어오는 동작을 한다.
'디바이스 드라이버' 카테고리의 다른 글
디바이스 드라이버 개발 (2) (0) | 2024.12.28 |
---|---|
디바이스 드라이버 개발 (1) (1) | 2024.12.28 |
해시테이블 (Hash Table) (0) | 2024.12.23 |
커널의 기본 API 익히기 (0) | 2024.12.23 |
커널 모듈 만들기 (0) | 2024.12.19 |