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#x86architecture Sat, 27 Apr 2024 09:53:06 +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/x86addr-multitasking http://www.club155.ru/x86addr-multitasking  

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

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

Механизм мультизадачности

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

 

Регистр задачи хранит селектор TSS текущей задачи. Сам TSS предназначен для хранения полного контекста и состояния задачи и уникален для каждой выполняемой задачи (см. рис. 2.6.).

 

Связь регистра задачи TR и сегмента состояния задачи TSS

Рис. 2.6. Связь регистра задачи TR и сегмента состояния задачи TSS

 

После сброса процессора механизм мультизадачности отключен, для его инициализации необходимо сначала перевести процессор в защищенный режим, затем создать TSS для новой задачи и загрузить командой LTR регистр задачи корректным селектором. Корректное выполнение программ в защищенном режиме возможно только при инициализированной мультизадачности. Даже если предстоит выполнять одну программу, она запускается как одна задача в мультизадачном окружении. Более сложные системы могут использовать развитые возможности процессора по диспетчеризации, сохранению состояния и переключению различных задач.

Типы задач и контекст задачи

Существует несколько типов задач, которые отличаются режимами работы процессора при их выполнении: 32-разрядные задачи, 16-разрядные задачи, задачи V86. Все эти задачи могут попеременно выполняться совершенно независимо друг от друга. Процессор обеспечивает полное переключение контекста и режима при переходе от одной задачи к другой. Переключение задач может осуществляться в следующих случаях:

  • при явном вызове командой CALL;
  • при явном переходе по команде JMP;
  • при неявном вызове (автоматически процессором) задачи обработки прерывания;
  • при неявном вызове задачи обработчика исключения;
  • при возврате из процедуры по команде IRET, когда EFLAGS.NT = 1.

Контекст каждой задачи хранится в соответствующем TSS и включает:

Таким образом, каждая задача может иметь: свое линейное адресное пространство, заданное своей локальной таблицей дескрипторов (LDT), свое физическое адресное пространство, расположенное в любой доступной области и задаваемое страничным механизмом (базовый адрес каталога страниц в CR3), свой протокол защиты, обеспечиваемый указателями на стеки разных уровней привилегий и картой ввода/вывода. Поле селектора TSS предыдущей задачи обеспечивает возможность возврата при последовательном вызове нескольких вложенных задач.

Переключение задач

Нормальное переключение задач обеспечивается специальными дескрипторами в таблицах дескрипторов LDT, GDT или IDT. Такими дескрипторами являются 16- и 32-разрядные дескрипторы TSS и дескриптор шлюза задачи. Дескриптор шлюза задачи предназначен для перенаправления всех указывающих на него вызовов (CALL), переходов (JMP) и векторов прерываний (особых ситуаций) на обработку в отдельную задачу (рис. 2.7.).

 

Принцип работы механизма переключения задач

Рис. 2.7. Принцип работы механизма переключения задач

 

Полностью процесс переключения задачи (все выполняемые процессором действия) выглядит следующим образом.

  1. Получение селектор TSS новой задачи либо как операнда в командах CALL, JMP, либо из дескриптора шлюза задачи, либо из поля LINK сегмента состояния  текущей задачи (если переключение задач инициализировано командой IRET).
  2. Проверка соответствия всех уровней привилегий с целью определения допустимости переключения на новую задачу.
  3. Проверка дескриптора TSS новой задачи (сегмент присутствует и имеет корректный предел, не менее 67h для 32-битного TSS).
  4. Проверка того, что новая задача своботна (CALL, JMP, особая ситуация или прерывание) или занята (IRET).
  5. Проверка того, что TSS текущей (старой) задачи, TSS новой задачи и все дескрипторы, используемые при переключении задач, отображены страничным механизмом на физическую память (т.е. присутствуют в памяти).
  6. Очистка бита занятости задачи в TSS старой задачи, если переключение задач инициировано командами JMP или IRET (для CALL, особой ситуации или прерывания бит занятости остается установленным).
  7. Производится сохранение контекста старой задачи. Процессор определяет базовый адрес TSS текущей задачи по значению в регистре TR и затем последовательно сохраняет дянные из всех регистров общего назначения, селекторы из сегментных регистров, значение регистра EFLAGS (причем, если переключение задач инициировано командой IRET, процессор очищает флаг NT в сохраняемой копии регистра EFLAGS), значение указателя команд EIP и т.д.
    В данной точке процессор осуществляет переключение задачи. Это означает, что если какая-либо ошибка вознкает на шагах с 1 по 7, то переключения задач не происходит и процессор полностью возвращается в состояние, предшествовавшее команде, инициировавшей переключение задач. Но если ошибка происходит на последующих шагах, то процессор заканчивает переключение задач (без некоторых проверок) и генерирует соответствующую ошибку перед началом выполнения новой задачи (в этом случае обработчик ошибки должен сам полностью завершить переключение задач для запуска новой задачи).
  8. Если переключение задач было инициировано командой CALL, прерыванием или особой ситуацией, то процессор копирует селектор TSS старой задачи в поле LINK сегмента TSS новой задачи и устанавливает флаг NT в образе регистра EFLAGS, хранимом в TSS новой задачи.
  9. Если переключение задач было инициировано командами CALL, JMP, прерыванием или особой ситуацией, процессор устанавливает флаг занятости B в дескрипторе TSS новой задачи.
  10. Устанавливается флаг TS в регистре CR0.
  11. Производится запись в регистр TR значений селектора и дескриптора (в скрытую часть) TSS новой задачи.
  12. Производится чтение контекста новой задачи из TSS. Считываются значения всех регистров общего назначения, сегментных регистров, регистра флагов EFLAGSуказателя команд EIP и др. (в т.ч. значения для регистров LDTR, CR3).
  13. Начинается выполнение команд новой задачи.

 

