Драйвер обеспечивает загрузку необходимого кода
Драйвер обеспечивает загрузку необходимого кода события в соответствующий MSR-регистр (PerfEvtSel0 или PerfEvtSel1) и запускает счетчик, предварительно "разблокировав" команду RDPMC.
Поскольку, RDPMC способна читать только один счетчик (а нам необходимо отслеживать по меньшей мере два события — промахи кэш памяти кода и данных), драйвер должен обеспечивать IOCTL-интерфейс с прикладным приложением, позволяя ему переключаться с одного счетчика на другой.
Чтобы не переводить понапрасну бумагу, ниже будут приведены только ключевые фрагменты кода, а все остальное читатель без труда допишет и сам. В частности, процедура инициализации драйвера среди прочего должна содержать:
DriverInitialize: ; // процедура инициализации драйвера
…
MOV EAX, CR4
OR EAX, 100h ; // разрешаем доступ к RDPMC с прикладного уровня
MOV CR4, EAX
…
Листинг 3 фрагмент процедуру инициализации драйвера
Следующий код обеспечивает взаимодействие драйвера с прикладной программой через API-функцию
DeviceIOControl, передающий в IOCTL-коде номер события, за которым необходимо вести мониторинг. По соображениям наглядности, здесь используется всего лишь один счетчик производительности, управляемый MSR-регистром PerfEvtSel0.
IRP_MJ_DEVICE_CONTROL: ; // процедура обработки IOCTL-запросов
; // настраиваем регистр perfevtsel0 для мониторинга нужных событий
XOR EDX, EDX
MOV EAX, pisl->Parameters.DeviceIoControl.IoControlCode ; //номер события
TEST EAX, EAX ; // если код события равен нулю
JZ wrt ; // то вырубаем счетчик
OR EAX, 10000h ; // делаем счетчик доступным
; // с прикладного уровня
OR EAX, 400000h ; // пускаем счетчик
wrt:
MOV ECX,0x186 ; // выбираем MSR-регистр PERFEVTSEL0
WRMSR
Листинг 4 фрагмент драйвера, отвечающий за выбор нужного события
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий