Jouer avec OurBMC numéro 7 : communication inter-processus OpenBMC D-Bus

Introduction de la chronique : "Playing with OurBMC" est une chronique de partage de connaissances créée par la communauté OurBMC. Elle se concentre principalement sur le partage des connaissances de base liées à la communauté et à la technologie full-stack BMC, couvrant tous les aspects du transfert de connaissances des principes théoriques à la pratique. opérations. La communauté OurBMC aidera les développeurs à acquérir une compréhension approfondie de la culture, des concepts et des caractéristiques de la communauté grâce à la colonne « Fun OurBMC », et améliorera la compréhension des développeurs de la technologie full-stack de BMC.

Invitez tout le monde à prêter attention à la rubrique « Fun OurBMC » et à explorer ensemble le monde merveilleux de la communauté OurBMC. Dans le même temps, nous invitons sincèrement tous les développeurs à contribuer à la rubrique « Playing OurBMC », à apprendre et à progresser ensemble, et à faire de la colonne un jardin de connaissances qui rassemble la sagesse et stimule la créativité.

Dans  OpenBMC  , la communication inter-processus (IPC) est un composant important et D-Bus est largement utilisé comme mécanisme IPC léger et efficace. Ce numéro se concentrera sur le tisseur de ce réseau de communication-D-Bus. Tout d'abord, les interfaces et les principaux concepts fournis par D-Bus sont présentés. Ensuite, une analyse plus approfondie de D-Bus est réalisée sur la base des applications de la communauté OpenBMC. Grâce à l'analyse de D-Bus, nous espérons aider les lecteurs à mieux comprendre et utiliser ce puissant mécanisme IPC pour améliorer les performances globales et la stabilité du système.

Présentation du bus D

D-Bus (Desktop Bus) est un mécanisme avancé de communication inter-processus (IPC) largement utilisé dans les systèmes d'exploitation Linux. Il permet aux applications logicielles de communiquer de manière synchrone ou asynchrone, en envoyant et en recevant des messages inter-processus. Par rapport aux mécanismes IPC traditionnels (tels que PIPE/FIFO/Socket/mémoire partagée/SysvIpc), D-Bus offre une faible latence, une faible surcharge et. Mécanisme IPC à haute disponibilité, masquant la complexité du mécanisme IPC sous-jacent, offrant aux développeurs une interface plus avancée et plus facile à utiliser :

  • Appel de méthode :

Utilisé pour implémenter des appels de méthodes (fonctions) inter-processus et combiné à des outils de génération de code, il peut rendre les appels de fonction inter-processus presque impossibles à distinguer des appels de fonction ordinaires.

  • Signal:

Le mécanisme de communication du modèle de publication-abonnement (Pub-Sub), le processus d'envoi enregistre et envoie (diffusez) des signaux, et le processus de réception s'abonne aux signaux qui l'intéressent.

  • Propriétés:

Il peut être comparé au Getter-Setter des variables membres dans une classe C++. Si le processus A fournit une propriété, d'autres processus peuvent lire et écrire la propriété via D-Bus.

Parallèlement, les concepts suivants sont utilisés pour déterminer l'objet spécifique de l'appel D-Bus :

  • Nom de l'autobus :

Le nom d'un service enregistré sur le bus est un nom unique utilisé par chaque application (ou objet de communication) pour s'identifier. Ce nom est unique au système D-Bus et peut donc être utilisé par d'autres applications à des fins de référence et de communication. Il peut être compris comme une adresse "IP", de manière analogue au nom d'une bibliothèque lib.

  • Chemin de l'objet :

Utilisé pour identifier des objets dans une application ou un service spécifique sur D-Bus , similaire à un chemin dans un système de fichiers, mais utilisé pour les objets D-Bus au lieu des fichiers. Les chemins d'objet suivent généralement une structure hiérarchique pour faciliter l'organisation et la gestion. La convention de dénomination des chemins d'objet est /com/example/MusicPlayer1, qui représente l'objet racine dans une application nommée « MusicPlayer1 ». Il peut être comparé à des objets de la même classe (objets) en C++.

  • Interface:

