[리눅스] sysfs 파일 시스템

[리눅스] sysfs 파일 시스템

머리말

 1. sysfs 파일 시스템

1.1 sysfs 시스템이란?

1.2 sysfs의 작동 메커니즘

sysfs의 두 가지 중요한 구조

2.1 kobject와 kset의 관계 

2.2 kobject 구조

2.3 kset 구조 


 머리말

중요한 연결 고리: 문제를 가지고 계속 전진하십시오.

  1. sysfs 파일 시스템이란 무엇입니까
  2. sysf 파일 시스템의 원리
  3. sysfs 파일 시스템의 중요한 구조입니다.

리눅스 노트 선생님을 배우는 과정에서 선생님의 강의는 간결하고 깊이 있지만 시작하려면 약간의 지식 배경이 필요합니다.여기서 나는 확장하고 요약했습니다. ---연구 노트

참조 기사 및 동영상: https://xuesong.blog.csdn.net/article/details/109522945

https://xuesong.blog.csdn.net/article/details/107724682

https://live.csdn.net/v/279734?spm=1001.2014.3001.5501

 1. sysfs 파일 시스템

1.1 sysfs 시스템이란?

sysfs는 사용자 공간 프로그램이 시스템 장치와 리소스를 보고 제어할 수 있도록 하는 커널 데이터 구조에 액세스하는 방법을 제공하는 가상 파일 시스템입니다.

sysfs 파일 시스템은 sys 파일 디렉토리 아래에 마운트되는데, sys 아래의 디렉토리와 파일을 통해 리눅스 시스템의 임베디드 장치의 시스템 상태를 명확하게 이해할 수 있다. sysfs는 시스템에 연결된 장치와 버스를 사용자 공간에서 액세스할 수 있는 계층 파일로 구성하고 커널 데이터 구조 Q와 해당 속성을 사용자 공간으로 내보냅니다.

sysfs의 목적 중 하나는 다음 그림과 같이 장치 드라이버 모델에서 구성 요소의 계층적 관계를 표시하는 것입니다.

sys 디렉토리에서 각 파일의 기능은 다음과 같습니다.

1.2 sysfs의 작동 메커니즘

sysfs는 커널 개체, 개체 특성 및 개체 간의 관계를 명시적으로 설명할 수 있는 메커니즘을 제공합니다.

  • 장치를 파일 시스템에 매핑하기 위한 커널에 대한 일련의 인터페이스.
  • 이러한 장치를 읽거나 조작하기 위한 사용자 프로그램용 인터페이스 집합입니다. 다음 그림과 같이 커널의 sysfs 요소와 사용자 공간에서의 성능을 설명합니다.

sys 아래의 디렉토리와 파일은 전체 시스템의 시스템 상태를 반영합니다. 이러한 카탈로그는 완전히 다른 장치 유형을 나타내며 전체 장치 모델을 보는 방법에 대한 다른 관점을 제공합니다. 실제 장치 정보는 devices 하위 디렉토리에 있으며 Linux 시스템의 모든 장치는 이 디렉토리에서 찾을 수 있습니다. 위의 그림과 같이 버스는 드라이버와 디바이스에 해당하고, 클래스 아래에도 다양한 디바이스 분류가 있으며, 이 또한 다양한 디바이스에 해당하며, 사실 모두 디바이스 디렉토리에 있는 디바이스 파일의 심볼릭 링크입니다.

sysfs의 두 가지 중요한 구조

2.1 kobject와 kset의 관계 

아래 그림에서 kset과 kobject 사이의 관계와 연관성을 알 수 있습니다.

2.2 kobject 구조

kobject는 장치 모델의 핵심이며 백그라운드에서 실행됩니다. 커널에 객체 지향 프로그래밍 스타일을 제공합니다.

kobject 구조는 커널의 include/linux/kobject.h에 정의되어 있으며 kobject 구조에는 일부 멤버 변수가 포함되어 있으며 그 중 name, parent, sd, kref 및 ktype이 더 중요합니다. 구체적인 구조 코드는 다음과 같습니다.

/*
name:	指向这个kobject的名称。使用kobject_set_name(struct kobject* kobj,const char * name)函数可以修改它。
entry: 简单讲就是要挂载入kset的链表。
parent:	指向此kobject父项的指针。它用于构建描述对象之间关系的层次结构。
sd:		指向struct sysfs dirent结构,它表示该结构内sysfs节点中的这个kobject。
kref:	提供kobject上的引用计数。
ktype: 	描述该对象,kset说明这个对象属于哪套(组)对象。
*/
struct kobject {
	const char		*name;
	struct list_head	entry;
	struct kobject		*parent;
	struct kset		*kset;
	struct kobj_type	*ktype;
	struct kernfs_node	*sd; /* sysfs directory entry */
	struct kref		kref;
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
	struct delayed_work	release;
#endif
	unsigned int state_initialized:1;   //初始化状态
	unsigned int state_in_sysfs:1;      //是否在sys中  
	unsigned int state_add_uevent_sent:1;
	unsigned int state_remove_uevent_sent:1;
	unsigned int uevent_suppress:1;
};

종종 kobject_create_and_add를 사용하여 디렉토리를 만들고 추가합니다. 시스템에 추가하기 전에 할당되었지만 아직 초기화되지 않은 kobject 포인터와 kobject_type 포인터를 매개변수로 사용하여 kobject_create() 함수를 사용하여 kobject를 할당해야 합니다. kobject_add() 함수는 계층 구조에 따라 기본 속성을 가진 디렉토리를 생성하는 동안 kobject를 추가하고 시스템에 연결하는 데 사용됩니다. 그 반대의 기능을 가진 함수는 kobject의 링크를 삭제하는 kobject_del()이다.

struct kobject *kobject_create(void)
{
	struct kobject *kobj;

	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
	if (!kobj)
		return NULL;

	kobject_init(kobj, &dynamic_kobj_ktype);
	return kobj;
}

struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
{
	struct kobject *kobj;
	int retval;

	kobj = kobject_create();
	if (!kobj)
		return NULL;

	retval = kobject_add(kobj, parent, "%s", name);
	if (retval) {
		printk(KERN_WARNING "%s: kobject_add error: %d\n",
		       __func__, retval);
		kobject_put(kobj);
		kobj = NULL;
	}
	return kobj;
}

2.3 kset 구조 

커널 개체 집합(kset)은 주로 관련 커널 개체를 함께 결합하며 kset은 개체 모음입니다. 

kset 구조는 또한 kobject보다 하나 더 많은 연결 목록 헤더를 가지고 있으며 하위 디렉터리 항목에 해당하는 kobject 구조 인스턴스를 연결 목록에 추가할 수 있으므로 kset은 이러한 하위 디렉터리 항목의 kobject를 탐색할 수 있습니다. 

struct kset {
	struct list_head list;    //挂载kobject结构的链表
	spinlock_t list_lock;     //保护链表访问的自旋锁
	struct kobject kobj;      //自身包含一个kobject结构  
	const struct kset_uevent_ops *uevent_ops;
} __randomize_layout;

추천

출처blog.csdn.net/weixin_42373086/article/details/130780463