Inhaltsverzeichnis
1. Übersicht" >1. Übersicht
2. Beschreibung der Datenstruktur" >2. Beschreibung der Datenstruktur
2.1 Strukturklasse" >2.1 Strukturklasse
2.2 struct class_interface" >2.2 struct class_interface
3. 功能及内部逻辑解析" >3. 功能及内部逻辑解析
3.1 class的功能" >3.1 class的功能
3.2 class的注册" >3.2 class的注册
3.3 Klassenbezogene Aktionen während der Geräteregistrierung" >3.3 Klassenbezogene Aktionen während der Geräteregistrierung
4. Fazit" >4. Fazit
Heim System-Tutorial LINUX Detaillierte Erläuterung des Linux-Gerätemodells (7)_Klasse

Detaillierte Erläuterung des Linux-Gerätemodells (7)_Klasse

Feb 13, 2024 pm 10:39 PM
linux linux教程 linux系统 linux命令 shell脚本 overflow eingebettetes Linux Erste Schritte mit Linux Linux-Lernen

1. Übersicht

Im Gerätemodell sind Bus, Gerät, Gerätetreiber usw. relativ einfach zu verstehen, da sie alle realen Dingen entsprechen und sich die gesamte Logik um diese Entitäten dreht. Die in diesem Artikel beschriebene Klasse ist jedoch etwas anders, da sie virtuell ist, nur um die Gemeinsamkeit des Geräts zu abstrahieren.

Detaillierte Erläuterung des Linux-Gerätemodells (7)_Klasse

Wenn sich beispielsweise Menschen gleichen Alters, die sich ähnliche Kenntnisse aneignen müssen, zum Lernen zusammenschließen, bilden sie eine Klasse. Diese Klasse kann einen eigenen Namen haben (z. B. „295“), hat aber ohne die Schüler (Geräte), aus denen sie besteht, keine Bedeutung. Was ist außerdem die größte Bedeutung der Existenz von Klassen? Jeder Kurs wird von einem Lehrer unterrichtet! Da der Lehrer nur einmal sprechen muss, können die Schüler einer Klasse es hören. Wenn jeder Schüler zu Hause lernt, wird für jeden Schüler ein Lehrer eingestellt, der ihn auf diese Weise unterrichtet. Die meisten Inhalte sind gleich, was eine große Verschwendung darstellt.

Klasse im Gerätemodell bietet ähnliche Funktionalität. Beispielsweise müssen einige ähnliche Geräte (Studenten) ähnliche Schnittstellen (Kurse) zum Benutzerbereich bereitstellen. Wenn jeder Gerätetreiber einmal implementiert werden muss, führt dies zu einer großen Menge an redundantem Code im Kernel, was eine enorme Verschwendung darstellt. Also sagte Class: „Lass mich dir bei der Umsetzung helfen, solange du weißt, wie man es benutzt.“

Dies ist die Funktion der Klasse im Gerätemodell. In Kombination mit den Kommentaren des Kernels: Eine Klasse ist eine Ansicht eines Geräts auf höherer Ebene, die Implementierungsdetails auf niedriger Ebene abstrahiert (include/linux/device.h Zeile 326). Dies ist leicht zu verstehen.

2. Beschreibung der Datenstruktur

2.1 Strukturklasse

Strukturklasse ist die Abstraktion einer Klasse, ihre Definition lautet wie folgt:

   1: /* include/linux/device.h, line 332 */
   2: struct class {
   3:         const char              *name;
   4:         struct module           *owner;
   5:  
   6:         struct class_attribute          *class_attrs;
   7:         struct device_attribute         *dev_attrs;
   8:         struct bin_attribute            *dev_bin_attrs;
   9:         struct kobject                  *dev_kobj;
  10:  
  11:         int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
  12:         char *(*devnode)(struct device *dev, umode_t *mode);
  13:  
  14:         void (*class_release)(struct class *class);
  15:         void (*dev_release)(struct device *dev);
  16:  
  17:         int (*suspend)(struct device *dev, pm_message_t state);
  18:         int (*resume)(struct device *dev);
  19:  
  20:         const struct kobj_ns_type_operations *ns_type;
  21:         const void *(*namespace)(struct device *dev);
  22:  
  23:         const struct dev_pm_ops *pm;
  24:  
  25:         struct subsys_private *p;
  26: };