L'interface définit les fonctions fournies par l'objet D-Bus, y compris les méthodes, les propriétés et les signaux. Une interface peut être implémentée par plusieurs objets et utilisée par plusieurs applications ou services. Une interface est similaire à une classe ou à un fichier d'en-tête en C++, qui décrit le comportement et les propriétés accessibles d'un objet. Dans D-Bus, un objet peut implémenter plusieurs interfaces, et chaque interface contient un ensemble de méthodes, de propriétés et de signaux. Ces méthodes et propriétés peuvent être appelées ou accessibles par d'autres applications ou services via D-Bus.

Applications pratiques du D-bus

Dans OpenBMC, D-Bus est largement utilisé dans des scénarios tels que la collecte de données de capteurs, la gestion des pannes matérielles et les interfaces de gestion à distance. Il rend la communication entre les différents composants simple et efficace, offrant une forte garantie pour le fonctionnement stable du système.

Ce qui suit est une analyse plus approfondie de D-Bus basée sur les applications réelles de la communauté OpenBMC.

  • Outil D-Bus (busctl)

busctl est un outil de ligne de commande fourni par systemd pour interagir avec le bus système D-Bus. Utilisez l'outil busctl pour saisir le nom du bus, le chemin de l'objet, l'interface et d'autres paramètres afin d'obtenir les informations détaillées fournies par l'objet D-Bus, y compris les propriétés, les signaux, les appels de méthode (méthode), etc., afin que les utilisateurs puissent avoir un compréhension plus intuitive de divers concepts abstraits dans D-Bus.

  • Propriété

En prenant le programme adcsensor comme exemple, ce processus identifie le SOC de la puce via le fichier de configuration, convertit la valeur originale de l'ADC fourni par le noyau en tension et l'affiche sous forme de D-Bus selon le capteur décrit dans le fichier de configuration:

Nom du bus : xyz.openbmc_project.ADCSensor

Chemin d'objet : /xyz/openbmc_project/sensors/voltage/xxx, plusieurs chemins d'objet sont générés en fonction du fichier de configuration au niveau de la carte pour représenter le capteur de tension.

Interface 1 : xyz.openbmc_project.Sensor.Value

Propriétés fournies par cette interface :

MaxValue (type double) : valeur maximale du capteur

MinValue (type double) : valeur minimale du capteur

Unité (type chaîne) : type de valeur, volts

Valeur (type double) : valeur actuelle du capteur

Interface 2 : xyz.openbmc_project.Sensor.Threshold.Critical

Propriétés fournies par cette interface :

CriticalAlarmHigh (type bool) : indique si le seuil de gravité élevé est atteint

CriticalAlarmLow (type bool) : indique si le seuil de gravité faible est atteint

CriticalHigh (type double) : seuil haut critique

CriticalLow (type double) : seuil extrêmement bas

Interface 3 : xyz.openbmc_project.Sensor.Threshold Avertissement.

Propriétés fournies par cette interface :

WarningAlarmHigh (type bool) : indique si le seuil d'avertissement élevé est atteint

WarningAlarmLow (type bool) : indique si le seuil d'avertissement bas est atteint

WarningHigh (double type) : seuil d'avertissement haut

WarningLow (type double) : seuil d'avertissement bas

À ce stade, d'autres modules d'application peuvent implémenter des fonctions associées via ces attributs D-Bus abstraits. Par exemple, le module de capteur IPMI peut générer dynamiquement IPMI SDR, le module IPMI SEL surveille les attributs et génère des journaux d'alarme, et le module Redfish génère des interfaces de capteur sébaste, etc.

  • Signal

Tous les objets D-Bus auront l'interface org.freedesktop.DBus.Properties et le signal PropertiesChanged en dessous. Toute modification d'un attribut de toutes les interfaces sous cet objet déclenchera l'envoi du signal à D-Bus. Le format de contenu du signal est sa{sv}as, et la signification correspondante est :

STRING : nom de l'interface

TABLEAU de nom d'attribut DICT_ENTRY<STRING,VARIANT> et valeur modifiée (plusieurs)

ARRAY<STRING> Nom de l'attribut dont la valeur a changé, mais la valeur modifiée est inconnue. (plusieurs)

