Warning: Declaration of JDocumentRendererRSS::render() should be compatible with JDocumentRenderer::render($name, $params = Array, $content = NULL) in /var/www/u1741842/public_html/club155.ru/libraries/joomla/document/feed/renderer/rss.php on line 30
Club155.ru Club155.ru! - собрание справочной информации по программированию и схемотехнике (ассемблер x86, диоды, транзисторы, схемы) http://www.club155.ruprogramming Thu, 02 May 2024 07:55:54 +0000 ru-ru Введение http://www.club155.ru/index.php?option=com_content&view=article&id=44&catid=31 http://www.club155.ru/index.php?option=com_content&view=article&id=44&catid=31  

Самый ранний из описываемых микропроцессоров — 8086, был полностью 16-разрядным прибором, ориентированным на использование в универсальных вычислительных устройствах в качестве одиночного центрального процессорного устройства (CPU). Этот микропроцессор имел 16-разрядные внутренние регистры, 16-разрядные внутренние и внешние шины данных и мог адресовать до 1 Мб физической памяти. Производительность микропроцессора 8086 могла достигать 0,8 MIPS (млн. операций в секунду).

В 1982 году Intel внесла значительные усовершенствования в архитектуру x86 и выпустила новый микропроцессор Intel286. Он также был полностью 16-разрядным, однако, мог адресовать до 16 Мб физической памяти и имел специальный защищенный режим работы, в котором обеспечивались гибкие механизмы адресации, управления доступом к памяти, управления привилегиями и т.п. Система команд этого микропроцессора также была существенно расширена. Его быстродействие достигало уже 2,7 MIPS.

Еще большие нововведения в архитектуру x86 были воплощены в процессоре Intel386, который вышел в 1985 году. Это был полностью 32-разрядный микропроцессор, который имел 32-разрядные внутренние регистры и 32-разрядные шины данных. Адресное пространство микропроцессора Intel386 было по тем временам просто безграничным — 4 Гб. Были добавлены также: специальный страничный механизм и новый режим работы — V86, который обеспечивал совместимость данного микропроцессора с программами, написанными для предыдущих устройств серии. Внутренняя микроархитектура микропроцессора Intel386 также была уникальной — она впервые позволяла осуществлять параллельное выполнение нескольких действий (выборка команд и данных, декодирование команд, исполнение команд и т.п.), чем обеспечивалось увеличение быстродействия до 6 MIPS. Примерно в это же время была разработана новая ОС для персональных компьютеров, построенных на микропроцессорах x86 — Windows. С тех пор пара Windows–Intel настолько популярна и неразлучна, что для обозначения архитектуры x86 даже появился новый термин — Wintel.

Развитие микроэлектронных технологий позволило существенно повысить вместимость кристаллов электронных схем. В 1989 году появился микропроцессор Intel486. Он содержал интегрированное устройство вычислений с плавающей точкой (FPU) и внутреннюю КЭШ-память для данных и команд. Было также повышено быстродействие процессора (в т.ч. и за счет совершенствования микроархитектуры, которая позволяла еще более запаралелить выполнение многих действий внутри микропроцессора).

В 1993 году вышел первый микропроцессор семества P5. Микропроцессор Pentium имел значительно усовершенствованную микроархитектуру. Теперь устройство целочисленных вычислений имело два практически идентичных блока, в которых различные команды могли выполняться параллельно. Были усовершенствованы модули, отвечающие за выборку и декодирование команд, они стали более интеллектуальными и пытались прогнозировать действия процессора, осуществляя предвыборку и преддекодирование команд еще до получения результатов предыдущих команд. Устройство вычислений с плавающей запятой было существенно переработано для достижения большего быстродействия. Были внесены некоторые доработки и в программную архитектуру процессора: появилась поддержка страниц большого размера, режим V86 стал более гибким при обработке прерываний, а средства внутренней самодиагностики вышли из зачаточного состояния. Быстродействие первых процессоров Pentium могло достигать 100 MIPS.

C 1993 по 1997 гг. фирма Intel продолжала усовершенствование архитектуры своих процессоров. Был выпущен Pentium Pro — микропроцессор микроархитектуры P6, которая стала основой и для более поздних микропроцессоров. Уже не два, а четыре внутренних модуля параллельно осуществляли выполнение команд, предвыборка дополнилась многими интелектуальными функциями, такими как предсказание ветвлений и т.п. Внутренняя КЭШ-память стала двухуровневой, что позволило, с одной стороны, увеличить ее объем, а с другой обеспечить разумную стоимость микропроцессора. Новая расширенная система команд для обработки мультимедийной информации (MMX) была введена в новые модели микропроцессоров Pentium и Pentium Pro.

