Table des matières
1. Aperçu" >1. Aperçu
2. Description de la structure des données" >2. Description de la structure des données
Classe de structure 2.1" >Classe de structure 2.1
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 Actions liées aux cours lors de l'enregistrement de l'appareil" >3.3 Actions liées aux cours lors de l'enregistrement de l'appareil
4.Conclusion" >4.Conclusion
Maison Tutoriel système Linux Explication détaillée du modèle de périphérique Linux (7)_Class

Explication détaillée du modèle de périphérique Linux (7)_Class

Feb 13, 2024 pm 10:39 PM
linux linux教程 linux系统 linux命令 shell脚本 overflow Linux embarqué Débuter avec Linux apprentissage Linux

1. Aperçu

Dans le modèle de périphérique, le bus, le périphérique, le pilote de périphérique, etc. sont relativement faciles à comprendre, car ils correspondent tous à des choses réelles et toute la logique est centrée autour de ces entités. Cependant, la classe décrite dans cet article est quelque peu différente, car elle est virtuelle, juste pour faire abstraction des points communs de l'appareil.

Explication détaillée du modèle de périphérique Linux (7)_Class

Par exemple, si des personnes du même âge et ayant besoin d'acquérir des connaissances similaires se réunissent pour étudier, elles forment une classe. Cette classe peut avoir son propre nom (comme « 295 »), mais elle n'a aucun sens sans les étudiants (Devices) qui la composent. De plus, quelle est la plus grande signification de l’existence des classes ? Chaque cours est dispensé par un professeur ! Comme l’enseignant n’a besoin de parler qu’une seule fois, tous les élèves d’une classe peuvent l’entendre. Si chaque élève étudie à la maison, un enseignant sera embauché pour chaque élève pour leur enseigner de cette façon. La plupart du contenu est le même, ce qui constitue un énorme gaspillage.

La classe dans le modèle d'appareil offre des fonctionnalités similaires. Par exemple, certains appareils similaires (étudiants) doivent fournir des interfaces (cours) similaires avec l'espace utilisateur. Si chaque pilote de périphérique doit être implémenté une seule fois, cela entraînera une grande quantité de code redondant dans le noyau, ce qui constitue un énorme gaspillage. Ainsi, Class a dit : "Laissez-moi vous aider à le mettre en œuvre, à condition que vous sachiez comment l'utiliser."

C'est la fonction de Class dans le modèle de l'appareil. Combiné avec les commentaires du noyau : une classe est une vue de niveau supérieur d'un périphérique qui résume les détails d'implémentation de bas niveau (include/linux/device.h line326), elle est facile à comprendre.

2. Description de la structure des données

Classe de structure 2.1

struct class est l'abstraction de classe, sa définition est la suivante :

   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: };
Copier après la connexion

«

En fait, la classe struct et le bus struct sont très similaires, expliqués comme suit :

name, le nom de la classe, sera reflété dans le répertoire "/sys/class/".

class_atrrs, l'attribut par défaut de cette classe, créera automatiquement le fichier d'attribut correspondant sous "/sys/class/xxx_class" lorsque la classe est enregistrée dans le noyau.

dev_attrs, les attributs de chaque périphérique de cette classe, créeront automatiquement le fichier d'attributs correspondant dans le répertoire sysfs du périphérique lorsque celui-ci est enregistré dans le noyau.

dev_bin_attrs, similaire à dev_attrs, n'est qu'un attribut de type binaire.

dev_kobj, indique le répertoire sous /sys/dev/ pour les appareils de cette classe. Actuellement, il existe généralement deux types : char et block Si dev_kobj est NULL, char est sélectionné par défaut.

dev_uevent, lorsqu'un appareil de cette classe change, la fonction de rappel uevent de la classe sera appelée.

class_release, la fonction de rappel utilisée pour la version elle-même.

dev_release, utilisé comme fonction de rappel pour les appareils de la classe release. Dans l'interface device_release, le périphérique, le type de périphérique et la classe où se trouve le périphérique seront vérifiés afin de voir si l'interface de version est enregistrée. Si tel est le cas, l'interface de version correspondante sera appelée pour libérer le pointeur de périphérique.