Nach dem Login kopieren

Tatsächlich sind Strukturklasse und Strukturbus sehr ähnlich, was wie folgt erklärt wird:

Name, der Name der Klasse, wird im Verzeichnis „/sys/class/“ angezeigt.

class_atrrs, das Standardattribut dieser Klasse, erstellt automatisch die entsprechende Attributdatei unter „/sys/class/xxx_class“, wenn die Klasse im Kernel registriert wird.

dev_attrs, die Attribute jedes Geräts unter dieser Klasse, erstellen automatisch die entsprechende Attributdatei im sysfs-Verzeichnis des Geräts, wenn das Gerät beim Kernel registriert wird.

dev_bin_attrs ist, ähnlich wie dev_attrs, nur ein binäres Attribut.

dev_kobj gibt das Verzeichnis unter /sys/dev/ für Geräte dieser Klasse an. Derzeit gibt es im Allgemeinen zwei Typen: char und block. Wenn dev_kobj NULL ist, ist char standardmäßig ausgewählt.

dev_uevent: Wenn sich ein Gerät unter dieser Klasse ändert, wird die uevent-Rückruffunktion der Klasse aufgerufen.

class_release, die Rückruffunktion, die für die Veröffentlichung selbst verwendet wird.

dev_release, wird als Rückruffunktion für Geräte innerhalb der Release-Klasse verwendet. In der Schnittstelle „device_release“ werden das Gerät, der Gerätetyp und die Klasse, in der sich das Gerät befindet, überprüft, um festzustellen, ob die Freigabeschnittstelle registriert ist. Wenn ja, wird die entsprechende Freigabeschnittstelle aufgerufen, um den Gerätezeiger freizugeben.

p, es ist dasselbe wie die Strukturbusstruktur in „Linux Device Model (6)_Bus“ und wird nicht noch einmal erläutert.

2.2 struct class_interface

struct class_interface ist eine Struktur, die es dem Klassentreiber ermöglicht, voreingestellte Rückruffunktionen (add_dev und remove_dev) aufzurufen, wenn ein Gerät unter der Klasse hinzugefügt oder entfernt wird. Was machst du also, wenn du sie anrufst? Sie können tun, was Sie wollen (z. B. den Namen des Geräts ändern), und dies wird vom jeweiligen Klassentreiber implementiert.

Die Struktur ist wie folgt definiert:

   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: };
Nach dem Login kopieren

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的注册类似,主要包括:

  • Weisen Sie Platz für den Typzeiger struct subsys_private (cp) in der Klassenstruktur zu und initialisieren Sie die darin enthaltenen Felder, einschließlich cp->subsys.kobj.kset, cp->subsys.kobj.ktype usw.
  • Rufen Sie kset_register auf, um die Klasse zu registrieren (denken Sie an die Beschreibung in „Linux Device Model (6)_Bus“, eine Klasse ist ein Subsystem, daher ist die Registrierung einer Klasse auch ein Registrierungssubsystem). Nach Abschluss des Vorgangs wird im Verzeichnis /sys/class/ ein der Klasse (Subsystem) entsprechendes Verzeichnis erstellt
  • Rufen Sie die Schnittstelle add_class_attrs auf, um das Attribut, auf das der Zeiger class_attrs in der Klassenstruktur zeigt, zum Kernel hinzuzufügen. Nach der Ausführung sehen Sie die diesen Attributen entsprechenden Dateien im Verzeichnis /sys/class/xxx_class/

3.3 Klassenbezogene Aktionen während der Geräteregistrierung

In „Linux-Gerätemodell (5)_Gerät und Gerätetreiber“ haben wir über die beiden Datenstrukturen struct device und struct device_driver gesprochen. Die Struktur-Gerätestruktur enthält einen Strukturklassenzeiger (dies zeigt von der Seite, dass es sich bei der Klasse um Gerät A handelt). (Sammlung, sogar die Klasse kann der Treiber des Geräts sein). Wenn ein Klassentreiber eine Klasse beim Kernel registriert, muss er das Gerät der Klasse verwenden, indem er seinen eigenen Klassenzeiger auf die Klasse zeigt. Den Rest erledigt der Kernel bei der Registrierung des Geräts.

