Внутренние регистры: Специальные регистры модели

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Современные микропроцессоры архитектуры x86 (начиная с Pentium, Pentium Pro, AMD-K6, Cyrix MII …) имеют достаточно большое количество дополнительных регистров, выполняющих контрольные, управляющие и иные функции. Эти регистры не являются стандартными, их количество и назначение (и даже методика доступа) различны в различных моделях процессоров. В процессорах производства Intel (Pentium …) такие регистры называются особыми регистрами моделиMSR (Model Specific Registers). Для чтения и записи этих регистров используются привилегированные команды RDMSR и WRMSR. За полной информацией об этих регистрах обратитесь к техническому руководству фирмы Intel, здесь же описываются только некоторые из них.

 

Счетчик времени TSC: Pentium …

Регистр подсчета времени TSC (Time Stamp Counter) представляет собой 64-разрядный счетчик, который устанавливается в нуль при сбросе и увеличивает свое значение на 1 в каждом процессорном такте. Однако не гарантируется, что это будет так и во всех последующих модификациях процессоров, гарантируется лишь то, что значение TSC будет монотонно возрастать не менее 10-ти лет от момента сброса процессора (реально, в процессорах Pentium, … Pentium III этот промежуток составляет сотни лет). Программы не должны использовать TSC для подсчета количества тактов. Счет продолжается и в случае останова процессора командой HLT или сигналом STPCLK#.

Доступ к регистру TSC осуществляется с помощью команды RDTSC (в т.ч. и в некоторых процессорах производства Cyrix, AMD, …) или через привилегированные команды RDMSR/WRMSR (в процессорах Pentium, … Pentium III адрес MSR-регистра — 10h), но в последующих реализациях процессоров доступ через эти команды не гарантируется. Перед началом работы с TSC пользовательская программа должна определить наличие этой функциональной возможности с помощью команды CPUID (EDX, бит 4).

По умолчанию, команда RDTSC доступна во всех режимах работы процессора — реальном, защищенном на всех уровнях привилегий, виртуальном-8086. Защищенные операционные системы могут использовать бит CR4.TSD для запрета использования команды RDTSC на уровне привилегий отличном от 0 (CR4.TSD = 1). Это позволяет запретить пользовательским программам производить точный мониторинг производительности операционной системы (в обработчике прерывания общей защиты может быть реализована эмуляция данной команды).

Запись в регистр TSC с помощью команды WRMSR возможна только в младшие 32 бита регистра. Старшие 32 бита при этом расширяются нулями (все сбрасываются в 0).

 

Регистры мониторинга производительности: Pentium

Механизм мониторинга производительности процессора Pentium реализован на основе трех специальных MSR-регистров. Эти три регистра: CESR (11h), CTR0 (12h), CTR1 (13h) являются специфическими для процессора Pentium, в последующих моделях процессоров (Pentium Pro, Pentium II, Pentium III …) механизм мониторинга производительности значительно расширен и изменен.

Регистры CTR0 и CTR1 являются 40-рязрядными счетчиками. Каждый счетчик может быть запрограммирован для счета различных событий. Режимы работы счетчиков и типы считаемых ими событий устанавливаются программированием регистра CESR (Control and Event Select Register). Счетчики не изменяются при записи в регистр CESR и должны устанавливаться отдельно при переключении на новое событие. Счетчики могут работать либо в режиме счета числа событий, либо в режиме счета времени до события.

Подробную информацию об использовании регистров мониторинга производительности смотрите в технической документации фирмы Intel (Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide).

 

Регистры мониторинга производительности: Pentium Pro …

В процессорах Pentium Pro, Pentium II, Pentium III механизм мониторинга производительности включает четыре MSR-регистра: PerfEvtSel0 (186h), PerfEvtSel1 (187h), PerfCtr0 (C1h), PerfCtr1 (C2h). Регистры PerfCtl0 и PerfCtl1 — это 40-разрядные счетчики. Счетчики могут осуществлять счет различных событий или времени до события. Управление режимами работы счетчиков осуществляется программированием регистров PerfEvtSel0 и PerfEvtSel1. Для доступа к счетчикам введена новая команда RDPMC, которая позволяет считывать значения счетчиков в любом режиме работы процессора и при любом уровне привилегий, когда CR4.PCE = 1 (или только при CPL = 0, когда CR4.PCE = 0).

Регистры мониторинга производительности процессора Pentium в более поздних моделях процессоров не поддерживаются. Аналогичные регистры процессоров Pentium Pro, … Pentium III также могут быть модифицированы в последующих устройствах.