De plus, tous les messages D-Bus contiendront le nom du bus et le chemin de l'objet, et d'autres processus pourront sélectionner librement ces paramètres à surveiller afin de capturer les variables d'intérêt.

  • Méthode

Il n'y a que deux types de messages sur le bus D-Bus, l'un est Signal et l'autre est Méthode. Les principales différences entre les deux sont les suivantes :

1. Le signal est diffusé sur le bus, tandis que la méthode est un message envoyé à un objet caractéristique ;

2. Le signal n'a pas de valeur de retour, tandis que la méthode peut avoir une valeur de retour (synchrone ou asynchrone), selon que la méthode appelée définit ou non une valeur de retour ;

3. Le signal est principalement utilisé pour la notification d'événements, tandis que la méthode est généralement utilisée pour demander des données ou effectuer des opérations ;

La lecture et l'écriture de Property sont essentiellement une méthode d'appel de Get et Set dans l'interface standard Dbus org.freedesktop.DBus.Properties .

Prenons comme exemple la méthode de création d'une adresse IP de carte réseau :

Nom du bus:xyz.openbmc_project.Network

Objet:/xyz/openbmc_project/network/<network_name>

Interface:xyz.openbmc_project.Network.IP.Create

Méthode:IP syss:"<Protocole IP>:ipv6\ipv4""<Adresse IP>" "<Préfixe du masque réseau>" "<Passerelle réseau>", renvoie "Nouveau chemin d'objet IP"

Utilisez l'outil busctl pour créer une IP :

busctl --verbose appel xyz.openbmc_project.Network /xyz/openbmc_project/network/eth0 xyz.openbmc_project.Network.IP.Create IP syss "xyz.openbmc_project.Network.IP.Protocol.IPv4" "10.10.10.192" 24 "10.10 .10.1"

valeur de retour :

MESSAGE "o" {

                OBJECT_PATH "/xyz/openbmc_project/network/eth0/_310_2e10_2e10_2e192_2f24";

} ;

Vous pouvez également considérer la méthode IP de l'interface xyz.openbmc_project.Network.IP.Create comme une fonction qui saisit les informations IP, ajoute une adresse IP à la carte réseau et renvoie un chemin d'objet nouvellement généré :

chaîne IP (protocole de chaîne, chaîne ip_addr, masque de réseau de caractères non signés, passerelle de chaîne)

En bref, D-Bus est l'un des mécanismes importants de communication inter-processus dans OpenBMC. Il permet à différents processus et applications de communiquer entre eux en fournissant un système de bus de messages fiable et flexible. Il simplifie la complexité de la communication inter-processus et fournit de nombreuses fonctions utiles, améliorant ainsi la fiabilité et la maintenabilité du système OpenBMC.

Invitez tout le monde à suivre la communauté OurBMC et à en savoir plus sur la technologie BMC.

Site officiel de notre communauté BMC :

https://www.ourbmc.cn/

Les ressources piratées de "Qing Yu Nian 2" ont été téléchargées sur npm, obligeant npmmirror à suspendre le service unpkg. Zhou Hongyi : Il ne reste plus beaucoup de temps à Google. Je suggère que tous les produits soient open source. time.sleep(6) joue ici un rôle. Linus est le plus actif dans la « consommation de nourriture pour chiens » ! Le nouvel iPad Pro utilise 12 Go de puces mémoire, mais prétend disposer de 8 Go de mémoire. Le People's Daily Online examine la charge de type matriochka des logiciels de bureau : Ce n'est qu'en résolvant activement « l'ensemble » que nous pourrons avoir un avenir avec Flutter 3.22 et Dart 3.4 . nouveau paradigme de développement pour Vue3, sans avoir besoin de « ref/reactive », pas besoin de « ref.value » Publication du manuel chinois MySQL 8.4 LTS : vous aider à maîtriser le nouveau domaine de la gestion de bases de données Tongyi Qianwen niveau GPT-4 prix du modèle principal réduit de 97%, 1 yuan et 2 millions de jetons
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/ourbmc/blog/11183508
conseillé
Classement