Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

109258
1323
114611


[리눅스] 디바이스 파일이란? 디바이스 드라이버의 소개

앞서 리눅스 디바이스 드라이버를 구성하는 세 가지 요소를 소개했습니다. 이 중에 먼저 디바이스 파일에 대해 살펴봅시다. 디바이스 파일은 우리가 제어하려는 하드웨어를 추상화한 대상입니다. 그렇다면 디바이스 파일은 어디에서 확인할 수 있을까요? 리눅스 시스템에서는 디바이스 파일은 "/dev" 디렉토리에 있으며 커널은 이 디렉토리에 있는 각 파일을 하드웨어라고 간주합니다. 또한 리눅스 애플리케이션은 이 디바이스 파일을 통해 하드웨어를 콘트롤합니다.

디바이스 파일 생성하기

자, 여기서 한 가지 의문이 생깁니다. 디바이스 파일은 어떻게 생성할까요? 일반 파일을 생성하듯이 create() 함수를 호출하면 될까요? 

디바이스 파일은 일반 파일과 달리 디바이스 장치를 표현하는 기능입니다. 따라서 리눅스에서 제공하는 mknod 라는 유틸리티를 사용해서 디바이스 파일을 생성할 수 있습니다.

다음은 mknod로 디바이스 파일을 생성하는 형식입니다.
   * mknod [디바이스 파일명]  [디바이스 파일형]  [주 번호]  [부 번호]

만약 '캐릭터 타입 디바이스 드라이버'를 주 번호가 120, 부 번호가 1로 디바이스 파일을 생성하려고 합니다. 이 때는 mknod를 이용해 어떻게 디바이스 파일을 생성할 수 있을까요?  

# mknod /dev/devicefile c 120 1

이렇게 파일을 생성한 후 제대로 디바이스 파일이 생성됐는지 확인해 봅시다.

# ls -al /dev/devicefile
crw-rw---- 1 root root 120,   1 2019-08-23 12:09 /dev/devicefile

보시다시피 디바이스 파일이 제대로 생성됐음을 확인할 수 있습니다.

디바이스 파일 삭제

만약 디바이스 파일을 지우려면 어떻게 해야 할까요? 
디바이스 파일을 삭제하려면 일반 파일을 지울 때 사용하는 rm 명령어를 입력하면 됩니다.

이번에는 rm 명령어를 사용해 /dev/devicefile 디바이스 파일을 지워 보겠습니다.

# rm /dev/devicefile

이어서 /dev/devicefile 파일이 지워졌는데 확인해 봅시다.

# ls -al /dev/devicefile
ls: /dev/devicefile: No such file or directory

ls 명령어와 파일 이름을 함께 지정하니 /dev/devicefile 파일이 없다는 결과를 출력합니다.

Q) 디바이스 파일이 일반 파일과 다른 점은 무엇인가?

앞서 배운 바와 같이 디바이스 파일을 사용해 하드웨어를 제어합니다. 하지만 디바이스 파일 자체가 하드웨어를 의미하는 것은 아니고 아니고, 하드웨어를 식별하는 일종의 정보 파일입니다.

일반 파일은 프로그램을 통해 데이터를 저장하거나 쓰게 되면 그 내용이 파일에 저장돼 크기가 증가됩니다. 하지만 디바이스 파일은 실질적인 하드웨어 정보만을 표현하므로 데이터를 써도 디바이스 파일에 정보가 저장돼지 않습니다. 대신 지정한하드웨어로 데이터가 전달됩니다.

Q) 하드웨어를 식별하는 일종의 정보 파일이라니 더 이해가 가지 않는다. 어떤 정보를 의미하는가?

하드웨어의 기본 속성 정보입니다. 디바이스 파일을 통해서 하드웨어를 관리하는 디바이스 드라이버의 종류와 해당 번호만을 알 수 있습니다. 

한 가지 비유를 들어 보겠습니다. 만약 종합 병원이 있는데 정형외과, 신경외과, 내과 병실이 있다고 가정합시다. 그런데 각각 병실을 어떻게 표현할 수 있을까요?

mknod /dev/device_patient 정형외과 120 1

이렇게 환자라는 디바이스 파일이 이렇게 표현할 수 있습니다. 디바이스 파일도 마찬가지로 표현할 수 있습니다.

Q) 그렇다면 하드웨어의 GPIO나 세부 정보는 디바이스 파일에서 확인할 수는 없겠네?

맞습니다. 각 장치의 세부 하드웨어 속성은 디바이스 파일 대신 디바이스 트리에서 확인할 수 있습니다.

Q) 그렇다면 서로 다른 디바이스 파일을 통해 open() 함수를 호출하면 디바이스 드라이버마다 각자 선언된 함수를 호출하겠네?

맞습니다. 만약 다음과 같이 디바이스 파일을 지정했다고 가정합시다.

# mknod /dev/devicefile1 c 120 1
# mknod /dev/devicefile2 c 120 2

다음에 아래와 같은 리눅스 저수준 함수를 호출하면 각각 디바이스 별로 선언된 함수가 호출됩니다.

open("/dev/devicefile1");
open("/dev/devicefile2");

덧글

댓글 입력 영역