Подробную информацию об использовании регистров мониторинга производительности смотрите в технической документации фирмы Intel (Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide).

 

Регистры контроля отладки: Pentium Pro …

Регистры контроля отладки расширяют возможности процессора по отслеживанию источников возникновения ошибок, упрощают трассировку и мониторинг производительности программ. В состав регистров контроля отладки входят: управляющий регистр DebugCtlMSR (1D9h), регистры адресов последнего перехода/прерывания/особой ситуации LastBranchToIP (1DCh), LastBranchFromIP (1DBh), а также регистры адресов последнего перехода перед последним прерыванием/особой ситуацией LastExceptionToIP (1DEh), LastExceptionFromIP (1DDh). Доступ ко всем указанным регистрам осуществляется при помощи привилегированных команд RDMSR, WRMSR.

Все режимы работы регистров контроля отладки устанавливаются программированием регистра DebugCtlMSR, его формат приведен на рис.1.10.

 

Формат регистра DebugCtlMSR

Рис. 1.10. Формат регистра DebugCtlMSR

 

LBR (бит 0)

Когда флаг LBR установлен, процессор автоматически производит запись адресов источника и назначения переходов, особых ситуаций (кроме особых ситуаций отладки, #DB) и прерываний. Каждый раз, когда происходит переход, особая ситуация или прерывание, процессор записывает указатель к команде, вызвавшей переход (особую ситуацию, прерывание), в LastBranchFromIP и указатель на адрес назначения в LastBranchToIP. Кроме того, для прерываний и особых ситуаций процессор копирует содержимое LastBranchToIP и LastBranchFromIP в LastExceptionToIP и LastExceptionFromIP до записи в них новых значений. Когда процессор генерирует особую ситуацию отладки (#DB), флажок LBR автоматически очищается (перед выполнением программы реакции на особую ситуацию).

 

BTF (бит 1)

Когда флаг BTF установлен, процессор интерпретирует флаг трассировки (E)FLAGS.TF как флаг трассировки по переходам, т.е. особая ситуация отладки генерируется не после выполнения очередной команды, а после возникновения очередного перехода/прерывания/особой ситуации. Перед передачей управления в программу реакции на особую ситуацию отладки флаги DebugCtlMSR.BTF и (E)FLAGS.TF сбрасываются, так что для продолжения трассировки отладчик должен установить их вновь.

 

PB0, PB1, PB2, PB3 (биты 2, 3, 4, 5)

Биты управления выводами мониторинга производительности PM0/BP0#, PM1/BP1#, PM2/BP2#, PM3/BP3#. Когда какой-либо из битов PBi установлен, процессор ассоциирует соответствующий из выводов PMi/BPi# с контрольной точкой, заданной регистром отладки DRi. Сигнал на выводе сначала устанавливается по достижении соответствующей контрольной точки, а затем сбрасывается при ее следующей встрече и т.д. Когда флаг PBi сброшен, соответствующий вывод PMi/BPi# управляется регистрами мониторинга производительности.

 

TR (бит 6)

Бит предназначен для управления выдачей специальных сообщений трассировки внешнему устройству отладки. Сообщения трассировки представляют собой адреса источника и назначения, которые выдаются в специальных тактах на системную шину в случае возникновения перехода/прерывания/особой ситуации при DebugCtlMSR.TR = 1. Эти адреса несколько отличаются от адресов, сохраняемых в регистрах LastBranchToIP и LastBranchFromIP (подробнее смотрите в технической документации Intel — Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide).

 

Как указано выше, регистры LastBranchToIP и LastBranchFromIP служат для сохранения указателей для последнего перехода/прерывания/особой ситуации, а регистры LastExceptionToIP и LastExceptionFromIP — для сохранения указателей для последнего перехода перед последним прерыванием/особой ситуацией. Эти указатели могут быть использованы отладчиком в комбинации с селекторами сегмента кода, восстановленными из стека, чтобы отследить причины (источники) срабатывания контрольных точек в регистрах DR0...DR3. Так как указатели команды, записанные в LastBranchToIP, LastBranchFromIP, LastExceptionToIP и LastExceptionFromIP являются смещениями в сегменте кода, то для получения полного линейного адреса программное обеспечение прежде должно определить базовый адрес сегмента кода. Базовый адрес сегмента кода, в свою очередь, может быть определен чтением селектора сегмента кода из стека и использованием его для поиска дескриптора сегмента в GDT или LDT (базовый адрес сегмента содержится в его дескрипторе).