Современная индустрия микропроцессоров практически прекратила развивать 32-разрядные архитектуры x86 (получив здесь сильнейшего конкурента в лице архитектуры ARM) и переключилась на новый сегмент 64-разрядных архитектур. Последними из существенных нововведений 32-разрядного сегмента стали новые так называемые SIMD (или SSE) команды, впервые введеные в микропроцессоре Pentium III. Однако все эти усовершенствования и потрясающие возможности с программной точки зрения все равно базируются на стандартной архитектуре x86, которая существует уже более 30 лет.

Основные элементы архитектуры x86 последовательно описываются в следующих разделах.

  • Система команд – здесь содержится подробная информация обо всех командах процессоров архитектуры x86, в т.ч. и о расширенных наборах команд MMX, 3DNow!, и SIMD (SSE). Для каждой команды указаны выполняемые ей действия и возможные последствия ее применения в различных ситуациях, даны комментарии и рекомендации.

  • Внутренние регистры– содержит описание всех внутренних регистров процессоров. К ним относятся регистры общего назначения, сегментные регистры, регистры управления и отладки, системные регистры, регистры математического сопроцессора, а также некоторые регистры специального назначения

  • Механизмы адресации, управления памятью, поддержки многозадачности и защиты – посвящена описанию работы механизма адресации процессора в различных режимах. Также описан страничный механизм, механизм поддержки многозадачности и средства защиты, приведены форматы всех элементов системной архитектуры

  • Прерывания, исключения и особые ситуации – содержит подробное описание действий процессора по обработке прерываний и особых ситуаций. Приведены все возможные причины их генерации и протокол реакции процессора на их возникновение. Также описаны исключения математического сопроцессора и исключения для команд потоковой обработки SIMD (SSE).

  • Форматы данных– это описание всех применяемых в архитектуре x86 форматов данных. Здесь представлены как форматы для целочисленной арифметики, так и для арифметики с плавающей запятой, описание данных для команд MMX, 3DNow, SIMD (SSE).

  • Форматы команд– содержит информацию о кодировании команд. Здесь описаны все возможные форматы для кодов команд процессора, приведено назначение и правила кодирования отдельных полей.

 

С момента появления самого первого микропроцессора архитектуры x86 самые разнообразные фирмы по всему миру производят разработку совместимых устройств. Такие микропроцессоры, как правило, полностью копируют архитектуру приборов Intel и совместимы с программным обеспечением для них.

Микропроцессоры-клоны существуют для всех устройств серии x86. В различные периоды из них были наиболее известны: MII (Cyrix, IBM), K6 (AMD), Winchip (IDT) и некоторые другие. Специфика этих микропроцессоров в том, что они предназначались для применения в промышленном оборудовании и недорогих компьютерах средней производительности и не претендовали на лидерство в сфере мощных многопроцессорных сверхвысокопроизводительных систем. До определенного времени производители клонов лишь шли по стопам Intel, производя устройства максимально приближенные по своим характеристикам к приборам Intel и не содержащие никаких структурных расширений. Нововведением стал шаг фирмы AMD, которая разработала и реализовала в своих микропроцессорах новую расширенную систему команд 3DNow! Это расширение было поддержано и другими производителями. Intel, однако, не стала копировать разработки AMD и ввела в свои новые микропроцессоры другое расширение, называемое SIMD или SSE. Впоследствии большинство команд 3DNow! были реализованы в составе новых расширений SSE2 и SSE3, которые появились в процессорах Intel начиная с Pentium IV.

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

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 14 Jun 2011 14:58:54 +0000
Внутренние регистры: Регистры общего назначения http://www.club155.ru/x86internalreg-common http://www.club155.ru/x86internalreg-common  

Регистры общего назначения предназначены для хранения операндов и результатов команд, также они могут использоваться для формирования адреса при обращении к данным в памяти. Формат регистров общего назначения приведен на рис. 1.1.

 

Формат регистров общего назначения

Рис. 1.1. Формат регистров общего назначения

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Сегментные регистры http://www.club155.ru/x86internalreg-segment http://www.club155.ru/x86internalreg-segment  

