Внутренние регистры: Управляющие регистры

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

 

Управляющие регистры впервые введены в микропроцессоре Intel386. Ранее в Intel286 имелось так называемое слово состояния машины, которое для сохранения совместимости целиком помещено в управляющий регистр CR0. Практически все режимы и специальные возможности микропроцессора устанавливаются определенными флагами в управляющих регистрах.

Доступ к управляющим регистрам возможен с помощью команд: MOV CR, SMSW, LMSW, CLTS. Формат управляющих регистров представлен на рис. 1.8.

 

Формат управляющих регистров

Рис. 1.8. Формат управляющих регистров

 

Регистр CR0

Первые 16 бит регистра CR0 называются словом состояния машины (MSW). Слово состояния машины впервые появилось в процессоре Intel286. В более поздних процессорах оно является лишь частью управляющего регистра CR0 и сохранено для совместимости. Биты NE, WP, AM, NW, CD были введены в регистр CR0 начиная с процессоров Intel486.

 

PE (Разрешение защиты, бит 0: Intel286 …)

Бит PE (Protection Enable) предназначен для переключения режимов работы процессора — режима реальной адресации и защищенного режима. При сброшенном PE процессор работает в режиме реальной адресации, при установленном — в защищенном режиме (включая режим V86).

Бит PE можно установить загрузкой слова состояния машины MSW с помощью команды LMSW или всего регистра CR0 командой MOV CR.

Сбросить PE можно только загрузкой CR0 командой MOV CR. В целях прямой совместимости с Intel286 бит PE не может быть сброшен командой LMSW.

 

MP (Слежение за сопроцессором, бит 1: Intel286 …)

В процессорах Intel286 и Intel386 используется совместно с битом TS для определения — будет ли команда WAIT генерировать особую ситуацию #NM (сопроцессор отсутствует); ловушка генерируется при установленных MP и TS. При запуске программ процессоров Intel286 и Intel386 на процессорах со встроенным сопроцессором (Intel486DX, Pentium, …) бит MP должен быть установлен; в случае процессора Intel486SX (нет встроенного сопроцессора) бит MP должен быть сброшен.

 

EM (Эмуляция сопроцессора, бит 2: Intel286 …)

Установка этого бита вызывает генерацию особой ситуации #NM (сопроцессор отсутствует) всеми кодами команд сопроцессора. Значение EM не влияет на выполнение команды WAIT.

 

TS (Задача переключена, бит 3: Intel286 …)

Процессор устанавливает флаг TS при каждом переключении задач и анализирует его при поступлении команд сопроцессора, команд MMX/3DNow! и SIMD. Это делается для исключения исполнения этих команд над данными, перекочевавшими из другой задачи. Команда CLTS очищает этот бит.

 

ET (Тип сопроцессора, бит 4: Intel386, Intel486SX)

При ET = 1, используется 32-битный протокол Intel387. При ET = 0, используется 16-битный протокол Intel287. При необходимости может быть сброшен или установлен загрузкой CR0. В целях прямой совместимости с Intel286 не изменяется командой LMSW. В процессорах современных модификаций (Pentium …) данный бит считается зарезервированным (ET = 1).

 

NE (Ошибка сопроцессора, бит 5: Intel486 …)

Бит предназначен для управления режимом реагирования на ошибки сопроцессора. Если NE установлен, действует внутренний механизм, обеспечивающий генерацию ошибки сопроцессора #MF сразу по поступлении очередной команды FPU/MMX/3DNow! вслед за командой, вызвавшей незамаскированное исключение (с помощью регистра управления сопроцессора CW можно замаскировать все исключения).

Если NE сброшен, реакция на исключительния FPU происходит в так называемом стиле MS-DOS, который предполагает обработку ошибок сопроцессора через вызов внешнего прерывания. В этом режиме задействуются специальные выводы FERR# и IGNNE# (вывод FERR# аналогичен выводу ERROR# сопроцессоров Intel287 и Intel387 и обычно подключается к внешнему программируемому контроллеру прерываний).

Механизмы реакции различных моделей процессоров и сопроцессоров на возникновение исключительных ситуаций сопроцессора обладают некоторыми специфическими особенностями, варьирующимися от модели к модели. Подробное описание всех этих особенностей приведено в Intel 64 and IA-32 Architectures Developer's Manual: Vol. 1

 

