본문 바로가기
Linux BSP

[Linux Device Driver] 디바이스 드라이버

by TYB 2024. 2. 23.
반응형

디바이스 드라이버는 특정 하드웨어나 장치의 입출력을 제어하기 위해 커널의 일부분으로 동작하는 컴퓨터 소프트웨어이다. 

 

 

디바이스 드라이버를 통해 어플리케이션을 수행하고자 한다면 디바이스 드라이버와 어플리케이션의 호출관계를 이용해야한다.

 

디바이스 드라이버의 호출 구조는 윗 그림을 보면 알 수 잇는데

응용프로그램의 함수를 디바이스 드라이버의 file_operations이라고 하는 구조체에 함수 포인터로 링크해주는거임. 그래서 어플리케이션에서 특정 함수를 실행하면, 디바이스 드라이버를 거쳐 하드웨어 인터럽트를 발생시켜 어플리케이션이 원하는 동작을 수행하는거임.

 

open

applitaion 단계에서는 *pathname, flags 2개가 들어가지만 커널의 시스템 콜 함수를 거쳐서 *inode, *filp 2개의 다른 값으로 들어가게 되는거임. 

 

실제 코드가 어떤식으로 작성되는지는 아래의 글을 참고

 

[Raspberry Pi Device Driver] 디바이스 드라이버(app과 dev)를 통한 device 제어

call_dev.c #include #include #include #include #include #include #include #define CALL_DEV_NAME "calldev" #define CALL_DEV_MAJOR 230 static int call_open(struct inode *inode, struct file *filp) { int num = MINOR(inode->i_rdev); printk("call open -> minor :

program-developers-story.tistory.com

 

 

 

ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ ls -l /dev|more

 

  • -: 일반 파일 (Regular file)
  • b: 블록 특수 파일 (Block special file)
  • c: 문자 특수 파일 (Character special file)
  • d: 디렉터리 (Directory)
  • l: 심볼릭 링크 (Symbolic link)
  1. 일반 파일 (-): 가장 흔한 유형의 파일로, 일반적인 데이터를 저장하는 데 사용됩니다. 대부분의 파일이 이 유형에 속합니다.
  2. 예시: -rw-r--r-- 1 user group 1024 Feb 21 10:30 filename
  3. 블록 특수 파일 (b): 블록 장치에 대한 특수 파일로, 데이터를 블록 단위로 읽거나 쓰는 데 사용됩니다. 주로 하드 디스크와 같은 블록 기반의 저장 장치를 나타냅니다.
  4. 예시: brw-rw---- 1 user disk 8, 1 Feb 21 10:30 blockfile
  5. 문자 특수 파일 (c): 문자 장치에 대한 특수 파일로, 데이터를 문자 단위로 읽거나 쓰는 데 사용됩니다. 주로 터미널, 마우스 등과 같은 문자 기반 장치를 나타냅니다.
  6. 예시: crw-rw-r-- 1 user tty 5, 1 Feb 21 10:30 charfile
  7. 디렉터리 (d): 다른 파일이나 디렉터리를 포함하는 디렉터리를 나타냅니다. 디렉터리에 접근하려면 'x' 권한이 필요합니다.
  8. 예시: drwxr-xr-x 2 user group 4096 Feb 21 10:30 dirname
  9. 심볼릭 링크 (l): 다른 파일이나 디렉터리에 대한 참조를 나타내는 심볼릭 링크를 나타냅니다.
  10. 예시: lrwxrwxrwx 1 user group 6 Feb 21 10:30 linkname -> target

디바이스 드라이버에서 중요한 건 char 파일인지, 주번호와 부번호가 몇번인지가 가장 중요함.

 


ubuntu에서 디바이스 드라이버 만들어보자~

ubuntu@ubuntu8:~/pi_bsp/drivers/p184_calldev$ sudo mknod /dev/calldev c 230 32
ubuntu@ubuntu8:~/pi_bsp/drivers/p184_calldev$ ls -l /dev/calldev
crw-r--r-- 1 root root 230, 32  2월 23 09:31 /dev/calldev

아래의 mknod 명령이 /dev파일에 device driver 파일을 생성하는거임.

c 옵션은 character 문자형 파일

b 옵션을 주면 block 블록형 파일이 되는거임.

230은 주번호

32는 부번호

 

calldev 파일은 일반적인 파일이 아니므로 sudo 명령을 주더라도 write가 안된다.

 

지울때는 파일 지우듯이

$ sudo rm -rf /dev/calldev

해주면 됨~

 

 

 

 

 

 

 

 

 

 

 

반응형