Сегментные регистры используются при формировании полного логического адреса. Они содержат селекторы сегментов, которые используются процессором при доступе к данным, стеку и коду. Формат сегментных регистров приведен на рис. 1.2.

 

Формат сегментных регистров

Рис. 1.2. Формат сегментных регистров

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Регистр флагов http://www.club155.ru/x86internalreg-eflags http://www.club155.ru/x86internalreg-eflags  

Регистр флагов EFLAGS отражает текущее состояние процессора, многие из его битов устанавливаются после выполнения операций и индицируют тип, полученного результата. Формат регистра флагов приведен на рис. 1.3.

 

Формат регистра флагов

Рис. 1.3. Формат регистра флагов

 

CF (Флаг переноса, бит 0)

Флаг переноса фиксирует значение переноса (заема), возникающего при сложении (вычитании). Иногда используется и в других ситуациях.

 

PF (Флаг четности, бит 2)

Флаг четности фиксирует наличие четного числа единиц в младшем байте результата операции, может быть использован, например, для контроля правильности передачи данных.

 

AF (Флаг вспомогательного переноса, бит 4)

Флаг вспомогательного переноса фиксирует перенос (заем) из младшей тетрады, т.е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной арифметики, которая оперирует исключительно младшими байтами.

 

ZF (Флаг нуля, бит 6)

Флаг нуля сигнализирует о получении нулевого (ZF = 1) или ненулевого (ZF = 0) результата операции.

 

SF (Флаг знака, бит 7)

Флаг знака дублирует значение старшего бита результата, который при использовании дополнительного кода соответствует знаку числа (0 – положительное число, 1 – отрицательное).

 

TF (Флаг трассировки, бит 8)

