Heim > Betrieb und Instandhaltung > Betrieb und Wartung von Linux > Grundlagen des Linux-Kernels – Container_of-Prinzip und praktische Anwendung

Grundlagen des Linux-Kernels – Container_of-Prinzip und praktische Anwendung

Freigeben: 2023-07-31 15:46:13
nach vorne
1135 Leute haben es durchsucht

Häufig im Linux-Kernel zu sehen, 35, 0.05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: Break-All;Farbe: RGB(239, 112, 96); ">container_of Abbildung, wird auch häufig beim Schreiben tatsächlicher Treiber verwendet. 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) );})
Nach dem Login kopieren
  • ptr:结构体成员变量的指针
  • type:结构体类型
  • member:结构体成员变量的名字

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

container_of Prinzip

Funktion

: durch die Struktur A< Die starke>Mitgliedsvariable Adresse 🎜 findet die erste Adresse 🎜 der Struktur. 🎜🎜Es ist wie folgt definiert: 🎜
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Nach dem Login kopieren
Nach dem Login kopieren
  • ptr: Zeiger auf Strukturelementvariablen
  • < section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">type: structure type
  • member: der Name der Strukturmitgliedsvariablen
  • 🎜Mit anderen Worten, es heißt: < strong>bereits bekannte StrukturMember of type< Codestil ="Schriftgröße: 14px;Padding: 2px 4px;Randradius: 4px;Rand rechts: 2px;Rand links: 2px;Hintergrundfarbe: rgba(27, 31, 35, 0,05);font- Familie: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>Mitglieds Adresse ptr, Struktur lösen< 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- Familie: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>types Startadresse 🎜. 🎜

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

    以一幅图说明ptrtypemember的关系:

    Grundlagen des Linux-Kernels – Container_of-Prinzip und praktische Anwendung
    • 原理简述:

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

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

    以一幅图说明typemember的关系:🎜
    Grundlagen des Linux-Kernels – Container_of-Prinzip und praktische Anwendung
    • 原理简述:
    🎜container_of的妙处就在于🎜以0作为成员变量member的基址
    。🎜🎜其中定义了一个中间变量__mptr,"__"代表内部使用,“m”代表
    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
    Nach dem Login kopieren
    Nach dem Login kopieren

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

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

    Das obige ist der detaillierte Inhalt vonGrundlagen des Linux-Kernels – Container_of-Prinzip und praktische Anwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:嵌入式Linux充电站
    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
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage