2017-06-05 3 views
0

Je fais une expérience qui écrit l'index de la boucle dans un registre CPU R11, puis en le construisant avec gcc -ffixed-r11 essayer de laisser le compilateur savoir ne pas utiliser ce reg, et enfin en utilisant perf pour le mesurer.Recompiler Linux Kernel de ne pas utiliser de registre CPU spécifique

Mais lorsque je vérifie le rapport (en utilisant perf script), la valeur R11 de la plupart des entrées d'enregistrement n'est pas ce que j'attendais, c'est supposé être la séquence numérique comme 1..2.3 ou 1..4. 7, etc. Mais en réalité, il suffit d'une valeur fixe. (peut-être affecté par l'écrasement des appels système?)

Comment puis-je laisser perf enregistrer la valeur que j'ai définie dans le registre de mon programme? Ou je dois recompiler le noyau entier avec -ffixed-r11 pour réaliser?

Merci à tous.

+1

Selon les conventions d'appel utilisées, il n'est même pas possible de recompiler le noyau pour ne pas utiliser R11 sans casser quelque chose. Qu'essayez-vous vraiment de faire? – tangrs

+0

Salut, merci. Je veux utiliser des enregistrements de perf pour savoir combien de fois (et exactement dans quel nombre de boucles) mon programme déclenchera des événements de perf. –

Répondre

0

Vous ne devriez pas essayer de recompiler le noyau lorsque vous voulez juste échantillonner un registre avec perf. Si je comprends bien, le noyau a son propre ensemble de registres et ne remplacera pas l'utilisateur R11. syscall interface utilise des registres fixes qui ne peuvent pas être changés (pouvez-vous essayer reg?) Et il y a souvent des passerelles glibc à syscall qui peuvent utiliser des registres supplémentaires (ils ne sont pas dans le noyau, ils sont souvent générés ou écrit en assembleur). Vous pouvez essayer d'utiliser gdb pour surveiller le registre afin de trouver qui l'a fait. Il peut le faire (hmm, un autre lien vers le même utilisateur sur SO): gdb: breakpoint when register will have value 0xffaa comme gdb ./program puis les commandes gdb start; watch $r11; continue; where.

il y avait la question perf-report show value of CPU register l'âge de deux semaines sur l'échantillonnage de la valeur de registre avec perf:

je suis this document et en utilisant perf record avec --intr-regs=ax,bx,r15, en essayant d'enregistrer des informations registre CPU supplémentaires avec enregistrement PEBS.

Alors qu'il y avait x86 & PEBS, ARM peut avoir --intr-regs mis en œuvre aussi. Vérifiez la sortie de perf record --intr-regs=\? (man perf-record: "Pour répertorier les registres disponibles, utilisez --intr-regs=\?") pour rechercher l'état du support et les noms de registre.

Pour imprimer des registres, utilisez la commande perf script -F ip,sym,iregs. Il y avait par exemple dans certains linux engage:

# perf record --intr-regs=AX,SP usleep 1 
    [ perf record: Woken up 1 times to write data ] 
    [ perf record: Captured and wrote 0.016 MB perf.data (8 samples) ] 
    # perf script -F ip,sym,iregs | tail -5 
    ffffffff8105f42a native_write_msr_safe AX:0xf SP:0xffff8802629c3c00 
    ffffffff8105f42a native_write_msr_safe AX:0xf SP:0xffff8802629c3c00 
    ffffffff81761ac0 _raw_spin_lock AX:0xffff8801bfcf8020 SP:0xffff8802629c3ce8 
    ffffffff81202bf8 __vma_adjust_trans_huge AX:0x7ffc75200000 SP:0xffff8802629c3b30 
    ffffffff8122b089 dput AX:0x101 SP:0xffff8802629c3c78 
    # 
0

Si vous avez besoin cycle de profil précis de l'activité CPU métal alors perf n'est pas le bon outil, car il est au mieux une approximation en raison du fait il ne fait qu'échantillonner la programme à des points choisis. Voir this video on perf by Clang developer Chandler Carruth. Au lieu de cela, vous devriez faire un pas à travers le programme afin de surveiller exactement ce qui arrive aux registres. Ou vous pouvez programmer votre système sans système d'exploitation, mais c'est probablement hors de la portée ici.

+0

https://www.youtube.com/watch?v=nXaxk27zwlk "CppCon 2015: Chandler Carruth" Optimisation C++: benchmarks, processeurs et compilateurs! Oh My! "" La vidéo est intéressante, merci! Mais comment peut-il aider à trouver des valeurs de registre? – osgx

+1

@osgx ça n'aide pas, ce qui est précisément mon point de vue. Perf échantillonne seulement les registres à certains intervalles de sorte que vous manquerez inévitablement beaucoup de choses qui se passent entre les deux. –