2015-09-17 2 views
2

Возможно ли запланировать задание для выполнения точно машинных инструкций n, прежде чем управление будет возвращено пользователю?Позволяет выполнить задание для фиксированного количества инструкций?

Мотивацией для этого вопроса является отладка многопоточных программ, где это может быть полезно для надежного воспроизведения определенных ошибок или неопределенного поведения.

Меня особенно интересует случай x86_64-linux, работающий на процессоре Intel, но также интересны решения для других архитектур или операционных систем.

Документация для ядра perf пакета говорит

счетчики производительности специальные регистры аппаратных средств, доступных на большинстве современных процессоров. Эти регистры подсчитывают количество определенных типов событий hw: в качестве инструкций, выполненных cachemisses, или неверно предсказанных ветвей - без замедления ядра или приложений. Эти регистры могут также триггерные прерывания при прохождении порогового числа событий.

так что аппаратное обеспечение может поддерживать это в принципе, но я не уверен, что это каким-либо образом раскрывается пользователю.

Конечно, можно просто использовать ptrace для однократного запуска программы n раз, но это сделало бы все, кроме самых простых программ, невероятно медленными.

+2

Я подвергаю сомнению уместность простой инструкции подсчета на конвейерном суперскаляра вне порядка центрального процессора с кэшами многоуровневыми, модель памяти непоследовательный-conistency и переменной частотой процессора. – EOF

+0

Шип или трудность заключается в том, что большинство процессоров имеют средства для прерывания по времени (обычно, когда таймер истекает), а не для подсчета команд. Вам нужно будет проверить свою платформу, чтобы узнать, какие средства существуют для подсчета команд. Затем проверьте, поддерживает ли ваша ОС API-интерфейс или обработчик прерываний (ISR вызывается, когда счетчик команд переходит к нулю). –

ответ

1

Один простой способ обеспечить точный подсчет выполненных инструкций - использовать код сборки и поддерживать счетчик выполнения. Я считаю, что самый простой способ сделать аппаратуру - Pin (https://software.intel.com/en-us/articles/pintool).

идея Высокого уровня: - интерпретировать машинный код и поддерживать счетчик количества выполняемых инструкций,

  • после каждой инструкции вы увеличиваете счетчик и проверить, если это время для точки останова,

  • счетчик сброса после каждой точки останова.

Идея интерпретации представила бы довольно много накладных расходов. Я вижу несколько простых оптимизации:

  • Instrument бинарного статический (создать новый двоичный файл, где все эти приращения/проверки жесткие кодированные). Такой подход позволит устранить накладные расходы на аппаратуру/интерпретацию. Вы можете рассматривать инструкции, связанные с контрольными/контрольными точками, в качестве дополнительных инструкций, или игнорировать их из подсчета.

  • Приращения/проверки могут быть более функционально реализованы. Представьте, что у нас есть набор инструкций без прыжков/ветвей, которые вы можете сделать одним приращением и одной проверкой. Эта идея проста, но может оказаться довольно сложной на практике, особенно если вам нужна абсолютно точная точка останова.