목차
1. 개요" >1. 개요
2. 데이터 구조 설명" >2. 데이터 구조 설명
2.1 구조체 클래스" >2.1 구조체 클래스
2.2 구조체 클래스_인터페이스" >2.2 구조체 클래스_인터페이스
3. 功能及内部逻辑解析" >3. 功能及内部逻辑解析
3.1 class的功能" >3.1 class的功能
3.2 class的注册" >3.2 class的注册
3.3 기기 등록 중 수업 관련 작업" >3.3 기기 등록 중 수업 관련 작업
4. 결론" >4. 결론
시스템 튜토리얼 리눅스 Linux 장치 모델에 대한 자세한 설명(7)_클래스

Linux 장치 모델에 대한 자세한 설명(7)_클래스

Feb 13, 2024 pm 10:39 PM
linux 리눅스 튜토리얼 리눅스 시스템 리눅스 명령 쉘 스크립트 overflow 임베디드리눅스 리눅스 시작하기 리눅스 학습

1. 개요

장치 모델에서 버스, 장치, 장치 드라이버 등은 모두 실제 사물에 해당하고 모든 논리가 이러한 엔터티를 중심으로 돌아가기 때문에 상대적으로 이해하기 쉽습니다. 다만, 본 글에서 설명하는 클래스는 가상 클래스이므로 장치의 공통성을 추상화하기 위해 다소 차이가 있다.

Linux 장치 모델에 대한 자세한 설명(7)_클래스

예를 들어, 비슷한 나이대에 비슷한 지식이 필요한 사람들이 모여서 공부한다면, 그들은 반을 형성합니다. 이 클래스는 고유한 이름(예: "295")을 가질 수 있지만 이를 구성하는 학생(장치)이 없으면 의미가 없습니다. 또한, 클래스의 존재의 가장 큰 의미는 무엇입니까? 모든 강좌는 선생님이 진행합니다! 교사는 한 번만 말하면 되기 때문에 수업에 참여하는 학생들은 그 내용을 들을 수 있습니다. 모든 학생이 집에서 공부한다면 각 학생마다 교사를 고용하여 이런 식으로 가르칠 것입니다. 대부분의 내용이 동일해서 엄청난 낭비입니다.

장치 모델의 클래스는 유사한 기능을 제공합니다. 예를 들어 일부 유사한 장치(학생)는 사용자 공간에 유사한 인터페이스(강의)를 제공해야 합니다. 각 장치 드라이버를 한 번만 구현해야 한다면 커널에 많은 양의 중복 코드가 발생하게 되어 엄청난 낭비가 됩니다. 그래서 Class는 "사용 방법을 알고 있는 한 구현을 도와드리겠습니다."라고 말했습니다.

기기 모델의 클래스 기능입니다. 커널 설명과 결합하면 클래스는 낮은 수준의 구현 세부 정보(include/linux/device.h line326)를 추상화하는 장치의 상위 수준 보기이므로 이해하기 쉽습니다.

2. 데이터 구조 설명

2.1 구조체 클래스

struct 클래스는 클래스의 추상화이며 정의는 다음과 같습니다.

으아아아

사실 구조체 클래스와 구조체 버스는 매우 유사하며 다음과 같이 설명됩니다.

name, 클래스 이름은 "/sys/class/" 디렉터리에 반영됩니다.

이 클래스의 기본 속성인 class_atrrs는 클래스가 커널에 등록되면 "/sys/class/xxx_class" 아래에 해당 속성 파일을 자동으로 생성합니다.

dev_attrs, 이 클래스에 속한 각 장치의 속성은 장치가 커널에 등록될 때 장치의 sysfs 디렉터리에 해당 속성 파일을 자동으로 생성합니다.

dev_bin_attrs는 dev_attrs와 유사하며 바이너리 유형 속성일 뿐입니다.

dev_kobj는 이 클래스 아래의 장치가 /sys/dev/ 아래의 디렉터리에 있음을 의미합니다. 현재 일반적으로 char 및 block의 두 가지 유형이 있습니다. dev_kobj가 NULL이면 기본적으로 char가 선택됩니다.

dev_uevent, 이 클래스 아래의 장치가 변경되면 해당 클래스의 uevent 콜백 함수가 호출됩니다.

class_release, 릴리스 자체에 사용되는 콜백 함수입니다.

