111 votes

Comprendre la macro container_of dans le noyau Linux

Quand je parcourais le noyau Linux, j'ai trouvé une container_of qui est définie comme suit :

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

Je comprends ce que fait container_of, mais ce que je ne comprends pas, c'est la dernière phrase, qui est la suivante

(type *)( (char *)__mptr - offsetof(type,member) );})

Si nous utilisons la macro comme suit :

container_of(dev, struct wifi_device, dev);

La partie correspondante de la dernière phrase serait :

(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);

ce qui ressemble à ne rien faire. Quelqu'un peut-il combler ce vide ?

4voto

Anand Kumar Points 21

Lien très utile pour comprendre la macro container_of dans le noyau linux. https://linux-concepts.blogspot.com/2018/01/understanding-containerof-macro-in.html

1voto

Alok Prasad Points 198

L'implémentation la plus simple de la macro Container _of est ci-dessous, elle réduit toute vérification complexe du type et fonctionne.

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member))) 

ptr donnera l'adresse du membre et il suffit de soustraire la différence de décalage et vous aurez l'adresse de départ.

Exemple d'utilisation

struct sample {
    int mem1;
    char mem2;
    int mem3;
};
int main(void)
{

struct sample sample1;

printf("Address of Structure sample1 (Normal Method) = %p\n", &sample1);
printf("Address of Structure sample1 (container_of Method) = %p\n", 
                        container_of(&sample1.mem3, struct sample, mem3));

return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X