Таблица 2.3. Проверки и исключения, инициируемые в процессе переключения задач

{loadposition custom_position_T2-3}

 

Вложенные задачи

Для отслеживания цепочек последовательных вызовов задач предназначено поле LINK в сегменте TSS и флаг NT регистра EFLAGS. При вызове (командой CALL, прерыванием или особой ситуацией) новой задачи из кода другой задачи (напрямую или через дескриптор шлюза задачи) для индикации того, что новая задача является вложенной, устанавливается флаг NT.EFLAGS, а селектор TSS старой задачи помещается в поле обратной связи LINK сегмента TSS новой задачи. Указанные действия повторяются, если вложенная задача сама вызывает еще одну задачу и т.д. (см. рис. 2.8.).

При приходе команды IRET процессор производит возврат к задаче более высокого уровня. При этом поле LINK сегмента TSS закрываемой задачи используется для получения селектора TSS задачи, к которой производится возврат, флаг NT.EFLAGS после возврата устанавливается в значение, которое было сохранено в TSS перед вызовом вложенной задачи.

 

Связь между вложенными задачами

Рис. 2.8. Связь между вложенными задачами

 

В случае, если обращение к новой задаче производится командой JMP, новая задача не считается вложенной, флаг NT не устанавливается и поле LINK не используется.

Во всех случаях и для всех типов описываемых процессоров рекурсивный вызов задач невозможен. Процессор автоматически предотвращает такую возможность опираясь на значение флага B (занятость) в дескрипторе TSS вызываемой задачи.

 

Таблица 2.4. Влияние различных способов переключения задач на флаги EFLAGS.NT, CR0.TS, поле занятости дескриптора B, поле обратной связи LINK

{loadposition custom_position_T2-4}

 

 

Особенности переключения задач в программах, использующих FPU и расширенные системы команд MMX, 3DNow!, SIMD

При переключении задач процессор не производит автоматического переключения контекста для FPU/MMX/SIMD. Программа должна самостоятельно позаботится о том, чтобы значения в соответствующих FPU/MMX/SIMD-регистрах соответствовали текущей выполняемой задаче. Однако ввиду того, что в мультизадачных операционных системах переключение задач может происходить в случайные моменты времени (например, ввиду генерации внешнего прерывания) в процессор введен специальный механизм для поддержки переключения контекста FPU/MMX/SIMD. Работа этого механизма обуславливается наличием специального флага индикации переключения задач CR0.TS, который устанавливается во всех без исключения случаях переключения задач.

В нормальном режиме флаг CR0.TS сброшен и все команды FPU/MMX/SIMD выполняются в обычном режиме. После того, как произошло переключение задач CR0.TS автоматически устанавливается. Теперь любая команда FPU/MMX/SIMD (в т.ч. и все 3DNow! команды) перед своим исполнением вызовет генерацию особой ситуации #NM (Сопроцессор отсутствует).

Многозадачные операционные системы должны содержать в себе специальную программу обработчик прерывания #NM, которая обеспечит соответствие контекста FPU/MMX/SIMD текущей задаче. Т.е. этот обработчик при получении управления должен: сбросить флаг CR0.TS; проверить, соответствует ли текущий контекст FPU/MMX/SIMD текущей выполняемой задаче, если соответствует — управление возвращается к прерванной команде, если нет — обработчик должен сохранить значения всех регистров FPU/MMX/SIMD в специальной области памяти, загрузить из другой специальной области памяти значения всех этих регистров для новой задачи и затем передать управление прерванной команде. Естественно в обработчик должен быть заложен механизм слежения за текущими задачами для гарантии полного соответствия всех сохраняемых и загружаемых контекстов своим задачам.

Для сохранения контекста FPU/MMX/SIMD могут применяться различные команды и последовательности команд. Это вызвано прежде всего тем, что с развитием архитектуры процессоров старые команды для сохранения совместимости оставлялись без изменений, а новые команды вводились для обеспечения работы появившихся расширений.

 

Таблица 2.5. Команды, применяемые для сохранения/восстановления контекста FPU/MMX/SIMD

{loadposition custom_position_T2-5}

 

Специальный флаг CR4.OSFXSR введен для индикации операционной системой того, осуществляет ли она переключение контекста FPU командами FXSAVE и FXRSTOR, обеспечивая таким образом переключение контекста SIMD.

 

{loadposition article_footer}

 

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

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

Страничный механизм может быть задействован только в защищенном режиме (а также и в режиме V86) работы процессора. Включение/выключение страничного механизма производится установкой/сбросом бита CR0.PG.

