En el proceso de aprender el controlador de Linux, encontré una macro llamada contenedor

  
 

en la definición macro incluir /Linux /kernel.h, primero para poner su código:

/** * container_of - emitir un miembro de una estructura a la estructura que contiene * @ptr * @type: el tipo de la estructura del contenedor en la que está incrustado. * @member: el nombre del miembro dentro de la estructura. * * /

#define container_of (ptr, tipo, miembro) ({\\ const typeof (((tipo *) 0) - > miembro) * __ MPTR = (ptr); \\ (tipo *) ((char *) __ MPTR - offsetof (tipo, miembro));} )

Es obvio que es un puntero a una variable miembro del dominio en una variable de estructura para obtener un puntero a la variable de estructura completa. Por ejemplo, hay una estructura variable, que se define como sigue:

struct demo_struct {miembro1 tipo1; member2 type2; miembro3 Type3; member4 type4;}; struct demo_struct demostración; Mientras tanto, en otro lugar, para obtener de demostración variable de un miembro del dominio en una variable puntero, por ejemplo: tipo3 * Memp = get_member_pointer_from_somewhere (); en este caso, si toda la estructura necesita para obtener un puntero que apunte a la variable, que no es sólo un puntero a un dominio variable miembro, podemos hacer: struct demo_struct * demop = container_of (Memp, demo_struct estructura, miembro3), de esta manera, obtenemos un puntero al conjunto de la variable de estructura a través de un miembro de puntero del dominio variable de una variable de estructura. Aquí para hablar de mi comprensión de container_of lograr esto: En primer lugar, vamos a container_of (Memp, demo_struct estructura, tipo3) ser ampliado de la siguiente manera de acuerdo con la definición de la macro: struct demo_struct * demop = ({\\ const typeof (((struct demo_struct * ) 0) - > miembro3) * __ MPTR = (Memp); \\ (struct demo_struct *) ((char *) __ MPTR - offsetof (struct demo_struct, miembro3));}) donde, typeof se extiende GNU C para el estándar C Su función es obtener el tipo de variable basado en la variable. Así, el papel de la segunda fila de la código se adquiere primero el uso de campo estructura typeof para tipo de variable Type3 miembro3, entonces una variable temporal define el tipo de __mptr puntero Type3, y la estructura real de la variable de dominio de la variable El valor del puntero memp se asigna a la variable temporal __mptr.

(char *) __ mptr se convierte en un puntero de byte.
(Char *) __ PMIT - offsetof (tipo, miembro)) se utiliza para determinar la estructura de dirección de inicio (de tipo char * puntero) y (tipo *) ((char *) __ PMIT - offsetof (tipo, miembro)) en Bajo la acción de (tipo *), el puntero de inicio de la estructura de la estructura de bytes se convierte en el puntero de inicio de la estructura de tipo *.

Asumir la posición de la demo de la variable de estructura en la memoria real es como se muestra a continuación: demo + ------------- + 0xA000

Copyright © Conocimiento de Windows All Rights Reserved