WP (Защита записи, бит 16: Intel486 …)

Установка этого бита позволяет защитить страницы пользовательского уровня (которые определены как страницы только для чтения) от изменения их программой супервизором, работающей на более высоком уровне привилегий. Если этот бит сброшен, то супервизор может осуществлять запись в страницы пользовательского уровня защищенные от записи.

 

AM (Маска выравнивания, бит 18: Intel486 …)

Этот бит позволяет осуществлять контроль выравнивания, если он установлен. Если бит AM сброшен, контроль выравнивания запрещен. Контроль выравнивания осуществляется, только если установлены бит AM, флаг AC и CPL = 3 (режим пользователя). При этом генерируется особая ситуация контроля выравнивания (#AC), если происходит обращение к невыровненному операнду, например, к слову по нечетному адресу или к двойному слову по адресу не кратному четырем.

 

NW (Запрет сквозной записи, бит 29: Intel486 …)

Предназначен для управления встроенным КЭШ. Если этот бит сброшен, то сквозная запись (write-through) и циклы недействительности КЭШ разрешены. Если бит установлен, то сквозная запись и циклы недействительности запрещены. При NW = 1 бит CR3.PWT и биты PWT в таблицах страничных преобразований игнорируются.

 

CD (Разрешение работы КЭШ, бит 30: Intel486 …)

Если CD = 0, работа внутреннего КЭШ (L1 и L2) разрешена, иначе — запрещена. Если работа внутреннего КЭШ запрещена, но он содержит некоторое количество достоверных данных, то при обращении к памяти данные поступают из КЭШ при попадании или извне при промахе. Во время записи ситуация аналогичная, т.е. когда записываются данные попадающие в КЭШ, то они сперва записываются в КЭШ, а затем методом обратной записи (Write-back) — в память (соответстующие ячейки КЭШ после этого считаются недействительными), а если нет попадания в КЭШ, то запись производится непосредственно во внешнюю память. Для предотвращения использования КЭШ, когда CD = 1, необходимо определить его как недействительный. Биты CR3.PCD и CR3.PWT, а также аналогичные биты PCD и PWT в элементах таблиц страничных преобразований при отключенном КЭШ игнорируются.

 

PG (Включение страничного механизма, бит 31: Intel386 …)

Если PG = 1, то страничный механизм включен, иначе — выключен. Бит PG может использоваться только в защищенном режиме работы процессора (CR0.PE = 1). Попытка установить этот бит в реальном режиме адресации приводит к генерации ошибки общей защиты (#GP).

 

Регистр CR2

Если включен механизм страничной адресации (CR0.PG = 1), и генерируется особая ситуация 14 (Страничная ошибка), то регистр CR2 будет содержать полный 32-разрядный линейный адрес, поступление которого в блок страничной адресации вызвало эту ошибку.

 

Регистр CR3

При включенном страничном механизме регистр CR3 (а именно, 20 его старших бит) содержит 20 старших бит физического адреса каталога страниц (младшие 12 бит 32-разрядного адреса каталога страниц принимаются равными 0). Иногда CR3 называют регистром базы каталога страниц (PDBR). Начиная с процессора Intel486 используется еще два бита этого регистра (PWT, PCD), которые управляют кэшированием страниц. В процессорах начиная с Pentium, которые поддерживают расширения физического адреса (управляются битом CR4.PAE), в режиме расширенного физического адреса 27 старших бит регистра CR3 содержат адрес таблицы указателей на каталоги страниц (27 его старших бит, а младшие 5 бит принимаются равными 0).

 

PWT (Сквозная запись страниц, бит 3: Intel486 …)

Бит используется для управления кэшированием текущего каталога страниц. При PWT = 1, для текущего каталога обновление реализуется методом сквозной записи (write-through), при PWT = 0 — методом обратной записи (write-back). Программы также могут управлять кэшированием таблиц страниц и отдельных страниц посредством специальных битов PCD, PWT в элементах таблиц страничных преобразований.

 

PCD (Запрещение кэширования страниц, бит 4: Intel486 …)

Бит используется для управления кэшированием текущего каталога страниц. PCD = 1 запрещает кэширование. Программы также могут управлять кэшированием таблиц страниц и отдельных страниц посредством специальных битов PCD, PWT в элементах таблиц страничных преобразований.

 

Регистр CR4

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

 

VME (Расширения виртуального-8086 режима, бит 0: Pentium …)

Установка в 1 этого бита включает поддержку флагов виртуальных прерываний EFLAGS.VIF и EFLAGS.VIP в режиме V86.

 

PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium …)

Установка в 1 этого бита включает поддержку флагов виртуальных прерываний EFLAGS.VIF и EFLAGS.VIP в защищенном режиме. Использование виртуальных прерываний в защищенном режиме позволяет выполнять программы, предназначенные для уровня привилегий 0, на уровне привилегий 3.

 

TSD (Ограничение маркера времени, бит 2: Pentium …)

Установка TSD в 1 разрешает выполнение привилегированной команды RDTSC (Read from time stamp counter) только на уровне привилегий 0. Сброс TSD разрешает указанную команду на всех уровнях привилегий.

 

DE (Расширение отладки, бит 3: Pentium …)

Установка DE = 1 разрешает точки останова по вводу/выводу. Помимо этого, при включенном расширении отладки (DE = 1) регистры DR4, DR5 определены как зарезервированные и попытка обращения к ним приведет к генерации ошибки "неопределенный код операции" (#UD). При отключенном расширении отладки (DE = 0) и в процессорах Intel386 и Intel486 регистры DR4, DR5 отображаются на регистры DR6, DR7.

 

PSE (Расширение размера страниц, бит 4: Pentium …)

PSE = 1 разрешает использование страниц расширенного размера (4Мб или 2Мб в зависимости от текущей разрядности физического адреса).

 

PAE (Расширение физического адреса, бит 5: Pentium Pro …)

PAE = 1 разрешает использование расширенной 36-битной (вместо стандартной 32-битной) физической адресации. При этом логический адрес остается 32-битным, все изменения касаются только работы страничного механизма. Существует еще одно расширение физического адреса для процессоров Pentium Pro и выше. Это расширение (т.н. PSE-36) позволяет использовать 4Мб страницы в режиме 36-битной адресации. Однако каких-либо управляющих битов для PSE-36 не предусмотрено, а его наличие определяется командой CPUID. Подробную информацию о режимах адресации смотрите в главе 2.

 

MCE (Расширение контроля машины, бит 6: Pentium …)

MCE = 1 разрешает расширенный контроль работы процессора и включает поддержку прерывания 18 (Контроль машины).

 

PGE (Разрешение глобальных страниц, бит 7: Pentium Pro …)

PGE = 1 разрешает использование глобальных страниц, которые помечены специальным битом в таблице или каталоге страниц (бит G). Глобальные страницы предназначены для использования в системных процедурах, к которым часто происходят обращения, причем из разных пользовательских задач (например, для процедур ядра ОС). Если страница помечена как глобальная, то при переключении задач или записи в CR3 не происходит автоматического вычеркивания данных об этой странице из TLB. Операционная система сама должна следить за действительностью информации о глобальных страницах в TLB и по мере надобности корректировать ее программно. При PGE = 0 поддержка глобальных страниц отключена.

 

PCE (Разрешение счетчика производительности, бит 8: Pentium Pro …)

Данный флаг предназначен для разрешения мониторинга производительности в пользовательских программах, выполняющихся на уровне привилегий большем 0. Установка PCE = 1 разрешает выполнение команды RDPMC (Read Performance-Monitoring Counters) на всех уровнях привилегий. Сброс PCE разрешает указанную команду только на уровне привилегий 0.

 

OSFXSR (Использование команд быстрого сохранения/восстановления, бит 9: Pentium II …)

Данный флаг устанавливается операционной системой в 1 для индикации того, что она использует команды расширенного быстрого сохранения/восстановления состояния FPU/MMX/SIMD (FXSAVE/FXRSTOR) при переключении контекста.

 

OSXMMEXCPT (Разрешение особой ситуации SIMD: Pentium III …)

Бит OSXMMEXCPT управляет режимом реакции процессора на исключения SIMD. Когда OSXMMEXCPT = 0, при возникновении исключения SIMD генерируется особая ситуация ""неопределенный код операции" (#UD), а прерывание 19 (#XM) считается зарезервированным. Если же OSXMMEXCPT = 1, то все незамаскированные исключения SIMD вызывают генерацию особой ситуации #XM.