In diesem Abschnitt werden wir über die klassenbezogenen Aktionen bei der Registrierung des Geräts sprechen:

Die Geräteregistrierung wird letztendlich durch die Schnittstelle „device_add“ (drivers/base/core.c) implementiert. Zu den klassenbezogenen Aktionen in dieser Schnittstelle gehören:

  • Rufen Sie die Schnittstelle device_add_class_symlinks auf, um verschiedene in Abschnitt 3.1 beschriebene symbolische Links zu erstellen, d entsprechendes Klassenverzeichnis
  • Rufen Sie device_add_attrs auf, um durch die Klasse (class->dev_attrs) angegebene Attribute hinzuzufügen
  • Wenn es eine add_dev-Rückruffunktion gibt, die der Klasse entspricht, rufen Sie die Rückruffunktion auf

4. Fazit

Tatsächlich hat Wowo nach dem Ende dieses Artikels immer noch nicht herausgefunden, wie Klassen im Kernel verwendet werden. Aber das spielt keine Rolle. Bei der anschließenden Analyse von Subsystemen (wie Eingabesubsystem, RTC-Subsystem usw.) werden wir viele Anwendungsfälle von Klassen sehen. Wenn die Zeit gekommen ist, wird es sehr klar sein, wenn wir zurückblicken und zusammenfassen.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Linux-Gerätemodells (7)_Klasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Apr 01, 2025 pm 03:06 PM

Ursachen und Lösungen für Fehler Bei der Verwendung von PECL zur Installation von Erweiterungen in der Docker -Umgebung, wenn die Docker -Umgebung verwendet wird, begegnen wir häufig auf einige Kopfschmerzen ...

Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Apr 02, 2025 am 06:36 AM

Verwenden Sie Python im Linux -Terminal ...

Wie konfigurieren Sie die Timing -Timing -Aufgabe von ApScheduler als Dienst auf macOS? Wie konfigurieren Sie die Timing -Timing -Aufgabe von ApScheduler als Dienst auf macOS? Apr 01, 2025 pm 06:09 PM

Konfigurieren Sie die Timing -Timing -Timing -Timing -Timing auf der MacOS -Plattform, wenn Sie die Timing -Timing -Timing -Timing von APScheduler als Service konfigurieren möchten, ähnlich wie bei NGIN ...

Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Apr 03, 2025 pm 03:00 PM

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

Kann der Python -Dolmetscher im Linux -System gelöscht werden? Kann der Python -Dolmetscher im Linux -System gelöscht werden? Apr 02, 2025 am 07:00 AM

In Bezug auf das Problem der Entfernung des Python -Dolmetschers, das mit Linux -Systemen ausgestattet ist, werden viele Linux -Verteilungen den Python -Dolmetscher bei der Installation vorinstallieren, und verwendet den Paketmanager nicht ...

So öffnen Sie Web.xml So öffnen Sie Web.xml Apr 03, 2025 am 06:51 AM

Um eine Web.xml -Datei zu öffnen, können Sie die folgenden Methoden verwenden: Verwenden Sie einen Texteditor (z.

Wofür wird der Linux am besten verwendet? Wofür wird der Linux am besten verwendet? Apr 03, 2025 am 12:11 AM

Linux wird am besten als Serververwaltung, eingebettete Systeme und Desktop -Umgebungen verwendet. 1) In der Serververwaltung wird Linux verwendet, um Websites, Datenbanken und Anwendungen zu hosten und Stabilität und Zuverlässigkeit bereitzustellen. 2) In eingebetteten Systemen wird Linux aufgrund seiner Flexibilität und Stabilität in Smart Home und Automotive Electronic Systems häufig verwendet. 3) In der Desktop -Umgebung bietet Linux reichhaltige Anwendungen und eine effiziente Leistung.

See all articles