При установке флага трассировки TF = 1, микропроцессор переходит в пошаговый режим работы, применяемый при отладке программ, когда автоматически генерируется особая ситуация отладки (#DB) после выполнения каждой команды. Прерывание отладки начнет генерироваться, если прикладная программа установит флаг TF с помощью команд POPF/POPFD или IRET/IRETD.

 

IF (Флаг разрешения прерываний, бит 9)

При установке флага разрешения прерываний IF = 1, микропроцессор воспринимает (распознает) и соответственно реагирует на запрос прерывания по входу INTR# (внешние маскируемые прерывания). При IF = 0, прерывания по этому входу запрещаются и микропроцессор игнорирует поступающие запросы прерываний.

Значение флага IF не влияет на восприятие внешних немаскируемых прерываний по входу NMI#, а также внутренних программных прерываний, выполняемых по команде INT.

Изменение этого флага командами CLI, STI, POPF/POPFD и IRET/IRETD возможно не всегда и определяется текущими:

 

При обычной обработке прерываний (CR4.PVI = 0 в защищенном режиме или CR4.VME = 0 в режиме V86), когда IOPL < CPL ( IOPL < 3 в режиме V86), все попытки изменения флага IF командами STI, CLI, POPF/POPFD и IRET/IRETD вызывают генерацию ошибки общей защиты (#GP).

Когда же виртуальные прерывания инициализированы (CR4.PVI = 1 в защищенном режиме или CR4.VME = 1 в режиме V86) при выполнении того же условия IOPL < CPL ( IOPL < 3 в режиме V86) команды CLI и STI оказывают влияние на флаг EFLAGS.VIF, а флаг IF при этом остается неизменным. Флаг VIF используется всеми командами (в т.ч. PUSHF, POPF), которые пытаются изменять или считывать значение флага IF. Только значение флага VIF будет всякий раз изменяться и считываться программой. При поступлении внешнего маскируемого прерывания процессор производит стандартное обращение к обработчику прерываний защищенного режима через таблицу дескрипторов прерываний (IDT). При этом, при записи в стек значения регистра EFLAGS процессор записывает поле IOPL равным 3 и флаг IF равным VIF.

 

DF (Флаг направления, бит 10)

Флаг направления определяет порядок обработки цепочек в соответствующих командах (строковые команды: STOS, LODS, CMPSOUTS и т.д.) — от меньших адресов к большим (DF = 0) или от больших к меньшим (DF = 1).

 

OF (Флаг переполнения, бит 11)

Флаг переполнения сигнализирует о потере старшего бита результата в связи с переполнением разрядной сетки при работе со знаковыми числами. При сложении этот флаг устанавливается в 1, если происходит перенос в старший бит и нет переноса из старшего бита, или имеется перенос из старшего бита, но отсутствует перенос в него; в противном случае, флаг OF устанавливается в 0. При вычитании он устанавливается в 1, когда возникает заем из старшего бита, но заем в старший бит отсутствует, либо имеется заем в старший бит, но отсутствует заем из него.

 

IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 …)

Поле уровня привилегий ввода/вывода (Input/output Privilege Level – IOPL) используется механизмом защиты для управления доступом к адресному пространству ввода/вывода и программным прерываниям. Ряд команд, называемых IOPL-чувствительными командами (IOPL-sensitive instructions), могут выполняться по-разному в зависимости от текущего режима работы процессора и значения поля IOPL.

В защищенном режиме к IOPL-чувствительным командам относятся команды IN, OUT, INS/NSB/INSW/INSD, OUTS/OUTSB/OUTSW/OUTSD, CLISTI и префикс LOCK (только на процессоре Intel286). Всякий раз, когда программа осуществляет чтение/запись в порты ввода/вывода либо разрешение/запрещение прерываний указанными командами, процессор осуществляет специальную проверку привилегий. В зависимости от текущего значения поля IOPL и текущего уровня привилегий (CPL), механизмом защиты может генерироваться особая ситуация общей защиты (#GP). Если CPLIOPL, то команда исполняется в соответствии со своим назначением (как и в режиме реальной адресации). Если CPL > IOPL в защищенном режиме (а также всегда в режиме V86), производится дополнительная проверка доступности соответствующего порта ввода/вывода при любых операциях с ним. Такая проверка использует специальную карту разрешения ввода/вывода, которая расположена в верхней части сегмента состояния задачи TSS и определяет доступность всех портов ввода/вывода. В случае недоступности порта или при попытках разрешения/запрещения прерываний командами CLISTI, когда CPL > IOPL, процессор генерирует ошибку общей защиты (#GP).

Изменение уровня привилегий ввода/вывода IOPL возможно командами POPF/POPFD и IRET/IRETD в защищенном режиме и только при выполнении команды на уровне привилегий, по крайней мере таком же (а для команды POPF/POPFD только на нулевом), как и текущий уровень привилегий ввода/вывода (режим реальной адресации эквивалентен нулевому уровню привилегий).

При работе в режиме V86 (EFLAGS.VM = 1) IOPL-чувствительными являются команды CLISTIPOPF/POPFDPUSHF/PUSHFDIRET/IRETDINT n. У каждой из этих команд имеется аналогичная зависимость от текущего значения поля IOPL. Например, команда INT n вызывает генерацию особой ситуации общей защиты (#GP), если IOPL < 3, или выполняется программное прерывание (при IOPL = 3).

В защищенном режиме команда POPF/POPFD является одновременно зависимой и от уровня привилегий ввода/вывода IOPL, и от текущего уровня привилегий (CPL), позволяя изменять поле IOPL только при выполнении на нулевом уровне привилегий (CPL = 0), а флаг разрешения прерываний IF — только при условии CPL ≤ IOPL. Однако, если эта команда не может изменить указанное поле или флаг из-за недостаточности текущих привилегий, то генерации особой ситуации общей защиты (#GP) не происходит — продолжается выполнение последующих команд. Это поведение меняется в режиме V86 — здесь попытка использования команды POPF/POPFD при IOPL < 3 (кроме режима EV86) всегда вызывает генерацию особой ситуации общей защиты (#GP).

В процессорах, начиная с Pentium, имеется специальный режим EV86 (включается установкой флага CR4.VME = 1 в режиме V86), в котором возникает дополнительная специфика для IOPL-чувствительных команд. Во-первых, команда IRET в этом режиме вообще перестает быть IOPL-чувствительной и не генерирует особую ситуацию общей защиты (#GP) при IOPL < 3. Команды CLISTI при IOPL <  3, вместо генерации указанной особой ситуации, оказывают влияние на флаг виртуального прерывания VIF (также как и команда POPF), а для команды INT n вообще возникает несколько режимов, которые зависят от текущего контекста конкретной задачи V86. И наконец, команда PUSHF (16-битная), выполняемая в режиме EV86 при IOPL < 3, также не генериует особую ситуацию общей защиты (#GP), а записывает в стек образ регистра флагов FLAGS, у которого биты, соответствующие полю IOPL, устанавливаются равными 3, а бит IF записывается из текущего значения флага VIF.

В ранних моделях процессоров до Intel286 (8086/8088, Intel186) биты 12 и 13 регистра флагов FLAGS, соответствующие полю IOPL, считались зарезервированными, а их значения всегда были равны единице. В процессоре Intel286 в режиме реальной адресации невозможно изменять значения этих битов — они всегда остаются нулевыми (они сбрасываются в момент инициализации процессора), а вот более поздние модели процессоров, начиная с Intel386, такого ограничения уже не имеют, то есть поле IOPL можно изменять и в режиме реальной адресации. Указанная особенность использовалась в процедурах идентификации процессоров вплоть до появления команды CPUID в процессоре Pentium.

 

NT (Вложенная задача, бит 14: Intel286 …)

Процессор устанавливает и проверяет флаг вложенной задачи для контроля за прерванными задачами (задачи, во время исполнения которых имело место прерывание) и при вызове процедур. Флаг NT влияет на действия, производимые командой IRET/IRETD. Этот флаг может быть изменен командой POPF/POPFD и IRET/IRETD. Некорректные изменения этого флага могут привести к возникновению различных особых ситуаций в прикладных программах.

 

RF (Флаг возобновления, бит 16: Intel386 …)

Флаг возобновления RF временно выключает обработку особых ситуаций отладки (DB#) для того, чтобы команда, вызвавшая такую ситуацию, могла быть перезапущена и не стала бы причиной новой особой ситуации. Отладчик устанавливает этот флаг командой IRETD при возврате в прерванную программу. Команды POPF, POPFD (в режиме V86) и IRET на этот флаг не влияют.

 

VM (Виртуальный режим, бит 17: Intel386 …)

Установка флага виртуального режима VM переключает процессор в режим виртуального-8086 (специальный случай защищенного режима).

 

AC (Режим контроля выравнивания, бит 18: Intel486 …)

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

Таблица 3.5. Условия контроля выравнивания

{loadposition custom_position_T3-5}

 

VIF (Виртуальное прерывание, бит 19: Pentium …)

Флаг виртуального прерывания VIF используется совместно с флагом VIP и позволяет обеспечить нормальное выполнение старого ПО, использующего команды управления внешними маскируемыми прерываниями (векторы от 32 до 255), в современной мультипроцессорной и мультизадачной программно-аппаратной среде.

Для этого в процессорах, начиная с Pentium, поддерживаются специальные расширенные режимы обработки прерываний:

 

В этих режимах флаг виртуального прерывания VIF выступает виртуальным подобием флага IF. При условии, что виртуальные прерывания инициализированы (CR4.PVI = 1 в защищенном режиме, CR4.VME = 1 в режиме V86), команды CLI и STI оказывают влияние на флаг EFLAGS.VIF, а флаг IF при этом остается неизменным. При поступлении внешнего маскируемого прерывания процессор производит стандартное обращение к обработчику прерываний защищенного режима через таблицу дескрипторов прерываний (IDT). При этом, при записи в стек значения регистра EFLAGS процессор записывает поле IOPL равным 3 и флаг IF равным VIF.

 

VIP (Ожидание виртуального прерывания, бит 20: Pentium …)

Флаг ожидания виртуального прерывания VIP используется совместно с флагом VIF и позволяет прикладным программам в режиме поддержки виртуальных прерываний отслеживать внешние вызовы прерываний даже тогда, когда программа замаскирует их выполнение (индикация отложенных виртуальных прерываний). За дополнительной информацией по использованию этих флагов обратитесь к описанию прерываний и особых ситуаций.

 

ID (Флаг идентификации, бит 21: Pentium …)

Флаг идентификации ID предназначен для проверки — поддерживается ли процессором команда CPUID. Если в программе можно установить и сбросить этот флаг, значит команда CPUID данным процессором поддерживается.

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Системные регистры http://www.club155.ru/x86internalreg-system http://www.club155.ru/x86internalreg-system  

Системные регистры GDTR, LDTR и IDTR введены в процессорах начиная с Intel286 и предназначены для хранения базовых адресов таблиц дескрипторов — важнейших составляющих системной архитектуры при работе в защищенном режиме. Регистр задачи TR используется для слежения за тем, какая задача выполняется процессором в текущий момент.

Для доступа к системным регистрам используются команды: LGDT, SGDT, LLDT, SLDT, LIDT, SIDT, LTR, STR.

 

Регистр глобальной таблицы дескрипторов GDTR

Регистр глобальной таблицы дескрипторов GDTR содержит 32-битный (24-битный для Intel286) базовый адрес и 16-битный предел глобальной таблицы дескрипторов (GDT). Формат регистра GDTR приведен на рис. 1.4.

 

Формат регистра глобальной таблицы дескрипторов

Рис. 1.4. Формат регистра глобальной таблицы дескрипторов

 

Регистр локальной таблицы дескрипторов LDTR

Видимая часть регистра локальной таблицы дескрипторов LDTR содержит только селектор дескриптора локальной таблицы дескрипторов (LDT). Сам дескриптор LDT автоматически загружается в скрытую часть LDTR из глобальной таблицы дескрипторов. Формат регистра LDTR приведен на рис. 1.5.

 

Формат регистра локальной таблицы дескрипторов

Рис. 1.5. Формат регистра локальной таблицы дескрипторов

 

Регистр таблицы дескрипторов прерываний IDTR

Регистр таблицы дескрипторов прерываний IDTR содержит 32-битный (24-битный для Intel286) базовый адрес и 16-битный предел таблицы дескрипторов прерываний (IDT). В реальном режиме может быть использован для изменения местоположения таблицы векторов прерываний. Формат регистра IDTR приведен на рис. 1.6.

 

Формат регистра таблицы дескрипторов прерываний

Рис. 1.6. Формат регистра таблицы дескрипторов прерываний

 

Регистр задачи TR

Видимая часть регистра задачи TR содержит селектор дескриптора сегмента состояния задачи (TSS). Сам дескриптор TSS автоматически загружается в скрытую часть TR из глобальной таблицы дескрипторов. Формат регистра задачи приведен на рис. 1.7.

 

Формат регистра задачи

Рис. 1.7. Формат регистра задачи

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Управляющие регистры http://www.club155.ru/x86internalreg-control http://www.club155.ru/x86internalreg-control  

Управляющие регистры впервые введены в микропроцессоре 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.

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Регистры отладки http://www.club155.ru/x86internalreg-dr http://www.club155.ru/x86internalreg-dr  

Отладочные регистры (или регистры отладки) введены в процессоры начиная с Intel386. Они предназначены для использования разработчиками ПО при проверке и отладке кода программы. Эти регистры позволяют устанавливать контрольные точки по коду и читаемым/записываемым данным, выполнять трассировку, отслеживая таким образом места возникновения ошибок. Отладочные регистры являются привилегированным ресурсом и доступны программе либо в режиме реальной адресации, либо в защищенном режиме при CPL = 0.

Доступ к отладочным регистрам осуществляется командой MOV DR. Попытка использования данной команды на уровне привилегий отличном от 0 приводит к генерации ошибки общей защиты (#GP). Для целей отладки и проверки программ могут использоваться и некоторые специальные регистры MSR (Специальные регистры модели) поддерживаемые в процессорах Pentium, Pentium Pro, … Формат отладочных регистров приведен на рис. 1.9.

 

Формат отладочных регистров

Рис. 1.9. Формат отладочных регистров

 

Регистры DR0…DR5

Регистры DR0, DR1, DR2, DR3 содержат линейные адреса четырех точек останова. Сравнение этих адресов производится до трансляции физического адреса. Каждая из четырех точек останова описывается отдельно в регистре DR7.

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

 

Регистр DR6

Регистр состояния отладки DR6 содержит информацию о том, какая из точек останова вызвала особую ситуацию отладки, и некоторую другую информацию. Процессор никогда самостоятельно не очищает содержимое регистра DR6. Поэтому отладчик всегда должен следить за тем, чтобы на его работу не оказывали влияния старые данные в DR6.

B0..B3 (биты 0..3)

Устанавливаются при встрече соответствующей контрольной точки (каждая контрольлная точка должна быть правильно описана битами LENi и R/Wi регистра DR7) несмотря на то, разрешена для нее генерация особой ситуации отладки или нет (задается битами Li и Gi регистра DR7).

BD (бит 13)

Используется совместно с флагом DR7.GD для обеспечения сверхзащиты отладчика. Когда сверхзащита включена (DR7.GD = 1), флаг BD будет устанавливаться, если следующая команда читает или записывает один из отладочных регистров, тем самым сигнализируя отладчику о том, что особая ситуация отладки (#DB) имеет место из-за отказа при попытке обращения к отладочным регистрам.

BS (бит 14)

Бит BS устанавливается, если ловушка отладки генерируется из-за включенного пошагового режима (EFLAGS.TF = 1). Пошаговый режим является наиболее привилегированным, но когда установлен BS, также могут устанавливаться и любые из других битов состояния отладки.

BT (бит 15)

Процессор устанавливает бит BT перед входом в обработчик прерываний отладки, если происходит переключение задач и в TSS новой задачи бит T (бит шлюза отладки) установлен. Переключение происходит нормально, но перед выполнением первой команды новой задачи генерируется ловушка отладки (#DB). Таким образом, бит T в TSS позволяет организовать точки останова при переключении задач (что не может быть задано каким-либо из битов регистра управления отладкой DR7), а бит DR6.BT индицирует отладчику о том, что особая ситуация отладки вызвана переключением задач.

 

Регистр DR7

Регистр управления отладкой DR7 устанавливает режимы срабатывания точек останова и задает вызывающие их срабатывание формы доступа к памяти или вводу/выводу для каждой точки останова.

Li/Gi (биты 0…7)

Биты разрешения соответственно локальных и глобальных контрольных точек. Когда при выполнении программы процессор встречает одну из контрольных точек и для нее установлен соответствующий бит DR7.Li или DR7.Gi, генерируется особая ситуация отладки. Биты Li разрешают устанавливать контрольные точки для конкретных задач, не затрагивая другие. Gi влияют на все задачи. Биты Li автоматически очищаются при переключении задач.

LE, GE (биты 8, 9)

Управляют возможностью "точного соответствия контрольных точек данных". Если LE или GE установлен, сообщение о любой ловушке в контрольной точке по данным будет иметь место непосредственно после завершения команды, которая вызвала пересылку операнда. Если эти биты не установлены, сообщение об останове по данным может поступить спустя несколько команд или не поступить вообще. Рекомендуется устанавливать эти биты всякий раз, когда используются контрольные точки данных. При переключении задач LE очищается, GE — нет.

LENi (биты 18, 19, 22, 23, 26, 27, 30, 31)

Поля LEN задают длину проверяемого значения для каждой контрольной точки (область, внутри которой условия останова могут сработать). Длина может составлять 1, 2 или 4 байта. Значение этих полей интерпретируется следующим образом:

  • 00 – один байт;
  • 01 – два байта;
  • 10 – неопределено;
  • 11 – четыре байта.

Если задано: поле RWi = 00 (прерывание при выполнении команды), то LENi должно быть равно нулю. В зависимости от LEN должно соблюдаться выравнивание адресов контрольных точек (содержаться в DR0…DR3) по границам слов (LENi = 01) или двойных слов (LENi = 11). Перед сравнением адресов процессор маскирует младшие биты записанного в DR0…DR3 адреса битами LENi, а адреса ввода/вывода расширяются нулями с 16 до 32-х бит. Срабатывание точки останова по данным происходит, если адрес хотя бы одного байта из записываемого/читаемого значения попадает в интервал задаваемый адресом в DR0…DR3 и соответствующим значением в поле DR7.LENi. Например, при DR = B0002h, R/W = 11b (чтение/запись данных), LEN = 01b (2 байта): чтение/запись 1 или 2-байтовых операндов по адресу B0002h приведут к срабатыванию ловушки, чтение/запись 4-байтового операнда по адресу B0001h приведет к срабатыванию ловушки, чтение/запись 1 или 2-байтовых операндов по адресу B0000h не приведут к срабатыванию ловушки.

RWi (биты 16, 17, 20, 21, 24, 25, 28, 29)

Биты R и W задают, соответственно, для каждой контрольной точки в DR0…DR3 тип действия, при котором должна сработать ловушка.

  • 00 – выполнение команды;
  • 01 – запись данных;
  • 10 – Intel386, Intel486: неопределено;
           Pentium … : чтение/запись ввода/вывода (если CR4.DE = 1 — включено расширение отладки); неопределено (если CR4.DE = 0);
  • 11 – чтение/запись данных (исключая выборку команд).

IR (Перенаправление прерывания, бит 12: Intel386, Intel486, AMD K5)

Бит IR не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Назначение этого бита – управление перенаправлением прерывания (Interrupt Redirection) в связке с командой INT01. Когда IR = 0, особая ситуация 1 (Прерывание отладки) обрабатывается обычным образом. Если установить IR = 1, то процессор будет пытаться вступить во взаимодействие с внешним оборудованием для входа в режим эмуляции (ICE). Только специальные версии процессоров могут использоваться в составе отладочных стендов в режиме эмуляции. Обычно же соответствующие выводы процессоров (необходимые для взаимодействия с ICE-стендом) не активны. В процессорах, начиная с Pentium и AMD K6, механизм перенаправления прерывания управляется через специальный регистр модели — Probe Mode Control Register (PMCR), а бит IR не используется.

GD (бит 13)

Бит предназначен для защиты отладчика. Используется совместно с битом DR6.BD. Регистры отладки доступны только в реальном режиме или в защищенном режиме при уровне привилегий 0. Установка бита GD в реальном режиме и защищенном режиме на уровне привилегий 0 обеспечивает сверхзащиту всех обращений к регистрам отладки. При необходимости это гарантирует программному отладчику полный контроль над регистрами отладки. Когда бит GD установлен, попытка обратиться к любому из регистров отладки вызывает особую ситуацию 1 (Прерывание отладки). При вызове процедуры обработки бит GD автоматически сбрасывается, что обеспечивает этой процедуре свободный доступ к регистрам отладки, в то же время бит DR6.BD индицирует причину генерации прерывания.

TR (бит 14)

Бит TR (Trace 1) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Установка TR = 1 включает специальный режим трассировки, используемый при работе в составе отладочного стенда (ICE-стенд). В этом режиме после выполнения каждой команды процессор генерирует специальный цикл шины, который помогает внешнему оборудованию отслеживать всю последовательность выполняемых процессором команд.

T2 (бит 15)

Бит T2 (Trace 2) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Предположительно этот бит также необходим для взаимодействия с отладочным стендом (ICE-стенд). Вероятно он отвечает за индикацию переполнения внешнего лога трассировки, то есть информирует о том, что оборудование отладочного стенда не в состоянии отследить последовательность из множества обрабатываемых процессором команд.

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Тестовые регистры http://www.club155.ru/x86internalreg-tr http://www.club155.ru/x86internalreg-tr  

В процессорах Intel386, Intel486 для тестирования некоторых элементов применялись т.н. тестовые регистры. TR3, TR4, TR5 — для тестирования встроенного КЭШ (Intel486), и TR6, TR7 — для тестирования TLB (Intel386, Intel486). Доступ к указанным регистрам осуществлялся при CPL = 0 с помощью команды MOV TR. В последующих моделях процессоров (Pentium …) Intel и другие производители отошли от данной архитектуры, функции тестирования процессора реализуются в них с помощью фирменной, зависимой от процессора архитектуры (для процессоров Intel через MSR-регистры). Попытка выполнения команд доступа к тестовым регистрам MOV TR в этих процессорах приведет к генерации ошибки "неопределенный код опереции" (#UD).

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Специальные регистры модели http://www.club155.ru/x86internalreg-msr http://www.club155.ru/x86internalreg-msr  

Современные микропроцессоры архитектуры 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 (базовый адрес сегмента содержится в его дескрипторе).

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Внутренние регистры: Регистры общего назначения FPU http://www.club155.ru/x86internalreg-fpucommon http://www.club155.ru/x86internalreg-fpucommon  

Блок вычислений с плавающей точкой (FPUFloating Point Unit) также содержит набор внутренних регистров различного назначения. Эти регистры используются для хранения операндов, управления и индикации состояния.

Математический сопроцессор содержит восемь 80 рязрядных регистров общего назначения R0..R7 (рис. 1.11.), которые образуют специальный регистровый стек FPU. Регистры стека обозначаются как ST(0)..ST(7) и ассоциируются с физическими регистрами R0..R7 в порядке возрастания номеров. Номер регистра, соответствующего вершине стека ST(0), определяется полем TOP регистра состояния SW. Кроме этого, каждому регистру R0..R7 соответствует двухбитовое поле в регистре тэгов TW. ST(0) также может обозначаться как ST.

 

Формат регистров общего назначения FPU

Рис. 1.11. Формат регистров общего назначения FPU

 

FPU — это функционально самостоятельный модуль, который вплоть до процессора Intel486 реализовывался в отдельной микросхеме (т.н. математический сопроцессор). Доступ к регистрам FPU возможен только с помощью специальных команд сопроцессора. В микропроцессорах начиная с Pentium математический сопроцессор встроенный.

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000