2016-04-20 25 views
2

Ich habe einen Zeichentreiber namens drv1, und eine Benutzeranwendung verwendet ioctl, um damit zu kommunizieren, die den Parameter struct file *filp übertragen wird. Jetzt möchte ich die Adresse des Codesegments von drv1 herausfinden, aber ich stieß auf einige Probleme.Wie finde ich das Code-Segment eines Linux-Treibers in tmpfs? (in Echtzeit)

Zuerst, ich denke, struct file *filp könnte nützlich sein, so schaute ich auf die Definition im Quellcode, und finde einen Zeiger struct inode *f_inode; /* cached value */. Dann habe ich grob die Definition von struct inode durchsucht (ich bin mir nicht sicher, ob es richtig ist, da ich nicht vertraut bin, wenn tmpfs); ein Zeiger namens struct address_space * i_mapping scheint zu sein, was ich brauche. Aber ich weiß nicht, wie ich tiefer graben und stecken bleiben kann; gibt es einige komplizierte Datenstrukturen in der struct address_space, wie zum Beispiel:

struct radix_tree_root page_tree; /* radix tree of all pages */ 

und

struct rb_root i_mmap;   /* tree of private and shared mappings */ 

es bedeutet, dass die Daten des Fahrers drv1 als Form radix_tree_root organisiert ist? Oder bedeutet es, dass ich etwas anderes verpasst habe?

Antwort

0

Es scheint, dass für Module, die als LKM gebaut werden, wird der Speicher zwischen MODULES_VADDR und MODULES_END dynamisch zugewiesen (siehe module.c in arch/($YOUR_ARCH)/kernel/module.c). Ich kann die Startadresse seiner Funktion Adresse mit einem Shell-Befehl , aber keine gute Methode, um es in meinem Code noch zu tun.

Wie für Module, die in das Kernel-Image integriert sind, gibt die System.map-Datei die Informationen. Wie auch immer, ich weiß nicht, wie ich die Adresse dynamisch im Code finde.