Перекомпилируйте ядро ​​​​Linux, чтобы не использовать определенный регистр ЦП

Я делаю эксперимент, который записывает индекс цикла в регистр ЦП R11, затем создает его с помощью gcc -ffixed-r11, пытаясь сообщить компилятору, что он не использует этот регистр, и, наконец, используя perf для его измерения.

Но когда я проверяю отчет (используя perf script), значение R11 для большинства записей записи не то, что я ожидал, это должна быть последовательность чисел, например 1..2..3 или 1..4..7 и т. д. Но на самом деле это всего лишь несколько фиксированных значений. (возможно, на это повлияла перезапись системного вызова?)

Как я могу позволить perf записывать значение, которое я установил в регистр в моей программе? Или я должен перекомпилировать все ядро ​​​​с -ffixed-r11 для достижения?

Всем спасибо.


person Alex Will    schedule 05.06.2017    source источник
comment
В зависимости от используемых соглашений о вызовах может быть даже невозможно перекомпилировать ядро, чтобы оно не использовало R11, не сломав что-то. Что вы действительно пытаетесь сделать?   -  person tangrs    schedule 05.06.2017
comment
Привет спасибо. Я хочу использовать записи производительности, чтобы знать, как часто (и точно в каком количестве циклов) моя программа будет запускать события производительности.   -  person Alex Will    schedule 05.06.2017


Ответы (2)


Вы не должны пытаться перекомпилировать ядро, если вы просто хотите попробовать какой-то регистр с помощью perf. Насколько я понимаю, ядро ​​имеет свой собственный набор регистров и не перезапишет пользователя R11. syscall интерфейс использует некоторые фиксированные регистры, которые нельзя изменить (вы можете попробовать другой регистр?), и часто существуют шлюзы glibc для системного вызова, которые могут использовать некоторые дополнительные регистры (их нет в ядре, это код пользовательского пространства; часто генерируются или написан на ассемблере). Вы можете попробовать использовать gdb для отслеживания изменений в реестре, чтобы найти, кто это сделал. Он может сделать это (хм, еще одна ссылка на того же пользователя на SO): gdb: точка останова, когда регистр будет иметь значение 0xffaa например, gdb ./program, тогда gdb выполняет команду start; watch $r11; continue; where.

Две недели назад возник вопрос perf-report show value of the CPU register о выборке значения регистра с помощью perf:

Я следую этому документу и использую perf record с --intr-regs=ax,bx,r15, пытаясь зарегистрировать дополнительную информацию о регистре ЦП с записью PEBS.

В то время как были x86 и 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
  #
person osgx    schedule 08.06.2017

Если вам нужен точный профиль активности центрального процессора с точностью до цикла, тогда perf не является подходящим инструментом, так как это в лучшем случае приближение из-за того, что он производит выборку программы только в выбранных точках. Посмотрите это видео о производительности от разработчика Clang Чендлера Каррута.

Вместо этого вы должны выполнить программу за один шаг, чтобы точно отслеживать, что происходит с регистрами. Или вы можете запрограммировать свою систему на «голое железо» без ОС, но это, вероятно, выходит за рамки здесь.

person Tony K    schedule 08.06.2017
comment
youtube.com/watch?v=nXaxk27zwlk CppCon 2015: Chandler Carruth Tuning C++: Benchmarks , и процессоры, и компиляторы! О боже! видео интересное, спасибо! Но как это может помочь найти значения регистров? - person osgx; 08.06.2017
comment
@osgx это не помогает, и это именно моя точка зрения. Perf сэмплирует регистры только через определенные промежутки времени, поэтому вы неизбежно пропустите много вещей, которые происходят между ними. - person Tony K; 20.06.2017