dev_release, 릴리스 클래스 내의 장치에 대한 콜백 함수로 사용됩니다. device_release 인터페이스에서는 릴리스 인터페이스가 등록되어 있는지 확인하기 위해 Device, Device Type 및 Device가 위치한 클래스를 검사합니다. 등록된 경우 해당 릴리스 인터페이스를 호출하여 장치 포인터를 해제합니다.

p, "Linux Device Model (6)_Bus"의 버스 구조체 구조와 동일하므로 다시 설명하지 않겠습니다.

2.2 구조체 클래스_인터페이스

struct class_interface는 클래스 아래에 장치가 추가되거나 제거될 때 클래스 드라이버가 미리 설정된 콜백 함수(add_dev 및 제거_dev)를 호출할 수 있도록 하는 구조입니다. 그럼 그들에게 전화해서 무엇을 합니까? 원하는 것은 무엇이든(예: 장치 이름 변경) 수행할 수 있으며 이는 특정 클래스 드라이버에 의해 구현됩니다.

구조는 다음과 같이 정의됩니다:

   1: /* include/linux/device.h, line 434 */
   2: struct class_interface {
   3:         struct list_head        node;
   4:         struct class            *class;
   5:  
   6:         int (*add_dev)          (struct device *, struct class_interface *);
   7:         void (*remove_dev)      (struct device *, struct class_interface *);
   8: };
로그인 후 복사

3. 功能及内部逻辑解析

3.1 class的功能

看完上面的东西,蜗蜗依旧糊里糊涂的,class到底提供了什么功能?怎么使用呢?让我们先看一下现有Linux系统中有关class的状况(这里以input class为例):

root@android:/ # ls /sys/class/input/ -l
lrwxrwxrwx root root 2014-04-23 03:39 event0 -> ../../devices/platform/i2c-gpio.17/i2c-17/17-0066/max77693-muic/input/input0/event0
lrwxrwxrwx root root 2014-04-23 03:39 event1 -> ../../devices/platform/gpio-keys.0/input/input1/event1
lrwxrwxrwx root root 2014-04-23 03:39 event10 -> ../../devices/virtual/input/input10/event10
lrwxrwxrwx root root 2014-04-23 03:39 event2 -> ../../devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2

lrwxrwxrwx root root 2014-04-23 03:39 event8 -> ../../devices/platform/soc-audio/sound/card0/input8/event8
lrwxrwxrwx root root 2014-04-23 03:39 event9 -> ../../devices/platform/i2c-gpio.8/i2c-8/8-0020/input/input9/event9
lrwxrwxrwx root root 2014-04-23 03:39 input0 -> ../../devices/platform/i2c-gpio.17/i2c-17/17-0066/max77693-muic/input/input0

lrwxrwxrwx root root 2014-04-23 03:39 mice -> ../../devices/virtual/input/mice

root@android:/ # ls /sys/devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2/ -l

-r–r–r– root root 4096 2014-04-23 04:08 dev
lrwxrwxrwx root root 2014-04-23 04:08 device -> ../../input2
drwxr-xr-x root root 2014-04-23 04:08 power
lrwxrwxrwx root root 2014-04-23 04:08 subsystem -> ../../../../../../../../class/input
-rw-r–r– root root 4096 2014-04-23 04:08 uevent

root@android:/ # ls /sys/devices/virtual/input/mice/ -l
-r–r–r– root root 4096 2014-04-23 03:57 dev
drwxr-xr-x root root 2014-04-23 03:57 power
lrwxrwxrwx root root 2014-04-23 03:57 subsystem -> ../../../../class/input
-rw-r–r– root root 4096 2014-04-23 03:57 uevent

看上面的例子,发现input class也没做什么实实在在的事儿,它(input class)的功能,仅仅是:

  • 在/sys/class/目录下,创建一个本class的目录(input)
  • 在本目录下,创建每一个属于该class的设备的符号链接(如,把“sys/devices/platform/s3c2440-i2c.3/i2c-3/3-0048/input/input2/event2”设备链接到”/sys/class/input/event2”),这样就可以在本class目录下,访问该设备的所有特性(即attribute)
  • 另外,device在sysfs的目录下,也会创建一个subsystem的符号链接,链接到本class的目录

算了,我们还是先分析一下Class的核心逻辑都做了哪些事情,至于class到底有什么用处,可以在后续具体的子系统里面(如input子系统),更为细致的探讨。

3.2 class的注册