Страничный механизм и текущий объем поддерживаемой физической памяти не оказывают влияния на формирование линейного адреса, который всегда остается 32-разрядным. Однако страничный механизм позволяет для каждой задачи задать свой протокол отображения линейного адреса на физический. Это свойство используется при выполнении задач в режиме V86 для отображения урезанного линейного адресного пространства задач процессора 8086 на старшие области физической памяти.

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

 

Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 4Мб страниц и 32-разрядного физического адреса и в режиме PSE-36

Рис. 2.4. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 4Мб страниц и 32-разрядного физического адреса и в режиме PSE-36

Расширение физического адреса (PAE)

В процессорах начиная с Pentium Pro возможна реализация специального механизма расширения физического адреса (управляется битом CR4.PAE). При этом процессор может адресовать физическую память объемом до 236 байт (64 Гб). Для поддержки работы данного расширения некоторые изменения вводятся и в механизм страничных преобразований. Заметим, что изменения касаются только страничного механизма, формирование линейного адреса происходит обычным образом независимо от текущего значения CR4.PAE и линейный адрес всегда остается 32-битным. Но поскольку для каждой задачи может быть задан свой протокол отображения линейного адреса на физический, в многозадачной среде становится возможным использование физической памяти объемом больше, чем общий объем линейного адресного пространства, доступного каждой конкретной задаче (232 байт).

Когда расширение физического адреса включено (CR4.PAE = 1) страничный механизм поддерживает страницы размером 4 Кб и 2 Мб, а в иерархию таблиц страничных преобразований вводится еще одна таблица — таблица указателей на каталоги страниц (рис. 2.5.).

 

Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 2Мб страниц и 36-разрядного физического адреса

Рис. 2.5. Процесс формирования физического адреса при работе со страничным механизмом в режимах 4Кб и 2Мб страниц и 36-разрядного физического адреса

 

36-битное расширение размера страниц (PSE-36)

Еще одно расширение страничного механизма может вводится в процессоры поддерживающие 36-разрядную адресацию физической памяти (Pentium Pro …). PSE‑36 (36-bit Page Size Extension) — 36-битное расширение размера страниц. Это расширение не является управляемым, т.е. не может включаться/выключаться специальными битами в управляющих регистрах, оно либо поддерживается процессором, либо нет (определяется командой CPUID).

Расширение PSE-36 позволяет организовать отображение 4 Мб страниц на 36-битное физическое адресное пространство. Характерно, что осуществляется это небольшой модификацией режима 32-битного физического адреса (CR4.PAE = 0, CR4.PSE = 1). В режиме 36-битного адреса (CR4.PAE = 1) PSE-36 не оказывает никакого влияния на работу процессора, так как структура таблиц страничных преобразований изменена и уже предполагает 36-битную адресацию.

Поддержка PSE-36 означает, что в элементе каталога страниц для 4 Мб страницы вместо 10 бит базового адреса страницы поддерживается 14 бит. Старшие 4 бита располагаются в поле ранее считавшемся зарезервированным и заполнявшемся нулями. Такое решение позволяет программному обеспечению, написанному для более ранних моделей процессоров, которые не поддерживают PSE-36, без изменений работать на всех современных моделях (если только ПО как-либо не использовало зарезервированные биты или не записывало в них единицы). Программы же, написанные для процессоров с поддержкой PSE-36 и использующие это расширение, не смогут нормально функционировать на процессорах без PSE-36.

 

Таблица 2.2. Размерность физического адреса в различных режимах работы процессора: Pentium Pro …

{loadposition custom_position_T2-2}

 

Работа страничного механизма при поддержке PSE-36 изображена на рис. 2.4. (значения разрядности адреса для PSE-36 приведены в скобках).

 

