デバイスファイルとUdevについて


Device File


https://en.wikipedia.org/wiki/Device_file
UNIXシリーズオペレーティングシステムでは、デバイスファイルは、ユーザアプリケーションがデバイスドライバのインタフェースを処理するための特殊なファイルである.デバイスファイルはファイルシステムの/dev/に存在します.正確には/devにマウントされます.
コンピュータ上の物理デバイスを駆動するためには、デバイスドライバと呼ばれるデバイスの動作を実現するためのソフトウェアを記述する必要がある.オペレーティングシステムを理解する重要な概念の一つは、メモリがカーネル領域とユーザー領域に分かれていることです.ユーザーのアプリケーションはカーネル領域にアクセスできません.デバイスドライバはカーネル領域で動作するため、ユーザー領域のアプリケーションにアクセスできません.従って、device driverは、devicefileと呼ばれる切り込み点を提供して制御する.実際には、デバイスを作成するH/W社は、デバイスドライバを作成し、対応するデバイスドライバLinuxカーネルの主線ソースドライバ/パスに反映する必要もあります.
起動後、/dev内にすべてのデバイスファイルを手動で作成するのは面倒です.また、デバイスはUSBデバイスのようにコンピュータの動作中に挿入または削除することもできます.このため、UNIXオペレーティングシステムは、デバイスを自動的に検索して/devにマウントするシステムを有し、そのうちの1つのシステムはdevfsである.FreeBSD、MacOS、DarwinなどのUNIXオペレーティングシステムはdevfsシステムを使用します.Linuxもdevfsを使用しており、カーネルバージョン2.6.17からudevというシステムを使用しています.ただし、Linuxカーネルを使用するオペレーティングシステム(Linuxリリース版、Androidなど)はudevをすべて使用しているわけではありません.
デバイスドライバに関する記事をたくさん見ましたが、デバイスファイルに注目する記事は少ないようです.しかし、デバイスリーダーではなく、デバイスファイルにもっと注目すべきだと思います.ハードウェアに関係しない限り、新しいデバイスドライバを作成する作業は多くありません.逆に、UNIXアプリケーションを作成する場合、制御デバイスファイルの作業はずっと多くなります.
  • major number, minor number
    https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch03s02.html#:~:text=The%20kernel%20uses%20the%20major,it%20along%20to%20the%20driver .
  • The device driver uses the minor number  to distinguish individual physical or logical devices.
  • /devの履歴はよく説明されている.
    https://www.linuxfromscratch.org/lfs/view/7.7-systemd/chapter07/udev.html
  • Udev


    udevデーモンプロセスがkernel(driver)から受信したイベント.重要なのは、udevdが実際にドライバに/dev/以下のデバイスファイルを作成することです.udevはユーザ空間のアプリケーションです.
  • カーネルがデバイスを検出するとsysfsに登録され、予約領域に/sys/以下のノードが作成されます.
  • ポストカーネルudevdへuevent
  • を送信
  • driverのueventはkernelnetlink socketを介してユーザ領域に渡される.( https://documentation.suse.com/ko-kr/sles/12-SP5/html/SLES-all/cha-udev.html#sec-udev-kernel )
  • 参照としてudevdにueventを送信する関数はkoobject uevent(&dev->kobj,KOBJ ADD);もしそうであれば、netlinkソケット関数netlink broadcast()を内部から呼び出します.( https://github.com/jihuun/devenv/blob/master/documentudy/kernel-dig/kernel-study/driver_model/uevent.md )
  • netlink socketの使用理由は以下の通り.
  • 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


    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領域で通信する方法


    従来のUNIX Linux IPCメカニズム(Linux/UNIXアプリケーション間の通信方法).
  • Binder->androidで使用
  • D-BUS->モダンLinux(unix)使用
    D-Busおすすめブログ.次の文章を読みます.
    https://www.kernelpanic.kr/22?category=923638