p, c'est la même chose que la structure du bus struct dans "Linux Device Model (6)_Bus" et ne sera pas expliquée à nouveau.

2.2 struct class_interface

struct class_interface est une structure qui permet au pilote de classe d'appeler des fonctions de rappel prédéfinies (add_dev et remove_dev) lorsqu'un périphérique est ajouté ou supprimé dans la classe. Alors, que fais-tu en les appelant ? Vous pouvez faire ce que vous voulez (comme changer le nom du périphérique), et cela est implémenté par le pilote de classe spécifique.

La structure est définie comme suit :

   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: };
Copier après la connexion

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

  • Allouez de l'espace pour le pointeur de type struct subsys_private (cp) dans la structure de classe et initialisez les champs qu'il contient, notamment cp->subsys.kobj.kset, cp->subsys.kobj.ktype, etc.
  • Appelez kset_register pour enregistrer la classe (rappelez-vous la description dans "Linux Device Model (6)_Bus", une classe est un sous-système, donc l'enregistrement d'une classe est également un sous-système d'enregistrement). Une fois le processus terminé, un répertoire correspondant à la classe (sous-système) sera créé dans le répertoire /sys/class/
  • Appelez l'interface add_class_attrs pour ajouter l'attribut pointé par le pointeur class_attrs dans la structure de classe au noyau. Après exécution, vous verrez les fichiers correspondant à ces attributs dans le répertoire /sys/class/xxx_class/

3.3 Actions liées aux cours lors de l'enregistrement de l'appareil

Dans "Modèle de périphérique Linux (5)_device et pilote de périphérique", nous avons parlé des deux structures de données struct device et struct device_driver La structure du périphérique struct contiendra un pointeur de classe struct (cela montre de côté que la classe est le périphérique A. (la collection, même la classe peut être le pilote du périphérique). Lorsqu'un pilote de classe enregistre une classe auprès du noyau, il doit utiliser le périphérique de la classe en pointant son propre pointeur de classe vers la classe. Le noyau gère le reste lors de l'enregistrement du périphérique.

Dans cette section, nous parlerons des actions liées au recours collectif lors de l'enregistrement de l'appareil :

«

L'enregistrement des appareils est finalement implémenté par l'interface device_add (drivers/base/core.c). Les actions liées aux classes dans cette interface incluent :

.
  • Appeler l'interface device_add_class_symlinks pour créer différents liens symboliques décrits à la section 3.1, à savoir : dans le répertoire de la classe correspondante, créer un lien symbolique pointant vers le périphérique, dans le répertoire du périphérique, créer un lien symbolique nommé sous-système pointant vers le périphérique ; répertoire de classe correspondant
  • Appelez device_add_attrs pour ajouter les attributs spécifiés par la classe (class->dev_attrs)
  • S'il existe une fonction de rappel add_dev correspondant à la classe, appelez la fonction de rappel

4.Conclusion

En fait, après la fin de cet article, Wowo n'a toujours pas compris comment les classes sont utilisées dans le noyau. Mais cela n'a pas d'importance dans l'analyse ultérieure des sous-systèmes (tels que le sous-système d'entrée, le sous-système RTC, etc.), nous verrons de nombreux cas d'utilisation des classes. Le moment venu, cela deviendra très clair lorsque nous regarderons en arrière et résumerons.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Android TV Box obtient une mise à niveau non officielle d'Ubuntu 24.04 Android TV Box obtient une mise à niveau non officielle d'Ubuntu 24.04 Sep 05, 2024 am 06:33 AM

Pour de nombreux utilisateurs, pirater un boîtier Android TV semble intimidant. Cependant, le développeur Murray R. Van Luyn a dû relever le défi de rechercher des alternatives appropriées au Raspberry Pi pendant la pénurie de puces Broadcom. Ses efforts de collaboration avec l'Armbia

Entrée de la version Web Deepseek Entrée du site officiel Deepseek Entrée de la version Web Deepseek Entrée du site officiel Deepseek Feb 19, 2025 pm 04:54 PM

Deepseek est un puissant outil de recherche et d'analyse intelligent qui fournit deux méthodes d'accès: la version Web et le site officiel. La version Web est pratique et efficace et peut être utilisée sans installation; Que ce soit des individus ou des utilisateurs d'entreprise, ils peuvent facilement obtenir et analyser des données massives via Deepseek pour améliorer l'efficacité du travail, aider la prise de décision et promouvoir l'innovation.

Comment installer Deepseek Comment installer Deepseek Feb 19, 2025 pm 05:48 PM

Il existe de nombreuses façons d'installer Deepseek, notamment: Compiler à partir de Source (pour les développeurs expérimentés) en utilisant des packages précompilés (pour les utilisateurs de Windows) à l'aide de conteneurs Docker (pour le plus pratique, pas besoin de s'inquiéter de la compatibilité), quelle que soit la méthode que vous choisissez, veuillez lire Les documents officiels documentent soigneusement et les préparent pleinement à éviter des problèmes inutiles.

Adresse de téléchargement de l'application de portefeuille BitPie Bitpie Adresse de téléchargement de l'application de portefeuille BitPie Bitpie Sep 10, 2024 pm 12:10 PM

Comment télécharger l'application BitPie Bitpie Wallet ? Les étapes sont les suivantes : Recherchez « BitPie Bitpie Wallet » dans l'AppStore (appareils Apple) ou Google Play Store (appareils Android). Cliquez sur le bouton « Obtenir » ou « Installer » pour télécharger l'application. Pour la version informatique, visitez le site Web officiel du portefeuille BitPie et téléchargez le progiciel correspondant.

Installation officielle du site officiel de Bitget (Guide du débutant 2025) Installation officielle du site officiel de Bitget (Guide du débutant 2025) Feb 21, 2025 pm 08:42 PM

Bitget est un échange de crypto-monnaie qui fournit une variété de services de trading, notamment le trading au comptant, le trading de contrats et les dérivés. Fondée en 2018, l'échange est basée à Singapour et s'engage à fournir aux utilisateurs une plate-forme de trading sûre et fiable. Bitget propose une variété de paires de trading, notamment BTC / USDT, ETH / USDT et XRP / USDT. De plus, l'échange a une réputation de sécurité et de liquidité et offre une variété de fonctionnalités telles que les types de commandes premium, le trading à effet de levier et le support client 24/7.

Explication détaillée : commande de paramètre de jugement variable du script Shell Explication détaillée : commande de paramètre de jugement variable du script Shell Sep 02, 2024 pm 03:25 PM

La variable système $n est le paramètre transmis au script ou à la fonction. n est un nombre indiquant le nombre de paramètres. Par exemple, le premier paramètre est $1 et le deuxième paramètre est $2$ ? L'état de sortie de la commande précédente ou la valeur de retour de la fonction. Renvoie 0 en cas de succès, 1 en cas d'échec $#Nombre de paramètres passés au script ou à la fonction $* Tous ces paramètres sont entourés de guillemets doubles. Si un script reçoit deux paramètres, $* est égal à $1$2$0Le nom de la commande en cours d'exécution. Pour les scripts shell, il s'agit du chemin d'accès à la commande activée. $@ est légèrement différent de $* lorsqu'il est placé entre guillemets (""). Si un script reçoit deux paramètres, $@ équivaut à $1$2$$le numéro de processus du shell actuel. Pour un script shell, c'est le processus que je fais lors de son exécution

Zabbix 3.4 Installation de la compilation du code source Zabbix 3.4 Installation de la compilation du code source Sep 04, 2024 am 07:32 AM

1. Environnement d'installation (machine virtuelle Hyper-V) : $hostnamectlStatichostname:localhost.localdomainIconname:computer-vmChassis:vmMachineID:renwoles1d8743989a40cb81db696400BootID:renwoles272f4aa59935dcdd0d456501Virtualisation:microsoftOperatingSystem:CentOS Linux7 (Core )CPEOSNom :cpe :

Le package d'installation OUYI OKX est directement inclus Le package d'installation OUYI OKX est directement inclus Feb 21, 2025 pm 08:00 PM

OUYI OKX, le premier échange mondial d'actifs numériques, a maintenant lancé un package d'installation officiel pour offrir une expérience de trading sûre et pratique. Le package d'installation OKX de OUYI n'a pas besoin d'être accessible via un navigateur. Le processus d'installation est simple et facile à comprendre.

See all articles