{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
Внутренние регистры: Регистр состояния FPU http://www.club155.ru/x86internalreg-fpusw http://www.club155.ru/x86internalreg-fpusw  

Регистр состояния FPU (рис. 1.13.) выполняет функции в чем-то аналогичные функциям регистра флагов (E)FLAGS, но только для операций с плавающей точкой. За исключением одного бита (SF), его формат и функции совершенно идентичны для всех сопроцессоров архитектуры x87 (начиная с 8087).

 

Формат регистра состояния SW (регистра флагов FPU)

Рис. 1.13. Формат регистра состояния SW (регистра флагов FPU)

 

B (Бит занятости, бит 15)

Бит занятости сохранен для совместимости с 8087 и Intel287, где он устанавливается в 1, когда сопроцессор выполняет команду, или происходит прерывание в сопроцессоре в результате исключительной ситуации. Если сопроцессор свободен, бит занятости установлен в 0. В современных процессорах (Intel387, Intel486, …) этот бит дублирует состояние бита ES.

 

TOP (Указатель вершины стека FPU, биты 13, 12, 11)

Содержит номер 80-битного регистра общего назначения, являющегося вершиной стека.

  • 000 – R0;
  • 001 – R1;
  • ...
  • 111 – R7.

 

C0, C1, C2, C3 (Коды условий, биты 8, 9, 10, 14)

Коды условий FPU аналогичны флагам CPU из регистра флагов (E)FLAGS. FPU устанавливает значения этих битов по результатам арифметических операций.

 

Таблица 1.1. Интерпретация кодов условий

{loadposition custom_position_T1-1}

Команда FSTSW копирует значение слова состояния сопроцессора в регистр AX процессора. Далее командой SAHF можно скопировать флаги C3..C0 в регистр флагов FLAGS.

 

Таблица 1.2. Соответствие между битами C3..C0 и битами регистра флагов CPU

{loadposition custom_position_T1-2}

 

ES (Бит суммарной ошибки, бит 7: Intel287 …),
IR (Флаг запроса прерывания, бит 7: только для 8087)

В сопроцессорах 8087 этот бит содержит флаг запроса прерывания (IR), который устанавливается в единицу при возникновении какой-либо незамаскированной исключительной ситуации. Значение флага IR повторяется на выводе INT# сопроцессора. Флаг IR может быть замаскирован программно установкой бита IEM регистра управления FPU.

Во всех последующих моделях FPU (Intel287 …) этот бит называется битом суммарной ошибки (ES) и устанавливается в 1 при возникновении какой-либо незамаскированной исключительной ситуации, иначе — очищается. При установленном бите ES, активизируется сигнал на выводе ERROR# (Intel287, Intel387) или FERR# (Intel486 …).

 

SF (Стековая ошибка, бит 6: Intel387 …)

Eсли исключение недействительная операция (#I) возникает в результате выхода за верхнюю или нижнюю границы регистрового стека (#IS), то устанавливается не только бит 0 (IE) слова состояния, но и бит 6 (SF), при этом бит 9 (C1) указывает на выход за верхнюю границу (переполнение) стека (C1 = 1) или на выход за нижнюю границу (C1 = 0).

В сопроцессорах Intel287 и 8087 этот бит не используется и является зарезервированным.

 

PE, UE, OE, ZE, DE, IE (Флаги исключительных ситуаций, биты 5, 4, 3, 2, 1, 0)

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

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

 

{loadposition article_footer}

 

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

Ниже на рис. 2.10. ... 2.16. представлены форматы всех возможных типов дескрипторов для Intel386 и т.д. (32-битные дескрипторы). 16-битные дескрипторы процессора Intel286 для совместимости поддерживаются и всеми последующими процессорами, они во всем аналогичны 32-битным дескрипторам, за исключением того, что старшее слово старшего двойного слова в них описано как зарезервированное, и при запуске программ Intel286 на 32‑разрядных процессорах должно быть нулевым.

 

Формат дескриптора сегмента данных

Рис. 2.10. Формат дескриптора сегмента данных

 

Формат дескриптора сегмента кода

Рис. 2.11. Формат дескриптора сегмента кода

 

Формат дескриптора 32-битного шлюза вызова

Рис. 2.12. Формат дескриптора 32-битного шлюза вызова

 

Формат дескриптора 32-битного TSS

Рис. 2.13. Формат дескриптора 32-битного TSS

 

Формат дескриптора шлюза задачи

Рис. 2.14. Формат дескриптора шлюза задачи

 

Формат дескриптора 32-битного шлюза прерывания

Рис. 2.15. Формат дескриптора 32-битного шлюза прерывания

 

Формат дескриптора 32-битного шлюза ловушки

Рис. 2.16. Формат дескриптора 32-битного шлюза ловушки

 

A (Доступ: Intel286 …)

Бит доступа устанавливается процессором после загрузки в сегментный регистр селектора соответствующего сегмента кода или данных. Предварительно очистив бит A, программное обеспечение может позже проверить, осуществлялся ли доступ к сегменту.

Процессоры Intel486 … осуществляют цикл записи в память нового значения бита A = 1, только если он не был установлен; Intel286 и Intel386 делают это независимо от его текущего значения.

 

AVL (Свободный: Intel386 …)

Бит оставлен свободным и может использоваться системным ПО для своих нужд.

 

B (Размерность: Intel386 …)

Бит размерности присутствует в дескрипторах сегментов данных. Он управляет следующими аспектами операций.

  • Размерностью регистра указателя для стековых сегментов. Если B = 1, используется 32-битный указатель ESP. Если B = 0 — 16-битный указатель SP.
  • Верхней границей расширяемого вниз сегмента. В расширяемых вниз сегментах нижняя граница задается полем LIMIT, а верхняя равна FFFFFFFFh, если B = 1, и FFFFh, если B = 0.

Бит размерности всегда должен устанавливаться в 0 для 16-битных сегментов и в 1 для 32-битных сегментов.

 

BASE (База: Intel286 – 24 бита, Intel386 … – 32 бита)

Задает положение сегмента в 4 Гбайтном (16М для Intel286) адресном пространстве. Для максимального быстродействия рекомендуется, чтобы значение базы было выровнено по 16 байтным границам. Для дескрипторов Intel286 определены только младшие 24 бита этого поля.

 

C (Согласование: Intel286 …)

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

 

COUNT (Счетчик: Intel286 …)

Для 32-битного шлюза задает количество двойных слов, копируемых из стека вызывающей процедуры в стек вызываемой. В случае 16-битного шлюза, задает количество слов, копируемых из стека вызывающей процедуры в стек вызываемой.

 

D (Разрядность по умолчанию: Intel386 …)

Задает разрядность операндов и адресов, принимаемую по умолчанию (разрядность по умолчанию может быть изменена префиксом размера операнда и префиксом размера адреса). Если D = 1, то устанавливается режим 32-битных операндов и 32-битного адреса. Если D = 0, то адреса и операнды 16-битные.

 

DPL (Уровень привилегий дескриптора: Intel286 …)

Задает уровень привилегий сегмента или шлюза, который (уровень) используется механизмом защиты для контроля доступа к сегменту или шлюзу. Наивысшие привилегии имеет уровень 0, наименьшие — уровень 3. В зависимости от способа доступа и типа сегмента, DPL выполняет следующие функции:

  • Для сегмента данных. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к сегменту данных с DPL = 1. В случае стекового сегмента, при загрузке в регистр SS нового селектора необходимо, чтобы все привилегии (текущий CPL, RPL загружаемого селектора и DPL дескриптора) совпадали, в противном случае генерируется ошибка общей защиты (#GP).
  • Для несогласованного кодового сегмента. DPL содержит уровень привилегий, который должна иметь программ для доступа к сегменту. Например, если DPL = 2, то только программы с CPL = 2 могут обращаться к сегменту. При обращении к такому сегменту через шлюз вызова командой CALL, DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ. Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2.
  • Для согласованного кодового сегмента и для сегмента TSS. DPL содержит самое низкое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к такому сегменту (задаче). Например, только программы с CPL = 2 или CPL = 3 могут обращаться к сегменту с DPL = 2. При обращении к новой задаче через шлюз задачи поле DPL дескриптора TSS новой задачи не проверяется.
  • Для шлюзов. DPL содержит самое высокое числовое значение уровня привилегий, который может иметь программа, чтобы ей был разрешен доступ к шлюзу. Например, только программы с CPL = 0 или CPL = 1 могут обращаться к шлюзу с DPL = 1. Для шлюза ловушки и шлюза прерывания процессор проверяет значение DPL, только если прерывание вызвано командами INT n, INT 3, INTO.

 

E (Расширяемость: Intel286 …)

Задает направление расширения сегмента.

  • E = 1 — сегмент расширяется вниз (стек);
  • E = 0 — сегмент расширяется вверх.

 

G (Гранулярность: Intel386 …)

Бит гранулярности задает масштаб поля LIMIT. Когда G = 0, предел задается в байтах, если G = 1 — в 4-Кбайтных блоках.

 

LIMIT (Предел: Intel286 – 16 бит, Intel386 … – 20 бит)

Задает размер сегмента. Процессор может интерпретировать это поле двумя способами в зависимости от значения поля G (гранулярность).

  • Если G = 0, то предел задает размер сегмента в байтах (от 1 байта до 1 Мбайта).
  • Если G = 1, то предел задает размер сегмента в 4-Кбайтных параграфах (от 4 Кбайт до 4 Гбайт).

Для сегментов, расширяющихся вверх, логический адрес может принимать любое значение от 0 до LIMIT. Для сегментов, расширяющихся вниз (стековые сегменты), смысл поля LIMIT переворачивается, т.е. логический адрес может принимать любые значения кроме значений от 0 до LIMIT.

Для дескрипторов Intel286 определены только младшие 16 бит этого поля, а размер сегмента всегда задается только в байтах.

 

OFFSET (Смещение: Intel286 …)

Смещение точки входа в целевом сегменте.

 

P (Присутствие: Intel286 …)

Бит присутствия сегмента в физической памяти. Если этот бит не установлен, процессор генерирует особую ситуацию #NP (Сегмент не присутствует), когда селектор дескриптора загружается в сегментный регистр.

 

R (Разрешение чтения: Intel286 …)

Бит R разрешает/запрещает чтение из кодового сегмента. Когда чтение запрещено программы могут передавать управление в сегмент (т.е. он остается исполняемым), но чтение кода как данных из сегмента невозможно.

  • R = 1 — чтение возможно;
  • R = 0 — чтение запрещено.

 

S (Системный, бит 12 старшего двойного слова дескриптора: Intel286 …)

Задает вид дескриптора. Если S = 0, то дескриптор считается системным. Если S=1, то это дескриптор сегмента кода или данных. Системные дескрипторы выполняют важнейшие функции по управлению прерываниями, вызовами подпрограмм, переключениями задач. Тип системного дескриптора задается полем TYPE.

 

SELECTOR (Селектор: Intel286 …)

Селектор целевого сегмента или (для шлюза задачи) селектор TSS целевой задачи.

 

TYPE (Тип, биты 11..8 старшего двойного слова дескриптора: Intel286 …)

Поле тип содержит биты, которые задают назначение (тип) системного дескриптора.

TYPE Описание
---------------------------------- Intel286 …
0000 Зарезервировано
0001 Свободный 16-битный TSS
0010 Локальная таблица дескрипторов (LDT)
0011 Занятый 16-битный TSS
0100 16-битный шлюз вызова
0101 Шлюз задачи
0110 16-битный шлюз прерывания
0111 16-битный шлюз ловушки
-------------------------------------------- Intel386 …
1000 Зарезервировано
1001 Свободный 32-битный TSS
1010 Зарезервировано
1011 Занятый 32-битный TSS
1100 32-битный шлюз вызова
1101 Зарезервировано
1110 32-битный шлюз прерывания
1111 32-битный шлюз ловушки

 

W (Разрешение записи: Intel286 …)

Бит разрешения/запрещения записи в сегмент данных.

  • W = 1 — запись возможна;
  • W = 0 — запись запрещена.

 

{loadposition article_footer}

 

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

Регистр управления CW (рис. 1.14.) предназначен для управления режимами работы сопроцессора. Он содержит ряд полей, значения которых влияют на точность результата, поведение процессора при встрече некорректных операндов и результатов и т.п.

 

Формат регистра управления FPU

Рис. 1.14. Формат регистра управления FPU

 

IC (Управление бесконечностью, бит 12: Intel287, 8087)

В сопроцессорах Intel287 и 8087 данный бит определяет, что +∞ и -∞ считаются одной беззнаковой бесконечностью (IC = 0) — проективная арифметика; или что +∞ и -∞ считаются двумя знаковыми бесконечностями (IC = 1) — аффинная арифметика.

В более поздних сопроцессорах, поддерживающих стандарт IEEE-754 (Intel387, Intel486, Pentium, …), данный бит, хотя и может программироваться, но не влияет на работу FPU — независимо от значения IC всегда применяется аффинная арифметика (-∞ < +∞).

 

RC (Управление округлением, биты 11, 10)

Поле RC определяет выбор одного из четырех методов округления результатов операций FPU:

  • 00 – округление к ближайшему (четному);
  • 01 – округление вниз (к -∞);
  • 10 – округление вверх (к +∞);
  • 11 – округление к нулю.

 

PC (Управление точностью, биты 9, 8)

Указывает точность представления результатов арифметических операций FADD, FADDP, FSUB, FSUBP, FSUBR, FSUBRP, FMUL, FMULP, FDIV, FDIVP, FDIVRFDIVRP и FSQRT. Доступны следующие режимы представления:

  • 00 – 24 бита мантисса, 7 бит порядок;
  • 01 – зарезервировано;
  • 10 – 53 бита мантисса, 10 бит порядок (двойная точность);
  • 11 – 64 бита мантисса, 15 бит порядок (расширенная точность).

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

 

IEM (Запрет прерываний, бит 7: только для 8087)

В сопроцессоре 8087 этот бит маскирует флаг запроса прерывания IR, то есть, независимо от значений шести масок исключений, сигнал IEM = 1 запрещает генерацию прерываний при возникновении ошибок сопроцессора.

Во всех современных микропроцессорах (Intel287, Intel387, Intel486, …) бит 7 регистра CW зарезервирован.

 

PM, UM, OM, ZM, DM, IM (Маски исключений, биты 5, 4, 3, 2, 1, 0)

Биты содержат индивидуальные маски для каждой из шести исключительных ситуаций сопроцессора. Установка бита маски запрещает прерывание при возникновении соответствующей ошибки FPU (см. Исключения FPU). Каждому исключению соответствует свой бит маски:

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

 

{loadposition article_footer}

 

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

Регистр указателя команд (FIP), регистр указателя данных (FDP) и регистр кода операции (Opcode Register) предназначены для использования обработчиком исключений. Всегда при приходе команды ESC (кроме FINIT, FCLEX, FLDCW, FSTCW, FSTSW, FSTSW AX, FSTENV, FLDENV, FSAVEFRSTOR и FWAIT) процессор сохраняет адрес команды, адрес операнда (если присутствует) и код операции в названных регистрах указателях. Содержимое этих регистров не изменяется при выполнении последующих управляющих команд (перечислены выше).

Доступ к этим регистрам осуществляется с помощью команд FSTENV, FLDENV, FSAVE и FRSTOR. После выполнения команд FINIT и FSAVE указанные регистры очищаются.

При записи в память указатели команды и данных могут представляться в четырех различных форматах в зависимости от режима работы процессора и атрибута размера адреса команды. На рис. 1.15. ... 1.18. представлены эти форматы при использовании команд FSTENV, FLDENV. На рисунке 1.19. показано, как процессор формирует из двухбайтного (без учета префиксов) кода команды FPU 11‑разрядный код для сохранения в регистре кода операции.

 

Формат данных FSTENV, FLDENV в 32-битном защищенном режиме для сопроцессоров Intel387, Intel486 …

Рис. 1.15. Формат данных FSTENV, FLDENV в 32-битном защищенном режиме для сопроцессоров Intel387, Intel486 …

 

Формат данных FSTENV, FLDENV в 32-битном режиме реальной адресации для сопроцессоров Intel387, Intel486 …

Рис. 1.16. Формат данных FSTENV, FLDENV в 32-битном режиме реальной адресации для сопроцессоров Intel387, Intel486 …

 

Формат данных FSTENV, FLDENV в 16-битном защищенном режиме для сопроцессоров Intel287, Intel387, Intel486 …

Рис. 1.17. Формат данных FSTENV, FLDENV в 16-битном защищенном режиме для сопроцессоров Intel287, Intel387, Intel486 …

 

Формат данных FSTENV, FLDENV в 16-битном режиме реальной адресации для всех сопроцессоров и в режиме V86 для сопроцессоров Intel387, Intel486 …

Рис. 1.18. Формат данных FSTENV, FLDENV в 16-битном режиме реальной адресации для всех сопроцессоров и в режиме V86 для сопроцессоров Intel387, Intel486 …

 

Формирование содержимого регистра кода операции

Рис. 1.19. Формирование содержимого регистра кода операции

 

Во всех сопроцессорах кроме 8087 адрес команды учитывает наличие префиксов. В 8087 префиксы не учитываются.

 

{loadposition article_footer}

 

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

Технологии MMX фирмы Intel и 3DNow! фирмы AMD построены на основе структурного расширения процессора. По сути технология 3DNow! является расширением технологии MMX. Обе они включают:

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

MMX-регистры (они же 3DNow!-регистры) — это восемь 64-разрядных регистров (MM0 … MM7), которые отображены на младшие 64 бита регистров общего назначения FPU (R0 … R7). То есть регистры MMX по сути являются логическими регистрами, физически совмещенными с регистрами R0 … R7. Это значит, что при записи информации в MMX-регистр, записываемое значение автоматически появляется в младших битах соотвествующего регистра FPU, и наоборот, при записи в регистровый стек FPU значения младших 64 бит записываемой величины окажутся в соответствующем MMX-регистре (см. рис. 1.20.).

 

Отображение MMX-регистров на регистры FPU

Рис. 1.20. Отображение MMX-регистров на регистры FPU

 

Поскольку регистры FPU (R0 … R7) организуют так называемый регистровый стек (ST0 … ST7), то в зависимости от текущего значения поля TOP регистра состояния FPU (SW) будет меняться соответствие регистров стека и MMX-регистров.

Например, при SW.TOP = 0:

  • MM0 отображается на ST0,
  • MM1 — на ST1 и т.д.;

при SW.TOP = 2:

  • MM0 отображается на ST6,
  • MM1 — на ST7,
  • MM2 — на ST0 и т.д.

FPU располагает своим механизмом отслеживания типов данных, находящихся в регистрах R0 … R7. Это поля тэгов, поставленные в соответствие каждому регистру. Однако технологии MMX и 3DNow! вводят новые типы данных, которые не могут быть корректно обработаны FPU. Поэтому при выполнении команд MMX и 3DNow! (кроме EMMS, FEMMS, PREFETCH) все поля тэгов устанавливаются в 00b (действительный). (Команды EMMS и FEMMS заполняют все поля тэгов значениями 11b (пустой). Команда PREFETCH не изменяет значения тэгов.)

 

Таблица 1.3. Влияние MMX- и 3DNow!- команд на контекст FPU

{loadposition custom_position_T1-3}

Так как команды MMX3DNow! и команды FPU используют физически одни и те же регистры, для сохранения и восстановления контекста MMX, 3DNow! используются команды FPU — FSAVE и FRSTOR.

 

{loadposition article_footer}

 

]]>
admin@club155.ru (Administrator) Архитектура и система команд микропроцессоров x86 Tue, 10 Oct 2006 23:16:20 +0000
Прерывания и особые ситуации: Защищенный режим http://www.club155.ru/x86exceptions-protectedmode http://www.club155.ru/x86exceptions-protectedmode  

Работа механизма реакции на прерывания и особые ситуации в защищенном режиме базируется на специальной таблице дескрипторов прерываний (Protected-Mode Interrupt Descriptor Table – IDT). Базовый адрес (BASE) этой таблицы и ее предел (LIMIT) заносятся в регистр IDTR с помощью команды LIDT (см. рис. 3.3).

Таблица IDT содержит до 256 специальных дескрипторов, каждый из которых соответствует своему прерыванию. Эти дескрипторы занимают по 8 байт каждый и располагаются в таблице последовательно без каких-либо промежутков. Самый первый дескриптор, расположенный по самому младшему адресу в начале таблицы соответствует прерыванию 0, а самый последний дескриптор, расположенный по самому старшему адресу в таблице, соответствует прерыванию 255.

 

Таблица дескрипторов прерываний (IDT) в защищенном режиме работы

Рис. 3.3. Таблица дескрипторов прерываний (IDT) в защищенном режиме работы

 

В качестве дескрипторов таблицы IDT могут использоваться дескрипторы разного типашлюза прерывания, шлюза ловушки и шлюза задачи. Поведение процессора при поступлении запроса на прерывание зависит, как от типа применяемого для данного прерывания дескрипторов, так и от текущего уровня привилегий задачи.

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

Если в качестве дескриптора прерывания используется шлюз ловушки или шлюз прерывания, то переключения задач не происходит и программа обработчик функционирует в рамках той же задачи, что и прерванный код. Отличие шлюза прерывания состот лишь в том, что процессор автоматически сбрасывает флаг EFLAGS.IF при передаче управления в обработчик, чем обеспечивается маскирование внешних прерываний. В последующем, при возврате из процедуры обработчика прежнее значение регистра EFLAGS восстанавливается из стека.

 

Особенности работы процессора при передаче управления обработчику прерываний защищенного режима

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

  • процессор не проверяет текущий уровень привилегий CPL для внешних прерываний;
  • поскольку для прерываний не существует отдельного селектора, то все правила для запрашиваемого уровня привилегий селектора (RPL) игнорируются;
  • процессор проверяет уровень привилегий DPL шлюза только для программных прерываний, генерируемых командами INT n, INT 3, INTO, с тем, чтобы предотвратить генерацию таких прерываний, если CPL > DPL.

Если обработчик прерывания защищенного режима (Protected-mode Exception and Interrupt Handler) будет расположен в согласованном кодовом сегменте, то ему при получении управления будет доступен только сегмент стека и те сегменты, привилегии которых позволяют это. Если же обработчик будет размещен в несогласованном кодовом сегменте с нулевым уровнем привилегий, то независимо от CPL прерванной программы ему будут доступны все сегменты.

При поступлении запроса на прерывание процессор сохраняет текущие значения EFLAGS, CS и EIP в стеке. Если для обрабатываемого прерывания предусмотрена генерация кода ошибки, то этот код сохраняется в стеке сразу после значения EIP.

Когда передача управления в обработчик связана с изменением уровня привилегий на более высокий (меньшее числовое значение), это сопровождается переключением стека. Новые значения для SS и ESP берутся из TSS задачи в соответствии с уровнем привилегий обработчика. Переключение стека производится до сохранения указанных выше регистров, причем в новом стеке в первую очередь сохраняются значения SS и ESP, указывающие на старый стек (см. рис. 3.4.).

При передаче управления в обработчик через шлюз прерывания или шлюз ловушки процессор сбрасывает флаги EFLAGS.TF, EFLAGS.RF и EFLAGS.NT, чтобы отключить трассировку прерываний и некоторые особенности обработки вложенных задач. Кроме того, при использовании шлюза прерывания сбрасывается также и флаг разрешения прерываний EFLAGS.IF.

 

Стек после вызова прерывания или особой ситуации в защищенном режиме

Рис. 3.4. Стек после вызова прерывания или особой ситуации в защищенном режиме

 

Стек процессора Intel286 после вызова прерывания или особой ситуации заполняется аналогично, за исключением того, что сохраняемые значения 16-битные.

Процессоры Intel386 и Intel486 сохраняют код ошибки в стеке как 16-битное значение, а процессоры, начиная с Pentium – сохраняют его как 32-битное значение с нулевыми старшими битами.

 

Режим с поддержкой виртуальных флагов прерываний

В процессорах, начиная с Pentium, возможен специальный подвид защищенного режима с поддержкой виртуальных флагов прерываний (Protected-mode Virtual Interrupts), который включается установкой флага CR4.PVI. В этом режиме процессор обеспечивает автоматическую поддержку отслеживания запросов от внешних маскируемых источников прерываний для задач, выполняемых на уровне привилегий CPL = 3 при EFLAGS.IOPL < 3. Для обеспечения такой поддержки применяются специальные флаги VIF и VIP в регистре EFLAGS. Этот механизм во многом похож на режим EV86, который, в свою очередь, предназначен для работаты с виртуальными прерываниями в режиме V86.

В обычном защищенном режиме (CR4.PVI = 0), когда EFLAGS.IOPL < CPL, все попытки изменения флага EFLAGS.IF командами STI, CLI вызывают генерацию ошибки общей защиты (#GP). Когда же виртуальные прерывания инициализированы (CR4.PVI = 1) команды CLI и STI оказывают влияние на флаг EFLAGS.VIF, а флаг EFLAGS.IF при этом остается неизменным. При поступлении внешнего маскируемого прерывания процессор производит стандартное обращение к обработчику прерываний защищенного режима (процедура этого обращения описана выше). Обработчик прерывания должен произвести анализ флага EFLAGS.VIF и в зависимости от его значения произвести следующие действия:

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

Если при выполнении программы уровня привилегий 3 процессор разрешает прием внешник маскируемых прерываний, уставливая флаг EFLAGS.VIF (например, командой STI), а флаг EFLAGS.VIP = 1, то перед установкой флага EFLAGS.VIF срабатывает вызов отложенного прерывания и генерируется ошибка общей защиты (#GP). Обработчик ошибки общей защиты должен распознавать такие ситуации и соответствующим образом обрабатывать поступившие запросы на прерывание. Рекомендуемая последовательность его действий перед возвратом управления в прерванную программу: очистка флага EFLAGS.VIP и установка флага EFLAGS.VIF в сохраненном в стеке образе регистра EFLAGS, возврат управления в прерванную программу.

В некоторых редких случаях флаги EFLAGS.VIP и EFLAGS.VIF могут оказаться установленными одновременно (например, командой IRETD или на уровне привилегий. отличном от 3). Тогда перед выполнением очередной команды программы уровня привилегий 3 генерируется ошибка общей защиты (#GP).

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

Текущие значения флагов EFLAGS.VIF и EFLAGS.VIP никак не влияют на работу процессора на уровне привилегий. отличном от 3.

Команды POPF/POPFD и PUSHF/PUSHFD выполняются при активированном механизме виртуальных прерываний защищенного режима (CR4.PVI = 1) точно также, как и без него (CR4.PVI = 0).

 

{loadposition article_footer}

 

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