Linux kernel 重新编译Linux内核以不使用特定的CPU寄存器

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对一些寄存器

我正在做一个实验,将循环的索引写入CPU寄存器R11,然后使用
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只在特定的时间间隔对寄存器进行采样,因此您将不可避免地错过其间发生的许多事情。