Ein wenig realer Kontext sagt klarer, unter Verwendung rot-schwarz-Baum als Beispiel, die das ist Weise, die ich verstehe container_of
.
als Documentation/rbtree.txt
Staaten, in Code Linux-Kernel, es ist nicht Eintrag enthält Daten rb_node, eher
Datenknoten in einem rbtree Baum sind Strukturen ein Mitglied struct rb_node enthalten.
struct vm_area_struct
(in Datei include/linux/mm_types.h:284
) ist eine solche Struktur,
in derselben Datei gibt ein Makro rb_entry
ist, die eindeutig als
#define rb_entry(ptr, type, member) container_of(ptr, type, member)
definiert ist, ist rb_entry
gleiche wie container_of
.
bei mm/mmap.c:299
innen Funktionsdefinition browse_rb
, gibt es eine Verwendung von rb_entry
:
static int browse_rb(struct mm_struct *mm)
{
/* two line code not matter */
struct rb_node *nd, *pn = NULL; /*nd, first arg, i.e. ptr. */
unsigned long prev = 0, pend = 0;
for (nd = rb_first(root); nd; nd = rb_next(nd)) {
struct vm_area_struct *vma;
vma = rb_entry(nd, struct vm_area_struct, vm_rb);
/* -- usage of rb_entry (equivalent to container_of) */
/* more code not matter here */
jetzt klar ist, in container_of(ptr, type, member)
,
type
der Container-Struktur ist, hier struct vm_area_struct
member
ist der Name eines Mitglieds von type
Instanz, hier vm_rb
, die rb_node
vom Typ ist,
ptr
ist ein Zeiger member
ein type
Beispiel zeigt, hier rb_node *nd
.
was container_of
tun ist, wie in diesem Beispiel
- angegebene Adresse von
obj.member
(hier obj.vm_rb
), kehren die Adresse obj
.
- da ein struct ist ein Block von zusammenhängendem Speicher, Adresse
obj.vm_rb
minus offset between the struct and member
wird der Behälter Adresse sein.
include/linux/kernel.h:858
- Definition von container_of
include/linux/rbtree.h:51
- Definition von rb_entry
mm/mmap.c:299
- Nutzung von rb_entry
include/linux/mm_types.h:284
- struct vm_area_struct
Documentation/rbtree.txt:
- Dokumentation der rot-schwarzen Baum
include/linux/rbtree.h:36
- Definition von struct rb_node
P. S.
Die obigen Dateien sind in der aktuellen Entwicklungsversion, d. H. 4.13.0-rc7
.
file:k
bedeuten kth Linie in file
.
[diese Antwort] (https://stackoverflow.com/a/45923596/3625404) hat ** ein echtes und intuitives Beispiel ** mit dem rot-schwarzen Baum 'rb_node'. – qeatzy