class的注册,是由__class_register接口(它的实现位于”drivers/base/class.c, line 609″)实现的,它的处理逻辑和bus的注册类似,主要包括:

  • 클래스 구조에서 struct subsys_private 유형 포인터(cp)에 공간을 할당하고 cp->subsys.kobj.kset, cp->subsys.kobj.ktype 등을 포함하여 그 안의 필드를 초기화합니다.
  • kset_register를 호출하여 클래스를 등록합니다("Linux Device Model (6)_Bus"의 설명을 기억하세요. 클래스는 하위 시스템이므로 클래스 등록도 등록 하위 시스템입니다). 프로세스가 완료되면 /sys/class/ 디렉터리에 클래스(서브시스템)에 해당하는 디렉터리가 생성됩니다
  • add_class_attrs 인터페이스를 호출하여 클래스 구조의 class_attrs 포인터가 가리키는 속성을 커널에 추가합니다. 실행 후에는 /sys/class/xxx_class/ 디렉터리
  • 에서 이러한 속성에 해당하는 파일을 볼 수 있습니다.

3.3 기기 등록 중 수업 관련 작업

"Linux 장치 모델(5)_device 및 장치 드라이버"에서 우리는 struct device와 struct device_driver라는 두 가지 데이터 구조에 대해 이야기했습니다. struct 장치 구조에는 구조체 클래스 포인터가 포함됩니다(이것은 클래스가 장치 A라는 측면에서 보여줍니다). 심지어 클래스의 컬렉션은 장치의 드라이버가 될 수도 있습니다). 클래스 드라이버가 커널에 클래스를 등록할 때 클래스에 대한 자체 클래스 포인터를 가리켜 클래스의 장치를 사용해야 합니다. 커널은 장치를 등록할 때 나머지를 처리합니다.

이 섹션에서는 장치 등록 시 수업 관련 작업에 대해 설명합니다.

장치 등록은 궁극적으로 device_add 인터페이스(drivers/base/core.c)에 의해 구현됩니다. 이 인터페이스의 클래스 관련 작업은 다음과 같습니다.

  • device_add_class_symlinks 인터페이스를 호출하여 섹션 3.1에 설명된 다양한 심볼릭 링크를 생성합니다. 즉, 해당 클래스의 디렉터리에서 장치를 가리키는 심볼릭 링크를 생성하고, 해당 클래스를 가리키는 subsystem이라는 심볼릭 링크를 생성합니다. 해당 수업 디렉토리
  • 클래스에 지정된 속성을 추가하려면 device_add_attrs를 호출하세요(class->dev_attrs)
  • 해당 클래스에 해당하는 add_dev 콜백 함수가 있으면 콜백 함수를 호출하세요

4. 결론

사실 이 글이 끝난 후에도 Wowo는 커널에서 클래스가 어떻게 사용되는지 아직 파악하지 못했습니다. 그러나 이는 중요하지 않습니다. 하위 시스템(예: 입력 하위 시스템, RTC 하위 시스템 등)에 대한 후속 분석에서는 클래스의 많은 사용 사례를 볼 수 있습니다. 때가 되면 우리가 되돌아보고 요약하면 매우 분명해질 것입니다.

위 내용은 Linux 장치 모델에 대한 자세한 설명(7)_클래스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

DeepSeek 웹 버전 입구 DeepSeek 공식 웹 사이트 입구 DeepSeek 웹 버전 입구 DeepSeek 공식 웹 사이트 입구 Feb 19, 2025 pm 04:54 PM

DeepSeek은 웹 버전과 공식 웹 사이트의 두 가지 액세스 방법을 제공하는 강력한 지능형 검색 및 분석 도구입니다. 웹 버전은 편리하고 효율적이며 설치없이 사용할 수 있습니다. 개인이든 회사 사용자이든, DeepSeek를 통해 대규모 데이터를 쉽게 얻고 분석하여 업무 효율성을 향상시키고 의사 결정을 지원하며 혁신을 촉진 할 수 있습니다.

DeepSeek을 설치하는 방법 DeepSeek을 설치하는 방법 Feb 19, 2025 pm 05:48 PM

Docker 컨테이너를 사용하여 사전 컴파일 된 패키지 (Windows 사용자의 경우)를 사용하여 소스 (숙련 된 개발자)를 컴파일하는 것을 포함하여 DeepSeek를 설치하는 방법에는 여러 가지가 있습니다. 공식 문서는 신중하게 문서를 작성하고 불필요한 문제를 피하기 위해 완전히 준비합니다.

Bitget 공식 웹 사이트 설치 (2025 초보자 안내서) Bitget 공식 웹 사이트 설치 (2025 초보자 안내서) Feb 21, 2025 pm 08:42 PM

