„Ergänzende - Linux Kernel-Gerätestrukturanalyse (drehen)“

1 Einführung

  Gerätetreibermodell Linux Kernel, basiert auf sysfs Gerätedateisystem und den kobject, durch einen Bus (BUS), wobei die Vorrichtung (Device), ein Antrieb (Treiber) und eine Klasse (class), die aus der relationalen Struktur, an der Unterseite, Linux jede Systemvorrichtung ein Strukturbeispiel der Vorrichtung weist, Vorrichtungsstrukturen hierin Linux-Kernel und eine kurze Analyse der relevanten Struktur.

 

2, Vorrichtungsstruktur

  In der Linux Kernel-Quelle gehören zu den wichtigsten Verfahren nach struct Vorrichtungsstruktur / Linux / device.h, die Realisierung von Treiber / Basis / core.c Datei definiert Struktur der Vorrichtung ist unten gezeigt:

struct Gerät { 
    struct Gerät * parent; 

    struct device_private * p; 

    struct kobject kobj; 
    const char * init_name; / * Anfangs Namen des Geräts * / 
    const struct DEVICE_TYPE * Typ; 

    struct Mutex Mutex; / * Mutex zu synchronisieren Anrufe 
                     * seinen Fahrer. 
                     * / 

    Struct bus_type * Bus; / * Art der Buseinrichtung ist on * / 
    struct device_driver * Treiber; / * Treiber, der diesen zugeordnet ist 
                       Gerät * / 
    void * platform_data; / * Plattformspezifische Daten, Geräte
                       Gerätekern es nicht berührt * /
    void * driver_data; / * Treiber Daten, Satz und mit bekommen 
                       dev_set / get_drvdata * / 
    struct dev_links_info Links; 
    struct dev_pm_info Leistung; 
    struct dev_pm_domain * pm_domain; 

#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN 
    struct irq_domain * msi_domain; 
endif 
#ifdef CONFIG_PINCTRL 
    struct dev_pin_info * Stifte; 
endif 
#ifdef CONFIG_GENERIC_MSI_IRQ 
    struct listjead msi_list; 
endif 

#ifdef CONFIG_NUMA 
    int numa_node; / * NUMA - Knoten dieses Geräts ist in der Nähe * / 
# endif 
    const struct dma_map_ops * dma_ops; 
    U64 * dma_mask; / * Dma Maske (wenn dma'able Gerät) * / 
    u64 coherent_dma_mask / * Wie dma_mask, aber für
                         alloc_coherent Zuordnungen wie 
                         nicht alle Hardware unterstützt 
Bit - Adressen für eine konsistente 
                         Zuweisungen solche Deskriptoren. * / 
    Unsigned long dma_pfn_offset; 

    struct device_dma_parameters * dma_parms; 

    struct listjead dma_pools; / * Dma Pools (falls dma'ble) * / 

    struct dma_coherent_mem * dma_mem; / * Interne für kohärente mem 
                         Überschreibung * / 
#ifdef CONFIG_DMA_CMA 
    struct cma * cma_area; / * Zusammenhängender Speicherbereich für DMA - 
                       Zuweisungen * / 
    struct dev_archdata archdata; 
# endif
    / * Bogen spezifische Ergänzungen * / 

    struct device_node * of_node; / * Zugehörigen Gerätebaumknoten * / 
    struct fwnode_handle * fwnode; / * Firmware Geräteknoten * / 

    dev_t DEVt; / * DEV_T, schafft die sysfs "dev" * / 
    u32 id; / * * Geräteinstanz / 

    spinlock_t devres_lock; 
    struct listjead devres_head; 

    struct klist_node knode_class; 
    struct Klasse * Klasse; 
    const struct attribute_group ** Gruppen; / * Optional Gruppen * / 

    void (* release) (struct Gerät * dev); 
    struct iommu_group * iommu_group; 
    struct iommu_fwspec * iommu_fwspec; 

    bool offline_disabled: 1;
    Bool offline: 1; 
    bool of_node_reused: 1; 
};

  Ein Teil der Strukturelemente erklären:

  • parent: Zeigegerät „parent“ Gerät ist es angeschlossene Geräte in den meisten Fällen ist das übergeordnete Gerät eine Art von Bus oder Host-Controller, wenn das Mitglied NULL ist, Ausrüstung die Vorrichtung eine Top-Level;
  • p: Für die Gerätetreiber auf den privaten Datenabschnitt des Kerns zu speichern;
  • kobj: struct kobject Objektinstanz eingebettet ist;
  • init_name: Die Anfangs Namen des Geräts
  • Typ: Der Typ von Vorrichtung, die Art der Vorrichtung mit einer bestimmten Art von Informationen zu identifizieren und tragen verwendet;
  • Mutex: Mutex zur Synchronisation;
  • Bus: Das Gerät ist in einem Bus;
  • Treiber: Der Gerätetreiber zugeordnet ist;
  • platform_data: plattformspezifische Daten von dem Gerät;
  • driver_data: Punkt treiberspezifischen private Daten;
  • of_node: Die Anzahl der Geräte und die damit verbundenen Strukturzeiger;
  • DEVt: Gerätenummer verwendet, um das Gerät zu repräsentieren;
  • devres_lock: spin Geräteressourcen Sperre Schutz;
  • devres_head: doppelt verknüpften Liste Kopf Geräteressourcen;
  • knode_class: klist Zugangsknotenlisten-Klasse erforderlich;
  • Klasse: Klassenzeiger Vorrichtung gehört;
  • Gruppen: die Eigenschaften der Sammelvorrichtung;
  • Release: Funktionszeiger, diese Funktion aufgerufen wird, wenn das Gerät Bedürfnisse freigegeben werden.

  Vorrichtungsstruktur an alle Mitgliedern der Außenwelt tun will nicht gesehen werden, so dass die abstrahierte Struktur diese Struktur device_private, die Struktur einen Link in dem Gerätetreibermodell umfasst, ist die Struktur wie folgt definiert:

struct device_private { 
    struct klist klist_children; 
    struct klist_node knode_parent; 
    struct klist_node knode_driver; 
    struct klist_node knode_bus; 
    struct listjead deferred_probe; 
    struct Gerät * Vorrichtung; 
};

  Ein Teil der Strukturelemente erklären:

  • klist_children: klist Kind Geräteliste;
  • knode_parent: klist Elternknoten ist eine Zugangsvorrichtung klist_children erforderlich;
  • knode_driver: klist Ansteuervorrichtung Zugangsknotenliste erforderlich ist;
  • knode_bus: klist Busknoten Liste der Zugangsvorrichtung erforderlich ist;
  • Gerät: eine struct Vorrichtungsstruktur Zeiger zurück.

  Vorrichtungsstruktur einen Zeiger auf eine Struktur enthält, die die Struktur DEVICE_TYPE, den Typ der Vorrichtung beschreiben, wird die Struktur wie folgt definiert:

struct device_type { 
    const char * name; 
    const struct attribute_group ** Gruppen; 
    int (* uevent) (struct Gerät * dev, struct kobj_uevent_env * env); 
    char * (* devnode) (struct Gerät * dev, umode_t * Modus 
             kuid_t * uid, kgid_t * GID); 
    void (* release) (struct Gerät * dev); 

    const struct dev_pm_ops * pm; 
};

  Diese Funktion ist ähnlich der Struktur kobj_type.

  Es ist auch eine Vorrichtung Attributstruktur, name struct device_attribute, struct Attribut weiteres Paket ist, und gibt Lese- und Schreibzeiger-Funktionsvorrichtungs-Attribut ist die Struktur wie folgt definiert:

/ * Schnittstelle zum Gerät ausführenden Attribute * / 
struct device_attribute { 
    struct Attribut attr; 
    ssize_t (* an ) (struct Gerät * dev, struct device_attribute attr *, 
            char * buf); 
    ssize_t (* store) (struct Gerät * dev, struct device_attribute attr *, 
             const char * buf, size_t count); 
};

  Einige andere Mitglieder der Struktur Vorrichtungsstruktur, wie archdata, dma und devres usw. sind nur einige der gerätespezifische Dinge, diese Diskussion nicht, diesen Artikel in erster Linie befasst sich mit grundlegenden Gerätetreibermodell zu etablieren.

 

  Transfer: https://www.cnblogs.com/Cqlismy/p/11507216.html

 

Ich denke du magst

Origin www.cnblogs.com/zhuangquan/p/12610956.html
Empfohlen
Rangfolge