9/13/2015

udev 와 sysfs의 기본구조 재정리

1 기본개념 정리 

  • Hot plug (Hot swapping)
OS가 동작중 Device가 연결 및 삽입될때 재부팅 없이 이 연결된 상태를 알려주어 동작되는 시스템을 말하며, Window에서는 Plug&Play

  http://linux-hotplug.sourceforge.net/?selected=overview
  https://en.wikipedia.org/wiki/Hot_swapping
  https://linux.die.net/man/8/hotplug

  • Cold plug
OS는 Device 추가를 하려면 reboot or shutdown을 하고 인식해야하며 이런 기능을 Cold plug라고 하며, Linux 에서 init초기화  및 각 Daemon을 실행

  • Netlink 구조 및 Programming 예제
  https://en.wikipedia.org/wiki/Netlink   
  https://wiki.linuxfoundation.org/networking/generic_netlink_howto
  http://decdream.tistory.com/406
  http://iamhjoo.tistory.com/17

  • D-Bus (Desktop Bus)
SW Bus 구조를 가진 IPC를 말하며, 버스구조를 가지고 있기에 여러 프로세스가 버스를 통해 통신을 공유하는 시스템이다.

 

HW BUS 구조라고 생각하면 되지만, SW로 구현을 하려면 dbus-daemon 기반의 Server를 이용하여 각 Process는 Client가 되어 통신




상위그림은 wiki에서 가져왔으며, wiki 참조
  https://en.wikipedia.org/wiki/D-Bus
  https://dbus.freedesktop.org/doc/dbus-tutorial.html
  https://blogs.gnome.org/rodrigo/2012/03/20/netlink-based-d-bus/


  • NetworkManger 
Linux에서 사용되어지는 Daemon이며, 이는 libudev와 다른 kernel interface를 이용하며 Embedded에서는 옵션으로 생각되며,
udev의 개념을 이곳에서도 이용한다고 보면되겠으며, Linux의 Network 관련설정

아래의 설정은 SysVinit의 Shell script를 통해 설정되어짐

/etc/network/interfaces
/etc/resolv.conf 


Network Manager를 사용하다면 아래와 같이설정

/etc/NetworkManager/NetworkManager.conf


세부내용은 wiki 참고
  https://en.wikipedia.org/wiki/NetworkManager
  https://wiki.debian.org/udev

libudev를 이용하여 Netlink를 통하여, Network Manager를 걸쳐 D-BUS와 연결동작

 Kernel --> udev --> Network Manager <-->D-Bus <-->Evolution

  https://en.wikipedia.org/wiki/Udev
  https://en.wikipedia.org/wiki/HAL_(software)


1.2 udev와 sysfs의 기본동작방식 

이제 Linux에서 사용되어지는 udev와 sysfs의 기본 동작 방법에 대해 좀 알아보자
물론 Linux version 마다 동작 방식이 다를 수 있으며, Filesystem 구조에 따라 다를 수 있다
또한 Android Version의 Linux 경우 동작방식이 약간 다르지만 기본개념은 거의 동일한 것 같다.



상위 그림은  (안드로이드의 모든것 분석 포팅) 책을 보며 그렸으며, 구조를 간단히 보면 아래와 같다
  1. Interrupt 가 발생하며 이를 처리한다.
  2. kernel의 sysfs update한다 
  3. user space의 /sys 의 sysfs를 반영한다. 
  4. Kernel에서는 uevent 를 udevd로 보내어 준다. 
  5. udevd는 /sys 의 sysfs를 반영한다 
  6. /dev 에 관련 device update하여 추가한다 

udevd으로 가는 interface를 netlink interface이다


2. udev 의 기본구성 

  1. libudev :  device information을 접근을 허용해주는 library로 현재는 systemd 에서 이것을 사용하고 있다. 
  2. udevd:  user space의 damon이며 /dev를 관리를 하며, uevent를 커널에서 받는다.

systemd는 init 부분의 일종이며, 현재 init 부분이 점점 systemd로 변경되어 가고 있다.  기존의 init를 사용한다고 하면 init와 같이 사용하는 경우가 많다
앞으로 init가 많이 변경 될 것이며,  상위 Network Manger도 동일하다. 

udev의 rules을 다음 곳에서 정의한다고 한다.

$ ls /lib/udev/rules.d  // 기본설치 lib 있는 만큼 가급적 일반사용자는 수정 하지말지 말라고함
$ ls /etc/udev/rules.d // lib/udev/rule.d 부분의 link 와 유저가 추가 혹은 수정한 부분  
$ ls /run/udev/rules.d // 거의 미사용 

아래 링크를 반드시 참조 

USB Serial에서 Custom PID 사용시 
  https://unix.stackexchange.com/questions/67936/attaching-usb-serial-device-with-custom-pid-to-ttyusb0-on-embedded



2.1 udev tool 과 libudev 

  1. udevadm : 진단과 관리용으로 만들어진 Tool
  2. udevinfo: udevadm으로 통합되어 관리되어 지는 Tool
  https://linux.die.net/man/8/udevadm
  https://linux.die.net/man/8/udevinfo
  https://wiki.gentoo.org/wiki/Udev/ko
  https://wiki.archlinux.org/index.php/udev

  • libudev Reference Manual
 libudev를 이용하여 프로그래밍을 할 경우가 있다면 아래참조

  http://presbrey.scripts.mit.edu/doc/libudev/
  https://mirrors.edge.kernel.org/pub/linux/utils/kernel/hotplug/libudev/ch01.html
  https://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/libudev-udev-device.html
  https://www.freedesktop.org/software/systemd/man/libudev.html#



2. Android System의 ueventd 동작 


Android에서의 udev는 일반 Linux와의 동작이 조금 다르지만 기본개념은 유사하다고 보면될 것 같다
하지만, Android Linux Kernel은 ueventd 이 존재하며 이에 대한 정확한 이해가 필요하다.

  • Android ueventd 동작 
  https://kshokd.wordpress.com/2012/08/29/init-%EA%B3%BC%EC%A0%95%EC%97%90%EC%84%9C-uevent%EC%99%80-ueventd%EC%9D%98-%ED%99%9C%EC%9A%A9/
  http://daem0n.tistory.com/entry/Android-Kernel-3-Ueventdc
  http://blog.secmem.org/88

안드로이드의 모든것의 분석과 포팅 참조