Определение, когда стек LBR заполнен
Я начну с некоторой предыстории проекта, в который я вовлечен. Мы пытаемся написать модуль ядра Linux (в ядре 3.5), который включит функцию последней записи ветвления (LBR), присутствующую в некоторых новых процессорах x86. и записать данные ветви в файл на жестком диске для последующего анализа.
В настоящее время мы смогли включить LBR и увидеть, как LBR Top of Stack Pointer изменяется при обнаружении ветвей (поэтому мы знаем, что LBR был включен).
Наша проблема заключается в том, что мы не можем понять, как определить, когда стек LBR заполняется, чтобы мы могли считывать данные с него и записывать их на жесткий диск. В идеале мы хотели бы включить опцию в LBR для выдачи исключения, когда стек LBR близок к полному, и написать обработчик, который извлекает информацию.
Пока что самое близкое, что мне удалось найти, это установить 8-й бит в MSR IA32_DEBUGCTL, который позволяет генерировать прерывание каждый раз, когда обнаруживается ветвление. К сожалению, запись на диск каждый раз, когда происходит ветвление, создает большее влияние на производительность, чем нам бы хотелось. Мы бы предпочли записывать данные в пакетах каждый раз, когда стек LBR заполнен, а не в каждой отдельной ветви. Есть ли какие-то альтернативы, которые мне не хватает, или нам просто нужно кусать пули и записывать на диск после каждой ветки?
Спасибо
1 ответ
Вы должны быть в состоянии прочитать TOS, когда вы хотите начать запись, а затем проверить, совпадает ли TOS с этим исходным значением во время прерывания, чтобы определить, заполнен ли стек новыми записями и выполняется ли только одна запись на диск на полный стек. Другой альтернативой, если вы готовы потерять некоторые ранние записи, будет просто запись на диск, только когда TOS равен некоторому произвольному значению в диапазоне значений, что приводит к одной записи на диск на полный стек.
Одной из проблем может быть то, что сами прерывания помещаются в стек LBR, поскольку они рассматриваются как переходы, но я не уверен, как это будет работать на основе разных уровней разрешений.