Table des matières
container_ofprincipe " >container_ofprincipe
驱动中的实际例子 " >驱动中的实际例子
Maison Opération et maintenance exploitation et maintenance Linux Bases du noyau Linux - principe containers_of et application pratique

Bases du noyau Linux - principe containers_of et application pratique

Jul 31, 2023 pm 03:46 PM
linux container communication

souvent vu dans le noyau Linux, 35, 0.05) ; famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb (239, 112, 96); ">container_of, il est également largement utilisé dans l'écriture réelle des pilotes. container_of的身影,它在实际驱动的编写中也是广泛应用。

container_of原理

作用:通过结构体的某个成员变量地址找到该结构体的首地址

定义如下:

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:    the pointer to the member.
 * @type:   the type of the container struct this is embedded in.
 * @member: the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({          \
    const typeof( ((type *)0)->member ) *__mptr = (ptr); \
    (type *)( (char *)__mptr - offsetof(type,member) );})
Copier après la connexion
  • ptr:结构体成员变量的指针
  • type:结构体类型
  • member:结构体成员变量的名字

换句话说,叫:已知结构体type的成员member的地址ptr,求解结构体type

container_ofprincipe

Fonction

 : à travers la structure A< strong>member variable address 🎜 trouve la première adresse 🎜 de la structure. 🎜🎜Il est défini comme suit : 🎜
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Copier après la connexion
Copier après la connexion
  • ptr : pointeur vers les variables membres de la structure
  • < section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">type : type de structure
  • member : le nom de la variable membre de la structure
  • 🎜En d'autres termes, on l'appelle : < strong>structure déjà connueMembre de type< style de code = "taille de police : 14 px ; remplissage : 2 px 4 px ; rayon de bordure : 4 px ; marge droite : 2 px ; marge gauche : 2 px ; couleur d'arrière-plan : rgba (27, 31, 35, 0,05); famille : "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">adresse du membre ptr, résoudre la structure< code style = "taille de police : 14 px ; remplissage : 2 px 4 px ; rayon de bordure : 4 px ; marge droite : 2 px ; marge gauche : 2 px ; couleur d'arrière-plan : rgba (27, 31, 35, 0,05); famille : " Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">tapez l'adresse de départ 🎜. 🎜

    计算公式为:type的起始地址 = ptr -size (size为member的大小)type的起始地址 = ptr -size (size为member的大小)

    以一幅图说明ptrtypemember的关系:

    Bases du noyau Linux - principe containers_of et application pratique
    • 原理简述:

    container_of的妙处就在于0作为成员变量member的基址

    其中定义了一个中间变量__mptr,"__"代表内部使用,“m”代表middle

    以一幅图说明ptr、< code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font- famille : "Operator Mono", Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb(239, 112, 96);">type、membre的关系:🎜
    Bases du noyau Linux - principe containers_of et application pratique
    • 原理简述:
    🎜container_of的妙处就在于🎜以0作为成员变量membre的基址
    。🎜🎜其中定义了一个中间变量__"代表内部使用,“m”代表milieu 。🎜
    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
    Copier après la connexion
    Copier après la connexion

    typeof( ((type *)0)->member )是获取member的类型,__mptr = (ptr)判断ptrmember是否为同一类型,offsetof计算成员member的大小size

    驱动中的实际例子

    例如内核的pwm驱动,通过成员变量chip,找到结构体bcm2835_pwm

    struct bcm2835_pwm {
     struct pwm_chip chip;
     struct device *dev;
     void __iomem *base;
     struct clk *clk;
    };
    
    static inline struct bcm2835_pwm *to_bcm2835_pwm(struct pwm_chip *chip_ptr)
    {
     return container_of(chip_ptr, struct bcm2835_pwm, chip);
    }
    Copier après la connexion

    使用container_of通常都会定义一个函数,并且命名为to_xxx或者to_find_xxx,代表要找xxx这个结构体,传参则传入成员变量指针,另外函数也会声明为inline

    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)
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Comment réparer l'audio si vous n'entendez personne
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Comment déverrouiller tout dans Myrise
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

    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)

    Comment ouvrir web.xml Comment ouvrir web.xml Apr 03, 2025 am 06:51 AM

    Pour ouvrir un fichier web.xml, vous pouvez utiliser les méthodes suivantes: Utilisez un éditeur de texte (tel que le bloc-notes ou TextEdit) pour modifier les commandes à l'aide d'un environnement de développement intégré (tel qu'Eclipse ou NetBeans) (Windows: Notepad web.xml; Mac / Linux: Open -A TextEdit web.xml)

    Quatre façons d'implémenter le multithreading dans le langage C Quatre façons d'implémenter le multithreading dans le langage C Apr 03, 2025 pm 03:00 PM

    Le multithreading dans la langue peut considérablement améliorer l'efficacité du programme. Il existe quatre façons principales d'implémenter le multithreading dans le langage C: créer des processus indépendants: créer plusieurs processus en cours d'exécution indépendante, chaque processus a son propre espace mémoire. Pseudo-Multithreading: Créez plusieurs flux d'exécution dans un processus qui partagent le même espace mémoire et exécutent alternativement. Bibliothèque multi-thread: Utilisez des bibliothèques multi-threades telles que PTHEADS pour créer et gérer des threads, en fournissant des fonctions de fonctionnement de thread riches. Coroutine: une implémentation multi-thread légère qui divise les tâches en petites sous-tâches et les exécute tour à tour.

    À quoi sert le mieux le Linux? À quoi sert le mieux le Linux? Apr 03, 2025 am 12:11 AM

    Linux est mieux utilisé comme gestion de serveurs, systèmes intégrés et environnements de bureau. 1) Dans la gestion des serveurs, Linux est utilisé pour héberger des sites Web, des bases de données et des applications, assurant la stabilité et la fiabilité. 2) Dans les systèmes intégrés, Linux est largement utilisé dans les systèmes électroniques intelligents et automobiles en raison de sa flexibilité et de sa stabilité. 3) Dans l'environnement de bureau, Linux fournit des applications riches et des performances efficaces.

    Comment est la compatibilité Debian Hadoop Comment est la compatibilité Debian Hadoop Apr 02, 2025 am 08:42 AM

    Debianlinux est connu pour sa stabilité et sa sécurité et est largement utilisé dans les environnements de serveur, de développement et de bureau. Bien qu'il y ait actuellement un manque d'instructions officielles sur la compatibilité directe avec Debian et Hadoop, cet article vous guidera sur la façon de déployer Hadoop sur votre système Debian. Exigences du système Debian: Avant de commencer la configuration de Hadoop, assurez-vous que votre système Debian répond aux exigences de fonctionnement minimales de Hadoop, qui comprend l'installation de l'environnement d'exécution Java (JRE) nécessaire et des packages Hadoop. Étapes de déploiement de Hadoop: Télécharger et unzip Hadoop: Téléchargez la version Hadoop dont vous avez besoin sur le site officiel d'Apachehadoop et résolvez-le

    Dois-je installer un client Oracle lors de la connexion à une base de données Oracle à l'aide de Go? Dois-je installer un client Oracle lors de la connexion à une base de données Oracle à l'aide de Go? Apr 02, 2025 pm 03:48 PM

    Dois-je installer un client Oracle lors de la connexion à une base de données Oracle à l'aide de Go? Lorsque vous développez GO, la connexion aux bases de données Oracle est une exigence commune ...

    Debian Strings est-il compatible avec plusieurs navigateurs Debian Strings est-il compatible avec plusieurs navigateurs Apr 02, 2025 am 08:30 AM

    "Debianstrings" n'est pas un terme standard, et sa signification spécifique n'est pas encore claire. Cet article ne peut pas commenter directement la compatibilité de son navigateur. Cependant, si "DebianStrings" fait référence à une application Web exécutée sur un système Debian, sa compatibilité du navigateur dépend de l'architecture technique de l'application elle-même. La plupart des applications Web modernes se sont engagées à compatibilité entre les navigateurs. Cela repose sur les normes Web suivantes et l'utilisation de technologies frontales bien compatibles (telles que HTML, CSS, JavaScript) et les technologies back-end (telles que PHP, Python, Node.js, etc.). Pour s'assurer que l'application est compatible avec plusieurs navigateurs, les développeurs doivent souvent effectuer des tests croisés et utiliser la réactivité

    Impossible de se connecter à MySQL en tant que racine Impossible de se connecter à MySQL en tant que racine Apr 08, 2025 pm 04:54 PM

    Les principales raisons pour lesquelles vous ne pouvez pas vous connecter à MySQL en tant que racines sont des problèmes d'autorisation, des erreurs de fichier de configuration, des problèmes de mot de passe incohérents, des problèmes de fichiers de socket ou une interception de pare-feu. La solution comprend: vérifiez si le paramètre Bind-Address dans le fichier de configuration est configuré correctement. Vérifiez si les autorisations de l'utilisateur racine ont été modifiées ou supprimées et réinitialisées. Vérifiez que le mot de passe est précis, y compris les cas et les caractères spéciaux. Vérifiez les paramètres et les chemins d'autorisation du fichier de socket. Vérifiez que le pare-feu bloque les connexions au serveur MySQL.

    libv est deux libv est deux Apr 03, 2025 pm 08:03 PM

    J'ai développé un projet appelé Lua-Libuv et je suis heureux de partager mon expérience. L'intention initiale du projet est d'explorer comment utiliser Libuv (une bibliothèque d'E / S asynchrone écrite en c) pour créer un serveur HTTP simple sans avoir à apprendre le langage C en profondeur. Avec l'aide de Chatgpt, j'ai terminé le code de base de HTTP.C. Lorsque je traite des connexions persistantes, j'ai réussi à mettre en œuvre la clôture de la connexion et à libérer les ressources au bon moment. Au début, j'ai essayé de créer un serveur simple qui a mis fin au programme principal en fermant la connexion, mais j'ai eu quelques problèmes. J'ai essayé d'envoyer des blocs de données à l'aide de streaming, et pendant que cela fonctionne, cela bloque le thread principal. En fin de compte, j'ai décidé d'abandonner cette approche parce que mon objectif n'était pas d'apprendre la langue C en profondeur. Enfin, je

    See all articles