Kobject 라는 놈이 뭘까...?
Sysfs를 공부하는 도중 나왔는데 도저히 이해가 안된다.
일단 sysfs는 커널영역에 디바이스들을 객체화하여 유저영역에 정보를 제공하는 가상 파일시스템이다.
여기서 디바이스들을 객체로 추상화하여 그 정보를 가지고 있는 놈이 Kobject이다.
/linux/include/linux/kobject.h 에 있는 소스를 분석하여 보자.
61 struct kobject {
62 const char *name;
63 struct list_head entry;
64 struct kobject *parent;
65 struct kset *kset;
66 struct kobj_type *ktype;
67 struct kernfs_node *sd;
68 struct kref kref;
69 #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
70 struct delayed_work release;
71 #endif
72 unsigned int state_initialized:1;
73 unsigned int state_in_sysfs:1;
74 unsigned int state_add_uevent_sent:1;
75 unsigned int state_remove_uevent_sent:1;
76 unsigned int uevent_suppress:1;
77 };
위의 소스가 kobject의 구조체를 보여주는 것이다. 봐도 전혀 이해가 되지 않는다..
그렇다면 Documentation을 확인해보자.
A kobject is an object of type struct kobject. Objects have a name and a reference count. A kobject also has a parent pointer (allowing 21 objects to be arranged into hierarchies), a specific type, and, 22 usually, a representation in the sysfs virtual filesystem.
간단하게 해석해 보면.. Kobject는 구조체 kobject 형를 가지는 객체이다. 객체는 이름과 참조 횟수를 가지고 있으며, kobject는 21개의 객체가 계층 구조로 배열할 수 있도록 부모 포인터를 가지고, 특정 유형 및 sysfs를 가상 파일 시스템에서 일반적으로 표현되어 있다고 한다.
영어 수준이 낮으니 해석도 저질이군...
위 소스를 한번 더 확인하면 아래 정도를 확인할 수 있다.
61 struct kobject {
62 const char *name; //객체이름
63 struct list_head entry; //리스트의 header
64 struct kobject *parent; //kobject의 부모
65 struct kset *kset; // ??
66 struct kobj_type *ktype; // ??
67 struct kernfs_node *sd; // ??
68 struct kref kref; // ??
69 #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
70 struct delayed_work release;
71 #endif
72 unsigned int state_initialized:1;
73 unsigned int state_in_sysfs:1;
74 unsigned int state_add_uevent_sent:1;
75 unsigned int state_remove_uevent_sent:1;
76 unsigned int uevent_suppress:1;
77 };
그렇다면 kobject들은 리스트로 이루어져있다 ! 그리고, list_head entry가 그 리스트의 header정보를 가지고 있을 것이다. 음.. 조금 이해가 되는 것 같기도 하고??
그렇다면 계속해보자. 다음 구조체 중 kset을 찾아보았다. kset 구조체는 kobject의 그룹이라고 한다.
그렇다면 kset은 수 많은 kobject를 가지고 있는 그룹이다.
이때 이 그룹내의 kobject들은 서로 동일한 유형이거나 다른 ktypes을 가진 kobject들이라는 것이다.
아래는 문서에 기록된 kset에 대한 내용이다.
A kset is a group of kobjects. These kobjects can be of the same type or belong to different ktypes. The kset is the basic container type for collections of objects. Sets contain their own kobjects, but you can safely ignore that implementation detail as the kset core code handles this kobject automatically.
여기서 또 의문점. ktype은 뭐란 말인가?
위에서 보니 kset에 포함될 수 있는 kobject는 두가지 라고 하였다.
1) 서로 동일한 유형의 kobject
2) 서로 다른 ktype을 가진 kobject
여기서 ktype은 kobject를 내장한 개체의 유형이라고 하는데.. kobject를 포함한 모든 구조는 ktype을 필요로한다. 그때 ktype은 kobject가 만들어 지거나 파괴될때 발생화는 일들을 제어한다. 무슨 말인지 이해는 잘 안되지만, 원문을 아래 보이겠다.
A ktype is the type of object that embeds a kobject. Every structure that embeds a kobject needs a corresponding type. The ktype controls what happens to the kobject when it is created and destroyed.
한번 여기서 정리해보자.
위의 그림을 보면 위에서 정리한 내용들을 어느정도 이해할 수 있을 것이다.
Kset에는 많은 kobject들이 있고 그 object의 parent는 다른 kobject를 또 가르키고 있다.
아직 이해가 확실히 되지 않는 것은 사실이지만, 어느정도 감은 잡히는? 느낌이다.
역시 리눅스 분석은.. 끝이 없다
'Linux > Kernel Analysis' 카테고리의 다른 글
[Linux Kernel] Process - Task struct(프로세스 서술자) (0) | 2014.07.06 |
---|---|
[Linux Kernel] 프로세스란? (1) | 2014.07.01 |
[Linux Kernel] 리눅스 커널 Configuring (0) | 2014.06.27 |
sysfs (0) | 2014.06.23 |
리눅스 소스 사이트 (0) | 2014.06.08 |