Device Driver

GAON PARK·2023년 11월 14일
0
post-thumbnail
post-custom-banner

사전적 정의

  • Program이 HW를 제어하기 위한 SW이다
  • Software Interface를 통해 Application이 HW Spec을 이해하지 않아도 된다

왜 필요한가? 등장 배경

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를 사용해 커널에 삽입/제거할 수 있다.

  • Kernel Module: 커널에 집어 넣을 수 있는 덩어리
  • Device Driver: HW를 제어할 수 있는 프로그램

=> Device Driver가 Kernel의 도움을 받아 HW 제어를 하기 위해 커널 모듈 형식으로 개발한다

Device File

App은 Kernel 안에서 동작 중인 디바이스 드라이버에 직접 접근이 불가하다. 그래서 Device Driver와 연결된 Device File을 만들고 App이 장치 파일에 신호를 보내서 Device Driver가 HW를 제어하도록 한다.

장치를 제어하기 위해 /dev/에 등록되는 파일이며, Device Node라고도 부른다. /dev/ 안에 실제 장치 or 가상 장치가 존재한다

Device File 옵션

  • Major Number (주번호)
    - 기기 종류를 나타낸다
    - 같은 기능을 하는 디바이스가 여러 개 있다면, 같은 주번호를 가진다
  • Minor Number (부번호)
    - 같은 종류의 device에서 구분하기 위한 용도를 가진다
    - 개발자 마음대로 의미 부여가 가능하다
    - blkdev에서는 파티션 번호로 사용한다
    - node 이름에서 숫자가 붙은 경우 부번호를 의미한다

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]
  • 파일명의 파일종류 디바이스 파일 주번호, 부번호 지정하여 생성
    - c: charater device file
    - b: block device file

그러나, mknod로 만든 device file은 라즈베리파이가 reboot 되면 사라진다. 때문에 Device Driver를 사용하여 Device File을 만들어야 한다!

Device Driver 종류

chrdev

캐릭터 디바이스 드라이버

  • byte 단위로 값 전달
  • 일반적인 임베디드 장치에 사용

blkdev

블록 디바이스 드라이버

  • kb 이상의 '블록' 단위로 값 전달
  • disk 장치에 사용되는 디바이스 드라이버

netdev

네트워크 디바이스 드라이버

  • socket을 열고 ioctl이라는 system call로 장치를 제어

커널 빌드

Device Driver 개발 시 가장 먼저 해야 할 일이다. 이미 라즈베리파이에 커널이 있는데, 또 커널 빌드를 해야 한다. 왜?

  • 커널의 API를 이용해 HW 제어를 할 건데
  • 커널의 API가 어디 있는지에 대한 내용은 심볼 테이블에 담겨 있다
  • 현재 라즈베리파이에 설치된 커널은 라즈베리파이만을 위한 커널이며,
  • 그것의 심볼 테이블엔 우리가 필요한 내용이 누락되어 있을 수 있다
  • 또한, 이미 필요한 함수가 정의되어 있더라도 컴파일된 상태이기 때문에 사용이 불가할 수 있다
  • 따라서 Device Driver 개발을 위해 반드시 커널 빌드를 먼저 해야 한다!

라즈베리파이 OS 커널 빌드는 공식 홈페이지 참고
커널 로그 확인 커맨드: dmesg -w

Linux 장치 제어 방법

Device File을 열고(open), 내용을 읽고(read), 원하는 정보를 작성(write) 후, 닫는다(close).
Device File을 Device Node라 하며, app 개발자는 syscall을 이용해 Device File에 접근해 장치를 제어할 수 있다.

관련 코드는 Device Driver API 참고

post-custom-banner

0개의 댓글