달력

3

« 2025/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'OS이야기'에 해당되는 글 86

  1. 2011.11.01 kobject 1
2011. 11. 1. 20:47

kobject OS이야기2011. 11. 1. 20:47

http://kkangstory.tistory.com/entry/LDD 정리 굳!

<linux/kobject.h>에 정의된 struct kobject 구조체로 표현된다. kobject는 C#이나 자바 등에 있는 Object 클래스와 유사하다. 즉, kobject는 객체의 위계구조를 만들기 위해 필요한 참조 카운팅이나 클래스 이름, 부모 포인터 등의 기본 기능을 제공한다.

  60struct kobject {
  61        const char              *name;
  62        struct list_head        entry;
  63        struct kobject          *parent;
  64        struct kset             *kset;
  65        struct kobj_type        *ktype;
  66        struct sysfs_dirent     *sd;
  67        struct kref             kref;
  68        unsigned int state_initialized:1;
  69        unsigned int state_in_sysfs:1;
  70        unsigned int state_add_uevent_sent:1;
  71        unsigned int state_remove_uevent_sent:1;
  72        unsigned int uevent_suppress:1;
  73};

name포인터는 이 kobject의 이름을 가리킨다. parent 포인터는 현재 kobject의 부모를 가리킨다. 이런 식으로 kobject들은 커널 안에서 객체 위계구조를 만들어 다양한 객체간의 관계를 표현할 수 있다. 곧 알게 되겠지만, 사실 이것이 sysfs의 모든 것이다. 즉 sysfs는 커널 안에 있는 kobject의 위계구조를 표현하는 유저공간 파일시스템에 불과하다.

dentry포인터는 kobject가 sysfs에서 나타나는 경우 sysfs에서의 kobject를 표현하는 dentry구조체를 가리킨다.
kref, ktype, kset멤버들은 kobject를 지워ㅓㄴ하기 위해 사용된다. 또한 entry멤버는 kset과 함께 사용되는데, 이들의 구조와 사용처에 대해서는 잠시  후에 다룬다.

kobj를 멤버로 갖는 struct cdev와 같은 구조체가 더 중요한 경우가 많다.
http://lxr.linux.no/linux+v3.1/include/linux/cdev.h#L12

  12struct cdev {
  13        struct kobject kobj;
  14        struct module *owner;
  15        const struct file_operations *ops;
  16        struct list_head list;
  17        dev_t dev;
  18        unsigned int count;
  19};

kobject가 다른 구조체에 포함되는 경우에 이 구조체들은 kobject가 제공하는 표준 함수들을 사용할 수 있게 된다. 더욱이  중요한 것은 kobject를 포함하는 구조체들은 객체 위계구조의 일부분이 될 수 있다는 점이다. 예를들어 cdev구조체는 객체 위계구조에서 부모 포인터는 cdev->kobj->parent로, 리스트는 cdev->kobj->entry로 표현 가능하다.


ktype
kobject는 ktype이라는 특별한 자료형과 연관되어 있다. ktype은 <linux/kobject.h>에 정의된 struct kobj_type구조체로 표현된다.
http://lxr.linux.no/linux+v3.1/include/linux/kobject.h#L110
 110struct kobj_type {
 111        void (*release)(struct kobject *kobj);
 112        const struct sysfs_ops *sysfs_ops;
 113        struct attribute **default_attrs;
 114        const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
 115        const void *(*namespace)(struct kobject *kobj); 
 116};
 

release 포인터는 kobject의 참조 카운터가 0이 됐을 겨웅 호출되는 분해담당을 가리킨다. 분해 담당 함수는 kobject와 관련된 모든 메모리를 해제할 책임을 갖는다. 
sysfs_ops 포인터는 sysfs_ops 구조체를 가리킨다. 이 구조체는 sysfs 파일의 읽기/쓰기 동작에 대해 기술한다.
default_attrs 포인터는 attribute 구조체 배열을 가리킨다. 이 구조체들은 이 kobject와 관련된 기본 어트리뷰트를 정의하는데 사용된다. 어트리뷰트란 주어진 객체의 속성을 나타낸다. 만약 kobject가 sysfs로 익스포트된 경우 어트리뷰트는 파일로 익스포트된다. 또한 배열의 마지막 요소는 반드시 NULL이어야 한다.

kset
kset은 kobject의 집합이다. kset은 "모든 블록 디바이스"와 같이 서로 연관된 kobject를 하나로 모을 수 있는 기본 컨테이너를 제공한다. kset은 ktype과 유사하므로, "왜 두개다 필요하지?"라고 생각할수 있다. 하지만 kset은 kobject를 집합으로 묶는 역할을 하고, ktype은 연관된 형태의 kobject들의 공통 속성을 기술하는 역할을 한다는 점에서 다르다. 이러하나 차이점으로 인해 같은 ktype을 갖는 kobject들이 서로 다른 kset에 속할 수 있는 것이다.

kset 포인터는 kobject와 연관된 kset을 가리킨다.
kset은 <linux/kobject.h>에 정의된 kobject구조체에 의해 표현된다.
http://lxr.linux.no/linux+v3.1/include/linux/kobject.h#L161

 161struct kset {
 162        struct list_head list;
 163        spinlock_t list_lock;
 164        struct kobject kobj;
 165        const struct kset_uevent_ops *uevent_ops;
 166};

list는 이 kset에 들어있는 모든 kobject의 연결 리스트이다. kobj는 이 집합을 나타내는 기본 kobject를 나타내며, hotplug_ops는 이 kset에 있는 kobject들의 핫플러깅 동작을 기술하는 구조체를 가리킨다.(바뀌엇넹???)




 

'OS이야기' 카테고리의 다른 글

리눅스 커널 소스 디렉토리구조  (0) 2011.11.02
하위시스템  (0) 2011.11.01
익스포트된 심볼들  (0) 2011.11.01
모듈 매개변수  (0) 2011.11.01
랩탑모드  (0) 2011.11.01
:
Posted by НooпeУ


Code Start Code End