2017-06-05 64 views
0

我正在做一個實驗,將循環索引寫入CPU寄存器R11,然後用gcc -ffixed-r11編譯它,試圖讓編譯器知道不要使用該reg,最後使用perf來衡量它。重新編譯Linux內核不使用特定的CPU寄存器

但是,當我檢查報告(使用perf script),大多數記錄條目的R11值不是我所期望的,它應該是數字序列,如1..2..3或1..4 .. 7等,但實際上它只是一些固定值。 (可能受系統調用覆蓋影響?)

我如何讓perf記錄我設置到我的程序中的寄存器的值?或者我必須用-ffixed-r11來重新編譯整個內核才能實現?

謝謝大家。

+1

根據所使用的調用約定,甚至可能無法重新編譯內核,以便在不破壞某些內容的情況下不使用R11。你真的想做什麼? – tangrs

+0

嗨,謝謝。我想使用perf的記錄來知道我的程序觸發perf事件的頻率(以及確切發生在哪個循環數)。 –

回答

0

當你只是想用perf來取樣一些寄存器時,你不應該嘗試重新編譯內核。據我所知,內核擁有自己的一組寄存器,不會覆蓋用戶R11。 syscall接口使用了一些固定的寄存器,這些寄存器是不能改變的(你可以嘗試不同的寄存器嗎?),並且通常有glibc網關給系統調用,這可能會使用一些額外的寄存器(它們不在內核中,它們是用戶空間代碼;或用匯編寫成)。您可以嘗試使用gdb來監視寄存器以更改以查找是誰執行的。它可以做到這一點(嗯,多一個鏈接到SO上的同一用戶):gdb: breakpoint when register will have value 0xffaagdb ./program然後gdb命令start; watch $r11; continue; where

兩個星期的年齡有問題perf-report show value of CPU register約寄存器的值與採樣PERF:

我跟着this document和使用perf record--intr-regs=ax,bx,r15,嘗試登錄額外的CPU註冊PEBS記錄信息。

雖然有PEBS,但是ARM也可能有--intr-regs。檢查輸出perf record --intr-regs=\?man perf-record:「列出可用的寄存器使用--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 
    # 
0

如果你需要的金屬CPU活動週期準確的個人資料,然後PERF是不正確的工具,因爲它是最好的近似由於只樣本程序在選擇點。請參閱this video on perf by Clang developer Chandler Carruth

相反,您應該單步執行該程序,以便準確監視寄存器發生了什麼。或者你可以在沒有操作系統的情況下編程你的系統裸機,但這可能在此範圍之外。

+0

https://www.youtube.com/watch?v=nXaxk27zwlk「CppCon 2015:Chandler Carruth」調優C++:基準,CPU和編譯器!哦,我的!「」視頻很有趣,謝謝!但如何找到寄存器值呢? – osgx

+1

@osgx它沒有幫助,這正是我的觀點。 Perf只以特定的時間間隔對寄存器進行採樣,因此您將不可避免地錯過許多在其間進行的操作。 –