Регистры управления (Control Registers)

      Регистры управления CR0, CR1, CR2, CR3 и CR4 определяют поведение процессора и характеристики текущей задачи. Для быстрого перехода к описанию флагов используйте их обозначения на рисунке.

OSXMMEXCPT OSFXSR PCE PGE MCE PAE PSE DE TSD PVI VME PCD PWT PG CD NW AM WP NE ET TS EM MP PE
  •  
  • CR0 - содержит системные флаги управления, управляющие поведением и состоянием процессора.
  •  
  • CR1 - зарезервирован.
  •  
  • CR2 - содержит линейный адрес команды, вызвавшей страничное нарушение.
  •  
  • CR3 - содержит физический адрес начала каталога страниц и два флага: PCD и PWT. Этот регистр также называется PDBR (Page-Directory Base Register), он хранит 20 старших бит адреса каталога страниц (младшие подразумеваются равными 0, т.к. каталог страниц должен быть выровнен на границу страницы). Биты PCD и PWT управляют кэшированием каталога страниц во внутреннем кэше данных процессора, но не управляют TLB-кэшированием. При использовании расширения физического адреса, регистр CR3 содержит базовый адрес таблицы PDP (Page Directory Pointer).
  •  
  • CR4 - содержит набор флагов, разрешающих использование некоторых архитектурных расширений.

          Регистры управления можно прочитать или загрузить только с помощью команды MOV. В защищёном режиме работа с регистрами управления позволена только программам с нулевым уровнем привилегий.

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

          Флаги регистров управления имеют следующие функции:
    PG    Трансляция страниц (Paging), 31-й бит в CR0. Разрешает страничное преобразование, если установлен, иначе - запрещает. Когда страничное преобразование разрешено, все линейные адреса используются как физические. Флаг PG не действует, если не установлен флаг PE (0-й бит в CR0), тем не менее, установка флага PG при сброшенном PE вызывает генерацию исключения общей защиты (#GP). Подробно механизм страничного преобразования обсуждается в разделе "Управление памятью".

    CD

        Отключение кэша (Cache Disable), 30-й бит в CR0. Когда флаги CD и NW сброшены, разрешено кэширование всей памяти во внутренних и внеших кэшах. Когда флаг CD установлен, кэширование ограничено (см. таблицу). Чтобы запретить процессору доступ к его кэшам, флаг CD должен быть установлен и кэши объявлены недостоверными. Дополнительно об этом см. раздел "Управление кэшами".

    NW

        Отмена сквозной записи (Not Write-through), 29-й бит в CR0. Когда флаги NW и CD сброшены, обратная запись (write-back) для Pentium 4, P6 family и Pentium или сквозная запись (write-through) для Intel486 разрешена для записей, не попавших в кэш (см. таблицу о действиях флагов NW и CD).

    AM

        Проверка выравнивания (Alignment Mask), 18-й бит в CR0. Когда установлен, разрешает автоматическую проверку выравнивания, иначе - запрещает. Проверка выравнивания выполняется только при следующих условиях:
  • флаг AM в CR0 установлен,
  • флаг AC в EFLAGS установлен,
  • CPL = 3,
  • процессор работает в P-Mode или V-Mode.

    WP

        Защита от записи (Write Protect), 16-й бит CR0. Когда установлен, запрещает системным процедурам запись в пользовательские страницы с доступом только для чтения (когда флаг WP сброшен - разрешает).

    NE

        Численная ошибка (Numeric Error), 5-й бит в CR0. Когда установлен, активизирует внутрипроцессорный механизм сообщений об ошибках x87 FPU, когда сброшен - механизм сообщений об ошибках x87 FPU PC-типа. При сброшенном флаге NE, немаскируемая ошибка x87 FPU приводит к генерации прерывания сразу же после следующей команды x87 FPU или команд WAIT/FWAIT.

    ET

        Тип расширения (Extension Type), 4-й бит в CR0. Зарезервирован в процессорах Pentium 4, семейства P6 и Pentium и для них всегда установлен. В процессорах Intel386 и Intel486 этот флаг, если установлен, определяет наличие поддержки команд процессора Intel 387 DX (математического сопроцессора).

    TS

        Переключение задач (Task Switched), 3-й бит в CR0. Устанавливается процессором каждый раз при переключении задач; сбрасывается только программно. Процессор проверяет, установлен ли этот флаг, при выполнении команд модулей x87 FPU, MMX, SSE и SSE2. Использование этого флага позволяет не менять текущий контекст модулей x87 FPU, MMX, SSE и SSE2, пока к ним не произойдёт обращение.
  •  
  • Если флаг TS установлен и флаг EM сброшен, то при попытке выполнения команд модулей x87 FPU, MMX, SSE и SSE2 будет генерироваться исключение неприсутствующего устройства (#NM). Однако, команды PAUSE, PREFETCHh, SFENCE, LFENCE, MFENCE, MOVNTI и CLFLUSH могут выполняться.
  •  
  • Если флаг TS установлен, а флаги EM и MP сброшены, то исключение неприсутствующего устройства (#NM) не будет возникать для команды WAIT/FWAIT.
  •  
  • Если флаг EM установлен, то установка флага TS не влияет на выполнение команд модулей x87 FPU, MMX, SSE и SSE2.

          В таблице 1 приведены действия процессора при выполнении команд x87 FPU в зависимости от состояния флагов TS, EM и MP. В таблицах 2 и 3 приведены действия процессора при выполнении команд MMX, SSE и SSE2.
          При переключениии задач, процессор автоматически не сохраняет контекст регистров x87 FPU, XMM и MXCSR - он только устанавливает флаг TS, который заставит процессор сгенерировать исключение неприсутствующего устройства (#NM) при попытке выполнить команду x87 FPU, MMX, SSE или SSE2. Обработчик этого исключения должен сбросить флаг TS (командой CLTS) и сохранить контекст регистров x87 FPU, XMM и MXCSR. Если задача не использует команд x87 FPU, MMX, SSE и SSE2, то сохранять контекст этих модулей для такой задачи не нужно.


    Таблица 1. Выполнение команд x87 FPU в зависимости
    от состояния флагов EM, MP и TS.
    Флаги CR0 Тип команды x87 FPU
    EM MP TS Плавающая точка Команда WAIT/FWAIT
    0 0 0 Выполняется Выполняется
    0 0 1 Исключение #NM Выполняется
    0 1 0 Выполняется Выполняется
    0 1 1 Исключение #NM Исключение #NM
    1 0 0 Исключение #NM Выполняется
    1 0 1 Исключение #NM Выполняется
    1 1 0 Исключение #NM Выполняется
    1 1 1 Исключение #NM Исключение #NM


    Таблица 2. Выполнение команд MMX в зависимости
    от состояния флагов EM, MP и TS.
    Флаги CR0 Действие
    EM MP* TS
    0 1 0 Команда выполняется
    0 1 1 Исключение #NM
    1 1 0 Исключение #UD
    1 1 1 Исключение #UD

    Примечание:
    *Для процессоров, поддерживающих технологию MMX, флаг MP должен быть установлен.


    Таблица 3. Действия процессора при выполнении команд SSE и SSE2, в зависимости от флагов OSFXSR, OSXMMEXCPT, SSE, SSE2, EM, MP и TS 1
    CR4 CPUID Флаги CR0 Action
    OSFXSR OSXMMEXCPT SSE SSE2 EM MP2 TS
    0 X3 X X X 1 X Исключение #UD.
    1 X 0 0 X 1 X Исключение #UD.
    1 X 1 1 1 1 X Исключение #UD.
    1 0 1 1 0 1 0     Команда выполняется, но при обнаружении немаскируемого
    SIMD-исключения плавающей точки генерируется исключение #UD.
    1 1 1 1 0 1 0     Команда выполняется, но при обнаружении немаскируемого
    SIMD-исключения плавающей точки генерируется исключение #XF.
    1 X 1 1 0 1 1 Исключение #NM.

    Примечания:
    1.Для выполнения любых команд SSE или SSE2, за исключением команд PAUSE, PREFETCHh, SFENCE, LFENCE, MFENCE, MOVNTI и CLFLUSH.
    2.Для процессоров, поддерживающих технологию MMX, флаг MP должен быть установлен.
    3."X" значит - любое значение.

    EM

        Эмуляция сопроцессора (Emulation), 2-й бит CR0. Если установлен, означает что процессор не имеет сопроцессора ни внутреннего, ни внешнего; если сброшен, то означает присутствие x87 FPU. Этот флаг влияет на выполнение команд MMX, SSE и SSE2.
          Когда флаг EM установлен, попытка выполнения команды x87 FPU вызывает генерацию исключения неприсутствующего устройства (#NM). Этот флаг должен быть установлен, если процессор не имеет встроенного либо внешнего модуля x87 FPU (математического сопроцессора). Установка этого флага позволяет программно эмулировать выполнение команд x87 FPU. В таблице 4 приведены рекомендуемые значения этого флага, в зависимости от процессора. В таблицах 1, 2 и 3 приведены действия этого флага вместе с флагами MP и TS.
          При установленном флаге EM попытка выполнения команды MMX вызывает генерацию исключения недопустимой команды (#UD), поэтому у процессоров, поддерживающих технологию MMX этот флаг должен быть сброшен.
          Для команд расширений SSE и SSE2, установка флага EM приведёт к генерации исключения недопустимой команды (#UD) почти для всех команд, за исключением PAUSE, PREFETCHh, SFENCE, LFENCE, MFENCE, MOVNTI и CLFLUSH. Для процессоров, поддерживающих технологи SSE и/или SSE2 этот флаг должен быть сброшен.

    MP

        Присутствие сопроцессора (Monitor Coprocessor), 1-й бит в CR0. Для процессоров со встроенным x87 FPU этот флаг следует устанавливать в 1, для процессоров с внешним сопроцессором - в 0. Этот флаг управляет поведением команды WAIT/FWAIT - если флаги MP и TS установлены, то попытка выполнения этой команды генерирует исключение неприсутствующего устройства (#NM). В таблице 4 приведены рекомендуемые комбинации флагов MP и EM для разных процессоров.

    Таблица 4. Рекомендуемые комбинации флагов MP и EM для разных процессоров.
    EM MP NE Процессор IA-32
    1 0 1 Только процессоры Intel486 SX, Intel386 DX и Intel386T SX без математического сопроцессора.
    0 1 1 или 0* Процессоры Pentium 4, семейство P6, Pentium,
    Intel486 DX & Intel 487 SX, Intel386 DX & Intel386 SX.

    Примечание:
    *Значение флага NE зависит от операционной системы.

    PE

        Защита разрешена (Protection Enable), 0-й бит в CR0. При установке переводит процессор в защищённый режим, при сбросе - в режим реальных адресов.

    PCD

        Запрещение кэширования на уровне страниц (Page-level Cache Disable), 4-й бит в CR3. Управляет кэшированием текущего каталога страниц. При установленном флаге PCD кэширование каталога страниц запрещено, при сброшенном флаге PCD - разрешено. Этот флаг воздействует только на внутренние кэши процессора (уровней L1 и L2, если есть). Процессор игнорирует значение этого флага, если страничное отображение не используется (сброшен флаг PG в CR0) либо если кэширование запрещено (установлен флаг CD в CR0).

    PWT

        Явные записи на уровне страниц (Page-level Writes Transparent), 3-й бит в CR3. Управляет механизмом кэширования обратной записи (write-back) и кэширования сквозной записи (write-through) в текущем каталоге страниц. При установленном флаге PWT, используется кэширование сквозной записи, при сброшенном флаге PTW - обратной записи. Этот флаг воздействует только на внутренние кэши процессора (уровней L1 и L2, если есть). Процессор игнорирует значение этого флага, если страничное отображение не используется (сброшен флаг PG в CR0) либо если кэширование запрещено (установлен флаг CD в CR0).

    VME

        Расширения режима виртуального 8086 (Virtual-8086 Mode Extensions), 0-й бит в CR4. При установке разрешает использование расширенной обработки исключений и прерываний в режиме виртуального 8086.

    PVI

        Виртуальные прерывания защищённого режима (Protected-Mode Virtual Interrupts), 1-й бит в CR4. При установке разрешает аппаратную поддержку для флага виртуальных прерываний VIF (virtual interrupt flag) в ращищённом режиме.

    TSD

        Отключение счётчика тактов (Time Stamp Disable), 2-й бит в CR4. Если установлен, разрешает использование команды RDTSC только на нулевом уровне привилегий; если сброшен - разрешает на всех уровнях привилегий.

    DE

        Расширения отладки (Debugging Extensions), 3-й бит в CR4. Когда установлен, попытки обращения к регистрам отладки DR4 и DR5 генерируют исключение недопустимой команды (#UD). Когда флаг сброшен, процессор разрешает использование этих регистров для обратной совместимости с программами, написанными для ранних версий 32-разрядных процессоров.

    PSE

        Расширения размера страниц (Page Size Extensions), 4-й бит в CR4. Когда установлен, разрешается использование 4Мб-страниц, когда сброшен - 4Кб-страниц.

    PAE

        Расширение физического адреса (Physical Address Extension), 5-й бит в CR4. Когда установлен, разрешается использование 36-разрядной физической адресации; когда сброшен - обычной 32-разрядной.

    MCE

        Разрешение аппаратной проверки (Machine-Check Enable), 6-й бит в CR4. Если установлен, разрешает исключение аппаратной проверки; если сброшен - запрещает.

    PGE

        Разрешение глобальных страниц (Page Global Enable), 7-й бит в CR4. (появился в процессорах семейства P6). Когда установлен, разрешается ипользование глобальных страниц. Перед установкой этого флага необходимо сначала разрешить страничное преобразование (установить флаг PG в CR0).

    PCE

        Разрешение счётчика мониторинга производительности (Performance-Monitoring Counter Enable), 8-й бит в CR4. Когда установлен, выполнение команды RDPMC разрешено на всех уровнях привилегий; когда сброшен - только на нулевом.

    OSFXSR

        Поддержка команд FXSAVE и FXRSTOR операционной системой (Operating System Support for FXSAVE and FXRSTOR instructions), 9-й бит в CR4. Когда установлен, этот флаг:
    1)показывает программам, что операционная система поддерживает использование команд FXSAVE и FXRSTOR;
    2)разрешает использование команд FXSAVE и FXRSTOR для сохранения и восстановления содержимого регистром XMM и MXCSR вместе с контекстом x87 FPU и MMX;
    3)разрешает процессору выполнение всех команд SSE и SSE2, за исключением команд PAUSE, PREFETCHh, SFENCE, LFENCE, MFENCE, MOVNTI и CLFLUSH.

          Если этот флаг сброшен, то команды FXSAVE и FXRSTOR сохраняют и восстанавливают контекст только x87 FPU и MMX (но не XMM и регистра MXCSR). Также, при сброшенном флаге процессор генерирует исключение недопустимой команды (#UD) при попытке выполнения всех команд SSE и SSE2, за исключением команд PAUSE, PREFETCHh, SFENCE, LFENCE, MFENCE, MOVNTI и CLFLUSH.
          Флаг OSFXSR должен явно устанавливаться операционной системой.

    OSXMMEXCPT

        Поддержка операционной системой немаскируемых SIMD-исключений плавающей точки (Operating System Support for Unmasked SIMD Floating-Point Exceptions), 10-й бит в CR4. Определяет, поддерживает ли операционная система обработку немаскируемых SIMD-исключений плавающей точки (#XF) через обработчик этого исключения. Такое исключение генерируют только команды SSE и SSE2 по обработке вещественных чисел. Операционная система должна явно устанавливать этот флаг. Если этот флаг сброшен, процессор будет генерировать исключение недопустимой команды (#UD) каждый раз, когда будет возникать немаскируемое SIMD-исключение плавающей точки.

          Флаги VME, PVI, TSD, DE, PSE, PAE, MCE, PGE, PCE, OSFXSR и OSXMMEXCPT в регистре CR4 есть не во всех процессорах, поэтому перед их использованием, необходимо определить наличие и поддержку этих флагов в процессоре командой CPUID.

    Приложения Вопросы? Замечания? Пишите: sasm@narod.ru

      Copyright © Александр Семенко.
    TopList

    Hosted by uCoz