Linux kernel 重新编译Linux内核以不使用特定的CPU寄存器
我正在做一个实验,将循环的索引写入CPU寄存器R11,然后使用Linux kernel 重新编译Linux内核以不使用特定的CPU寄存器,linux-kernel,cpu-registers,perf,Linux Kernel,Cpu Registers,Perf,我正在做一个实验,将循环的索引写入CPU寄存器R11,然后使用gcc-ffix-R11构建它,尝试让编译器知道不要使用该寄存器,最后使用perf来测量它 但是当我检查报告时(使用perf script),大多数记录条目的R11值不是我所期望的,它应该是数字序列,如1..2..3或1..4..7等,但实际上它只是一些固定值。(可能受系统调用覆盖的影响?) 如何让perf记录我在程序中设置到寄存器的值?或者我必须用-ffix-r11重新编译整个内核才能实现 谢谢大家。当您只想使用perf对一些寄存器
gcc-ffix-R11
构建它,尝试让编译器知道不要使用该寄存器,最后使用perf来测量它
但是当我检查报告时(使用perf script
),大多数记录条目的R11值不是我所期望的,它应该是数字序列,如1..2..3或1..4..7等,但实际上它只是一些固定值。(可能受系统调用覆盖的影响?)
如何让perf记录我在程序中设置到寄存器的值?或者我必须用-ffix-r11
重新编译整个内核才能实现
谢谢大家。当您只想使用perf对一些寄存器进行采样时,不应该尝试重新编译内核。据我所知,内核有自己的寄存器集,不会覆盖用户R11<代码>系统调用接口使用一些无法更改的固定寄存器(您可以尝试不同的寄存器吗?),并且系统调用通常有glibc网关,它们可能使用一些额外的寄存器(它们不在内核中,它们是用户空间代码;通常在汇编程序中生成或写入)。您可以尝试使用gdb来监视注册表以更改以查找是谁做的。它可以做到这一点(嗯,还有一个指向同一用户的链接):像
gdb./program
然后gdb命令start;手表$r11;继续;其中
两周后,出现了关于使用perf进行寄存器值采样的问题:
我跟随并使用perf record
和--intr regs=ax、bx、r15
,试图用PEBS记录记录额外的CPU寄存器信息
虽然有x86和PEB,ARM可能也实现了--intr regs
。检查perf record--intr regs=\?
(:“要列出可用寄存器,请使用--intr regs=\?
”)的输出以查找支持状态和寄存器名称
要打印寄存器,请使用perf script-F ip、sym、iregs
命令。在一些linux提交中有一个示例:
# 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
#
如果您需要对金属CPU活动进行周期精确配置,那么perf不是正确的工具,因为它最多是一个近似值,因为它只在选择点对程序进行采样。看
相反,您应该单步执行程序,以便准确地监视寄存器发生的情况。或者您可以在没有操作系统的情况下对系统进行裸机编程,但这可能超出了本文的范围 根据使用的调用约定,甚至可能无法重新编译内核以不使用R11而不破坏某些东西。你到底想干什么?嗨,谢谢。我想使用perf记录来了解我的程序触发perf事件的频率(以及具体发生的循环数)。“CppCon 2015:Chandler Carruth”调优C++:基准测试、CPU和编译器!天哪!“视频很有趣,谢谢!但是它如何帮助查找寄存器值呢?@osgx它没有帮助,这正是我的观点。Perf只在特定的时间间隔对寄存器进行采样,因此您将不可避免地错过其间发生的许多事情。