Kernel - Device File 과 Udev 이해

숲사람·2022년 3월 24일
0

Linux Kernel

목록 보기
3/10

Device File

https://en.wikipedia.org/wiki/Device_file

UNIX 계열의 운영체제에서 device file은 유저 응용프로그램이 device driver 다루기 위한 인터페이스 역할을하는 특수파일이다. 디바이스 파일은 파일시스템의 /dev/ 에 존재한다. 정확히 말하면 /dev 에 mount된다.

컴퓨터의 물리적인 장치를 구동하기 위해서는 해당 장치에 대한 동작을 구현한 소프트웨어를 작성해야하는데 이것을 device driver라고 부른다. 운영체제를 이해하는 중요한 컨셉중 하나가 메모리가 커널영역과 유저영역으로 분리되어있다는 것이다. 유저의 응용프로그램은 커널영역에 접근할 수 없다. 디바이스 드라이버는 커널영역에서 동작하기 때문에, 유저영역의 응용프로그램은 접근할 수 없다. 따라서 device driver는 제어하기 위해 device file이라는 접점을 제공하는 것이다. 실제로 장치를 만드는 H/W업체는 device driver 까지 제작해야하며, 해당 device driver 리눅스 커널 메인라인 소스코드 drivers/ 경로내에 반영되어있을 것이다.

부팅이후, 모든 디바이스 파일을 /dev 내에 수동으로 생성하는것은 매우 귀찮은일 일것이다. 또한 USB 장치 처럼 컴퓨터가 동작하는 도중에 장치가 삽입되거나 제거될 수 있다. 이를 위해 UNIX 운영체제들은 자동으로 장치를 찾고 /dev 에 mount하는 시스템을 가지고 있는데, 그중 하나가 devfs이다. FreeBSD, MacOS 그리고 Darwin 등의 UNIX운영체제는 devfs 시스템을 사용한다. Linux 또한 마찬가지로 devfs를 사용했었는데 커널버전 2.6.17 이후로 udev 라는 시스템을 사용한다. 하지만 리눅스 커널을 사용하는 운영체제 (리눅스 배포판, 안드로이드 등)가 모두 udev를 사용하는 것은 아니다.

나는 디바이스 드라이버에 대한 글은 정말 많이 봤지만 디바이스 파일에 집중하는 글은 거의 본적이 없는것같다. 그러나 우리가 디바이스 드리이버보다 디바이스 파일을 더 관심을 가지고 더 공부해야 한다고 생각한다. HW를 다루지 않는이상 디바이스 드라이버를 새로 작성할일은 그리 많지 않다. 반면에 우리가 UNIX 응용프로그램을 작성할때 디바이스 파일을 제어할 일은 훨씬 많다.

The device driver uses the minor number  to distinguish individual physical or logical devices.


Udev

udev데몬이 kernel(driver) 로 부터 받는 이벤트. udevd 가 실제로 드라이버에 해당하는 /dev/ 아래 디바이스파일을 생성하기때문에 중요. udev는 유저 space의 응용프로그램이다.

  1. 커널에서 디바이스가 detect되면 sysfs에 등록이 되고 유져공간의 /sys/ 아래 노드생성됨.
  2. 그뒤 커널은 udevd 에 uevent를 날리고
  1. udevd가 /sys/의 파일을 참고하여 /dev/에 디바이스 파일 생성.

[아래 내용 출처] Udev|작성자 get fresh

Udev?
A Userspace Implementation of devfs

실제로 존재하는 device에 대한 file node생성을 자동으로 하도록 구성
/dev/ 디렉터리에 장치 노드 파일을 생성하거나 제거

Run in Userspace

- 유저 공간에서 동작, hotplus와 sysfs를 이용.
- 장치가 시스템에 추가되거나 제거되면 hotplug에 의해 udev가 호출.
- udev는 hotplug 이벤트를 받아 sysfs에서 필요한 정보를 얻어 /dev/ 장치파일을 생성

init 실행시 device node 생성하는 내용.

- /sbin/init process가 /etc/inittab로딩하고 각 script 실행.
- sysfs가 /sys로 마운트
- udev daemon이 동작
- 데몬이 실행된 후 시스템에서 device node 생성.
  - 실제 디바이스가 detect되면 sysfs에 등록이 되고 유저 영역에서는 /sys에 등록.
  - udev 데몬으로 netlink socket을 이용하여 새 device 생성 되었다는 메시지 전송
  - /sys의 디바이스 내용 이용해서 /dev에 device node 생성
  - sysfs에 등록이 되어야만 device node 생성이 가능 (device model 방식으로 device driver를 작성해야 가능함)

Kernel영역과 User영역이 통신하는 방법

The answer is the various IPC methods that exist between kernel and user space, such as system call, ioctl, proc filesystem or netlink socket.

출처: https://www.linuxjournal.com/article/7356

proc file system

관련해서는 내가 정리해놓은 문서가 있음.
https://velog.io/@soopsaram/Kernel-proc-%EC%97%90-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1%ED%95%98%EA%B3%A0-%EC%9D%BD%EA%B3%A0-%EC%93%B0%EA%B8%B0

Netlink socket is a special IPC used for transferring information between kernel and user-space processes. It provides a full-duplex communication link between the two by way of standard socket APIs for user-space processes and a special kernel API for kernel modules.

user 영역에서 응용프로그램들이 통신하는 방법

전통전 유닉스 리눅스 IPC 메커니즘(리눅스/유닉스 응용프로그램간의 통신 방법)들.

profile
기록 & 정리 아카이브 용도 (보다 완성된 글은 http://soopsaram.com/documentudy)

0개의 댓글