sysfs
sysfs는 디바이스 모델에 근거한 디바이스 연결관계를 tree 형태로 user space 에서 보여주는 메모리 상에 존재하는 가상 파일 시스템이다. sysfs의 주요 목적은 사용자 프로그램이 커널의 장치 모델과 상호 작용하고, 장치 정보를 쿼리하고, 때때로 장치의 속성을 수정할 수 있도록 해주는 것이다. 보통 sysfs 는 /sys 디렉토리에 마운트 된다.
sysfs에 대하여 파악하기 위해선 kobject 를 알아야 한다. kobject 는 객체지향언어에서 사용하는 object calass 와 비슷한 개념의 모델로서 커널 내의 여러 구성 요소 간의 관계를 모델링하는 데 사용되며, 커널의 객체들을 sysfs 가상 파일 시스템을 통해 사용자 공간에 노출하기 위한 메커니즘을 제공한다. 이는 참조횟수, 이름, 부모포인터, 객체계층구조 생성 등과 같은 기본 기능 또한 제공한다.
즉, kobject 는 커널의 객체 계층 구조에서 객체를 표현하고 관리하는 데 사용되는 Linux 커널의 기본 데이터 구조이며,이는 표준화된 파일 기반 인터페이스를 통해 커널 객체 및 해당 속성을 사용자 공간에 노출하는 sysfs 가상 파일 시스템과 밀접하게 연관되어 있다.
sysfs, kobject, device class, udev는 모두 디바이스 모델의 관련 요소이다.
sysfs 에선 kernerl object 는 하나의 디렉토리로 표현되고, object 속성은 하나의 파일로 표현되며, obejct 간의 관계는 symbolic links 로 표현된다.
응용프로그램은 /dev 디렉토리에 있는 노드로 디바이스에 명령을 내리며, /sys 디렉토리에 있는 노드로부터 디바이스 정보를 얻는다.
- /sys/devices: 이 디렉터리에는 버스, 컨트롤러 및 개별 디바이스별로 구성된 시스템에 존재하는 디바이스의 계층 구조가 포함되어 있습니다.
- /sys/bus: 이 디렉토리에는 시스템에 존재하는 각 버스 유형(예: USB, PCI)에 대한 하위 디렉터리와 각 버스와 연결된 장치 및 드라이버에 대한 정보가 포함되어 있습니다.
- /sys/class: 이 디렉토리에는 다양한 장치 클래스(예: 입력, 네트워크, 사운드)에 대한 하위 디렉터리와 각 클래스의 장치에 대한 심볼릭 링크가 포함되어 있습니다.
- /sys/block: 이 디렉터리에는 시스템의 각 블록 장치(예: 하드 드라이브, CD-ROM 드라이브)에 대한 하위 디렉터리와 관련 속성이 포함되어 있습니다.
sysfs는 다양한 장치 속성을 읽기 및/또는 쓰기 가능한 파일로 표시하며, 표준 파일 작업을 사용하여 액세스할 수 있다.
이전 디바이스 드라이버에서 살펴본 cdev_alloc(), cdev_init(), cdev_add() 함수 또한 디바이스 드라이버를 sysfs에 등록하는 동작이라고 볼 수 있다. 디바이스 드라이버에서 class_device_create() 함수를 사용하면 /dev 디렉토리와 /sys 디렉토리에 파일들이 생성된다.
sysfs 의 주요 구성 요소 kobject 에 대하여 더 자세히 알아보자
kobject
kobject는 이와같이 구성되어 있으며, reference counting, sysfs represntation, represinting relationships between device, hotplug event handling 등의 역할을 수행한다.
위 이미지에서 회색 네모 영역은 kset 을 의미한다. kobject 는 kset 에 속할 수 있으며(null 일 수도 있다) child list 를 갖는다. 각각의 kobject 는 parent 를 포인팅 하는데, 만약 kset 이 null 이라면 보통 parent 는 자기 자신을 가르키고 있다. (항상 그런 것은 아니다)
디바이스 드라이버 동작의 주요 구성 요소인 cdev 역시 마찬가지로 kobject 를 포함한다.
디바이스, 디바이스 드라이버, 모듈, 클래스, 버스타입 모두 kobject 를 가지며 이를 통해 다른 객체들과의 관계를 모델링 할 수 있다.
udev
udev 는 /dev 디렉토리에서 디바이스 노드의 동적 생성 및 제거를 처리하는 리눅스 커널용 디바이스 매니저이며, 일종의 데몬 프로그램이다. 하드웨어 장치를 감지 및 관리하고, 구성하며, /dev 파일 시스템에 해당 장치 노드를 생성하여 유저 프로그램이 장치와 상호 작용할 수 있도록 한다.
udev와 sysfs의 관계는 리눅스 시스템에서 디바이스를 관리하고 구성하는데 필수적이다. sysfs는 위에서 살펴보았듯 커널의 내부 객체 계층 구조를 유저 스페이스에 표시하여 디바이스, 다바이스 드라이버 및 기타 커널 구성 요소에 대한 정보를 노출하는 가상 파일 시스템이다. 새 디바이스가 감지되면 커널은 해당 kobject 를 생성하고, 이 kobject 는 sysfs에서 디렉터리로 표시되며 해당 디렉터리 내의 파일 속성이 표시된다.
udev는 sysfs 파일 시스템을 모니터링하여 장치의 추가 또는 제거와 같은 kobject 계층 구조의 변경 사항을 감지한다. 디바이스 관련 이벤트가 발생하면 udev 는 커널로부터 알림을 수신하고, sysfs에서 사용 가능한 정보를 사용하여 /dev에 디바이스 노드를 만들거나 제거한다.
'Linux kernel' 카테고리의 다른 글
[Interrupt] Top half & bottom half (1) | 2023.04.27 |
---|---|
Dynamic Timer (0) | 2023.04.19 |
Device Driver (0) | 2023.04.14 |
virtual file system (VFS) (0) | 2023.04.09 |