1

ftrace est utilisé pour le traçage de la fonction du noyau. Maintenant, comment ça marche pour les interruptions. Peut-il suivre les fonctions du noyau en mode interruption. Si oui, pouvez-vous expliquer comment cela fonctionne? J'essaye d'écrire une fonction qui suit des appels de fonction et cela fonctionne très bien dans le mode de superviseur mais ne fonctionne pas dans le mode d'interruption (entre dans la boucle). Je dois le faire fonctionner en mode IRQ.Comment ftrace suit-il les routines de service d'interruption?

+0

Ceci est une ligne de ma sortie de trace (système x86) lorsque je fais une trace de fonction sur "* _irq_handler": "Xorg-1448 [000] dh 830819.774909: ironlake_irq_handler <-__ handle _irq_event_percpu". Le "h" signifie que c'est dans un contexte hardirq. Est-ce que cela répond à votre deuxième question? Et pourriez-vous s'il vous plaît développer le premier? – michaeljt

Répondre

1

Comme dans Linux kernel ARM exception stack init détails, la quantité de pile IRQ utilisée par Linux est minime. ARM a plusieurs registres en banque, y compris lr et sp pour les modes IRQ. Dans le noyau Linux ARM, ces registres ne sont utilisés que brièvement pour transférer des informations à la pile superviseur (8K). Cette pile de superviseur est d'allouer par processus du noyau et contiennent également un bloc de contexte de tâche avec des pointeurs vers le gestionnaire de mémoire , planificateur et système de fichiers d'information. Par conséquent, sous Linux, la pile superviseur a les informations de pile pour tous les modes, y compris FIQ, IRQ, instruction non définie, données et erreurs d'instructions. Cela signifie qu'une seule pile doit être tracée. Des informations spéciales (pseudo assembleur) sont incluses dans entry-armv.S, telles que UNWIND(.fnend) et ENDPROC(__irq_usr) qui annotent le noyau avec des informations ELF pour créer des tables de déroulement qui permettent au code de trace de la pile de comprendre la disposition des données sur la pile.

Vector page mapping in ARM Linux a quelques détails supplémentaires tels que la macro assembleur vector_name qui effectue la commutation pile/mode. La macro assembleur vector_name est le seul code qui s'exécute réellement en mode IRQ. irq_usr et irq_svc s'exécuter en mode superviseur, avec la pile superviseur.

+0

Comment ftrace imprime le nom de la fonction à partir de la pile.Pouvez-vous me diriger vers la partie implémentation du nom de la fonction d'impression dans ftrace (je veux dire le code). J'ai vérifié le fichier ftrace.c dans la source du noyau mais je n'ai pas pu le comprendre. – karthikpj

+0

Le [piletrace.c] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/stacktrace.c?id=refs/tags/ v4.10-rc3) effectue une trace de pile avec des décalages standard selon [ARM lr et fp] (http://stackoverflow.com/questions/15752188/arm-link-register-and-frame-pointer/15752671#15752671) . [unwind.c] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/unwind.c?id=refs/tags/v4. 10-rc3) est une version plus moderne où le PC et les tables sont consultés pour déterminer la fonction. –

+0

[ftrace-design] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/Documentation/trace/ftrace-design.txt) par Mike Frysinger a plus de détails et devrait être à jour pour votre version du noyau. –