사전적 정의
왜 필요한가? 등장 배경
Firmware에서 임베디드 개발을 할 땐 Memory Mapped I/O를 사용하여 Application이 HW를 직접 제어할 수 있지만, Linux와 같은 OS에서 개발할 땐 HW Memory Mapped I/O에 직접 값 Access가 불가하기 때문에, 공통적으로 쓰는 API를 제공하는 Kernel의 도움을 받아야 한다.
개발자는 하나의 HW를 이용해서 다양한 App을 개발한다. 이때 HW 장치가 교체된다면 정상 동작을 위해 테스트가 필요하다. 모든 App의 HW 관련 코드를 수정하여 테스트 할 수 있도록 커널을 재 빌드 후 테스트 해야하는데, 커널의 빌드 시간이 매우 오래 걸린다.
커널에서 동작할 수 있는 커널 모듈 형식의 디바이스 드라이버를 개발하여, 동작 중인 커널에 적재하여 테스트하는 방법이 요구된다. 이는 테스트마다 매번 커널을 빌드할 필요가 없어서 개발 시간이 단축되며 테스트를 마치면 커널을 빌드해서 배포한다.
커널 모듈
커널 내부에 삽입될 수 있는 Build 된 Binary 파일을 의미한다. .ko
확장자이며, insmod/rmmod를 사용해 커널에 삽입/제거할 수 있다.
=> Device Driver가 Kernel의 도움을 받아 HW 제어를 하기 위해 커널 모듈 형식으로 개발한다
App은 Kernel 안에서 동작 중인 디바이스 드라이버에 직접 접근이 불가하다. 그래서 Device Driver와 연결된 Device File을 만들고 App이 장치 파일에 신호를 보내서 Device Driver가 HW를 제어하도록 한다.
장치를 제어하기 위해 /dev/
에 등록되는 파일이며, Device Node라고도 부른다. /dev/
안에 실제 장치 or 가상 장치가 존재한다
Device File 옵션
sudo mknod /dev/deviceFile c 100 0 # 만들기
ls -al /dev/deviceFile # 확인하기
crw-r--r-- 1 root root 100, 0 Oct 24 15:53 /dev/deviceFile # 결과
mknod 유틸리티
디바이스 파일을 만드는 유틸리티이다. 일반적으로 /dev/
에 생성, 관리하며 root 권한이 필요하다.
sudo mknod [파일명] [파일종류] [majorN] [minorN]
그러나, mknod로 만든 device file은 라즈베리파이가 reboot 되면 사라진다. 때문에 Device Driver를 사용하여 Device File을 만들어야 한다!
chrdev
캐릭터 디바이스 드라이버
blkdev
블록 디바이스 드라이버
netdev
네트워크 디바이스 드라이버
Device Driver 개발 시 가장 먼저 해야 할 일이다. 이미 라즈베리파이에 커널이 있는데, 또 커널 빌드를 해야 한다. 왜?
라즈베리파이 OS 커널 빌드는 공식 홈페이지 참고
커널 로그 확인 커맨드: dmesg -w
Device File을 열고(open), 내용을 읽고(read), 원하는 정보를 작성(write) 후, 닫는다(close).
Device File을 Device Node라 하며, app 개발자는 syscall을 이용해 Device File에 접근해 장치를 제어할 수 있다.
관련 코드는 Device Driver API 참고