목차
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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

VSCODE에 필요한 컴퓨터 구성 VSCODE에 필요한 컴퓨터 구성 Apr 15, 2025 pm 09:48 PM

대 코드 시스템 요구 사항 : 운영 체제 : Windows 10 이상, MacOS 10.12 이상, Linux 배포 프로세서 : 최소 1.6GHz, 권장 2.0GHz 이상의 메모리 : 최소 512MB, 권장 4GB 이상의 저장 공간 : 최소 250MB, 권장 1GB 및 기타 요구 사항 : 안정 네트워크 연결, Xorg/Wayland (LINUX)

VSCODE는 확장자를 설치할 수 없습니다 VSCODE는 확장자를 설치할 수 없습니다 Apr 15, 2025 pm 07:18 PM

VS 코드 확장을 설치하는 이유는 다음과 같습니다. 네트워크 불안정성, 불충분 한 권한, 시스템 호환성 문제, C 코드 버전은 너무 오래된, 바이러스 백신 소프트웨어 또는 방화벽 간섭입니다. 네트워크 연결, 권한, 로그 파일, 업데이트 대 코드 업데이트, 보안 소프트웨어 비활성화 및 대 코드 또는 컴퓨터를 다시 시작하면 점차 문제를 해결하고 해결할 수 있습니다.

Apr 16, 2025 pm 07:39 PM

메모장은 Java 코드를 직접 실행할 수는 없지만 다른 도구를 사용하여 명령 줄 컴파일러 (Javac)를 사용하여 Bytecode 파일 (filename.class)을 생성하면 달성 할 수 있습니다. Java Interpreter (Java)를 사용하여 바이트 코드를 해석하고 코드를 실행하고 결과를 출력하십시오.

Linux Architecture : 5 개의 기본 구성 요소를 공개합니다 Linux Architecture : 5 개의 기본 구성 요소를 공개합니다 Apr 20, 2025 am 12:04 AM

Linux 시스템의 5 가지 기본 구성 요소는 다음과 같습니다. 1. Kernel, 2. System Library, 3. System Utilities, 4. 그래픽 사용자 인터페이스, 5. 응용 프로그램. 커널은 하드웨어 리소스를 관리하고 시스템 라이브러리는 사전 컴파일 된 기능을 제공하며 시스템 유틸리티는 시스템 관리에 사용되며 GUI는 시각적 상호 작용을 제공하며 응용 프로그램은 이러한 구성 요소를 사용하여 기능을 구현합니다.

vScode를 Mac에 사용할 수 있습니다 vScode를 Mac에 사용할 수 있습니다 Apr 15, 2025 pm 07:36 PM

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.

VScode 란 무엇입니까? VScode 란 무엇입니까? Apr 15, 2025 pm 06:45 PM

VS Code는 Full Name Visual Studio Code로, Microsoft가 개발 한 무료 및 오픈 소스 크로스 플랫폼 코드 편집기 및 개발 환경입니다. 광범위한 프로그래밍 언어를 지원하고 구문 강조 표시, 코드 자동 완료, 코드 스 니펫 및 스마트 프롬프트를 제공하여 개발 효율성을 향상시킵니다. 풍부한 확장 생태계를 통해 사용자는 디버거, 코드 서식 도구 및 GIT 통합과 같은 특정 요구 및 언어에 확장을 추가 할 수 있습니다. VS 코드에는 코드에서 버그를 신속하게 찾아서 해결하는 데 도움이되는 직관적 인 디버거도 포함되어 있습니다.

vscode를 사용하는 방법 vscode를 사용하는 방법 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCODE)는 Microsoft가 개발 한 크로스 플랫폼, 오픈 소스 및 무료 코드 편집기입니다. 광범위한 프로그래밍 언어에 대한 가볍고 확장 성 및 지원으로 유명합니다. VSCODE를 설치하려면 공식 웹 사이트를 방문하여 설치 프로그램을 다운로드하고 실행하십시오. VScode를 사용하는 경우 새 프로젝트를 만들고 코드 편집, 디버그 코드, 프로젝트 탐색, VSCODE 확장 및 설정을 관리 할 수 ​​있습니다. VSCODE는 Windows, MacOS 및 Linux에서 사용할 수 있으며 여러 프로그래밍 언어를 지원하며 Marketplace를 통해 다양한 확장을 제공합니다. 이점은 경량, 확장 성, 광범위한 언어 지원, 풍부한 기능 및 버전이 포함됩니다.

git의 창고 주소를 확인하는 방법 git의 창고 주소를 확인하는 방법 Apr 17, 2025 pm 01:54 PM

git 저장소 주소를 보려면 다음 단계를 수행하십시오. 1. 명령 줄을 열고 리포지토리 디렉토리로 이동하십시오. 2. "git remote -v"명령을 실행하십시오. 3. 출력 및 해당 주소에서 저장소 이름을 봅니다.

See all articles