Bitget은 스팟 거래, 계약 거래 및 파생 상품을 포함한 다양한 거래 서비스를 제공하는 Cryptocurrency 교환입니다. 2018 년에 설립 된이 교환은 싱가포르에 본사를두고 있으며 사용자에게 안전하고 안정적인 거래 플랫폼을 제공하기 위해 노력하고 있습니다. Bitget은 BTC/USDT, ETH/USDT 및 XRP/USDT를 포함한 다양한 거래 쌍을 제공합니다. 또한 Exchange는 보안 및 유동성으로 유명하며 프리미엄 주문 유형, 레버리지 거래 및 24/7 고객 지원과 같은 다양한 기능을 제공합니다.

Ouyi OKX 설치 패키지가 직접 포함되어 있습니다 Ouyi OKX 설치 패키지가 직접 포함되어 있습니다 Feb 21, 2025 pm 08:00 PM

세계 최고의 디지털 자산 거래소 인 Ouyi Okx는 이제 안전하고 편리한 거래 경험을 제공하기 위해 공식 설치 패키지를 시작했습니다. OUYI의 OKX 설치 패키지는 브라우저를 통해 액세스 할 필요가 없습니다. 설치 프로세스는 간단하고 이해하기 쉽습니다. 사용자는 최신 버전의 설치 패키지를 다운로드하고 설치를 단계별로 완료하면됩니다.

Gate.io 설치 패키지를 무료로 받으십시오 Gate.io 설치 패키지를 무료로 받으십시오 Feb 21, 2025 pm 08:21 PM

Gate.io는 사용자가 설치 패키지를 다운로드하여 장치에 설치하여 사용할 수있는 인기있는 cryptocurrency 교환입니다. 설치 패키지를 얻는 단계는 다음과 같습니다. Gate.io의 공식 웹 사이트를 방문하고 "다운로드"를 클릭하고 해당 운영 체제 (Windows, Mac 또는 Linux)를 선택하고 컴퓨터에 설치 패키지를 다운로드하십시오. 설치 중에 항 바이러스 소프트웨어 또는 방화벽을 일시적으로 비활성화하여 원활한 설치를 보장하는 것이 좋습니다. 완료 후 사용자는 GATE.IO 계정을 만들려면 사용을 시작해야합니다.

Ouyi Exchange 다운로드 공식 포털 Ouyi Exchange 다운로드 공식 포털 Feb 21, 2025 pm 07:51 PM

OKX라고도하는 Ouyi는 세계 최고의 암호 화폐 거래 플랫폼입니다. 이 기사는 OUYI의 공식 설치 패키지 용 다운로드 포털을 제공하여 사용자가 다른 장치에 OUYI 클라이언트를 설치할 수 있도록합니다. 이 설치 패키지는 Windows, Mac, Android 및 iOS 시스템을 지원합니다. 설치가 완료되면 사용자는 OUYI 계정에 등록하거나 로그인하고 암호 화폐 거래를 시작하며 플랫폼에서 제공하는 기타 서비스를 즐길 수 있습니다.

Gate.io 공식 웹 사이트 등록 설치 패키지 링크 Gate.io 공식 웹 사이트 등록 설치 패키지 링크 Feb 21, 2025 pm 08:15 PM

Gate.io는 광범위한 토큰 선택, 낮은 거래 수수료 및 사용자 친화적 인 인터페이스로 유명한 호평을받는 암호 화폐 거래 플랫폼입니다. Gate.io는 고급 보안 기능과 우수한 고객 서비스를 통해 트레이더에게 신뢰할 수 있고 편리한 암호 화폐 거래 환경을 제공합니다. Gate.io에 가입하려면 제공된 링크를 클릭하여 공식 등록 설치 패키지를 다운로드하여 Cryptocurrency 거래 여정을 시작하십시오.

우분투에서 nginx와 함께 phpmyadmin을 설치하는 방법은 무엇입니까? 우분투에서 nginx와 함께 phpmyadmin을 설치하는 방법은 무엇입니까? Feb 07, 2025 am 11:12 AM

이 튜토리얼은 기존 Apache 서버와 함께 Ubuntu 시스템에 Nginx 및 Phpmyadmin을 설치하고 구성하는 것을 안내합니다. 우리는 Nginx 설정, Apache와의 잠재적 포트 충돌 해결, Mariadb 설치를 다루겠습니다.

See all articles