![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Улучшенная поддержка многозадачности и защиты
Регистры общего назначения Сначала рассмотрим регистры общего назначения. Они называются ЕАХ, ЕВХ, ЕСХ и EDX (Аккумулятор, База, Счетчик и Данные). Кроме названий, они больше ничем другим не отличаются друг от друга, поэтому рассмотрим только первый регистр — ЕАХ (рис. 2.4). Процессор 80386 обратно совместим с процессором 80286, регистры которого 16-разрядные. Как же 80386 может выполнять команды, предназначенные для регистров меньшего размера? Регистр ЕАХ может быть разделен на две части — 16-разрядный регистр АХ (который также присутствует в 80286) и верхние 16 битов, которые никак не называются. В свою очередь, регистр АХ может быть разделен (не только в 80386, но и в 80286) на два 8-битных регистра — АН и AL. Если мы заносим в регистр ЕАХ значение 0x12345678, то регистр АХ будет содержать значение 0x5678 (0x56 в АН и 0x78 в AL), а значение 0x1234 будет помещено в верхнюю часть регистра ЕАХ. «Младшие» регистры других регистров общего назначения называются по такому же принципу: ЕВХ содержит ВХ, который, в свою очередь, содержит ВН и BL и т.д. К регистрам общего назначения иногда относят и индексные регистры процессора 80386 — ESI, EDI и ЕВР (или SI, DI и ВР для 16-разрядных действий). Обычно эти регистры используются для адресации памяти: обращения к массивам, индексирования и т.д. Отсюда их имена: индекс источника (Source Index), индекс приемника (Destination Index), указатель базы (Base Pointer). Но хранить в них только адреса совсем необязательно: регистры ESI, EDI и ЕВР могут содержать произвольные данные. Эти регистры программно доступны, то есть их содержание может быть изменено программистом. Другие регистры лучше «руками не трогать». У регистров ESI, EDI и ЕВР существуют только в 16-разрядная и 32-разрядная версии. Сегментные регистры Эту группу регистров можно отнести к регистрам состояния. Регистры из этой группы используются при вычислении реального адреса. Сегментные регистры только 16-разрядные, такие же, как в 80286. Названия этих регистров соответствуют выполняемым функциям: CS (Code Segment, сегмент кода) вместе с EIP (IP) определяют адрес памяти, откуда нужно прочитать следующую инструкцию; аналогично регистр SS (Stack Segment, сегмент стека) в паре с ESP (SS:SP) указывают на вершину стека. Сегментные регистры DS, ES, FS, и GS (Data, Extra, F и G сегменты) используются для адресации данных в памяти. Регистр ESP (SP) — это указатель памяти, который указывает на вершину стека (х86-совместимые процессоры не имеют аппаратного стека). Также программно не может быть изменен регистр EIP (IP, Instruction Pointer) — указатель команд. Этот регистр указывает на инструкцию, которая будет выполнена следующей. Значение этого регистра изменяется непосредственно контроллером процессора согласно инструкциям, полученным из памяти. Регистр EFLAGS – регистр флагов. Он состоит из одноразрядных флагов, отображающих в основном текущее состояние арифметико-логического устройства. Самые важные из флагов: • Признак нуля ZF (Zero Flag) — 1, если результат предыдущей операции равен нулю. Другие регистры процессора относятся к работе в защищенном режиме.
Описание Архитектура микропроцессора Intel 80386DX Процессор i386 полностью совместим со своими предшественниками. Он выполняет программы, предназначенные для них, без необходимости модификации кода и перекомпиляции (или с минимальными модификациями) и делает это более эффективно. Основные изменения: Вся архитектура x86 была расширена до 32 бит — все регистры (за исключением сегментных) стали 32-битными, получив в названии префикс «E» (EAX, EBX, EIP, EFLAGS и т. п.), с сохранением полного набора команд для работы с ними. 32-битной стала и адресация в защищенном режиме (с возможностью создания 16-битных сегментов, для совместимости с 80286). Она позволила впервые со времени появления 8086 забыть о сегментации, а точнее, ограничении размера сегмента 64 килобайтами (ограничение 16-битного адреса), которое давно перестало устраивать программистов. До появления i386 программы и операционные системы использовали несколько головоломных моделей организации памяти (крохотная — tiny, малая — small, большая — large, огромная — huge), различающихся по организации в памяти сегментов кода, стека и данных. 32-битный адрес позволил использовать вместо них одну простую плоскую модель (англ. flat) — 32-битный вариант крохотной модели, в которой все сегменты задачи находятся в одном адресном пространстве. Плоская модель обеспечивает размер такого «общего» сегмента до почти 4 гигабайт, которых по тем временам хватало для любой мыслимой задачи. Плоская модель имеет и недостатки:
Плоская модель вошла в обиход столь широко, что современные программисты зачастую и не подозревают, что программы обращаются в память через сегменты. Страничное преобразование В i386 был введён новый механизм управления памятью — адресное пространство, к которому обращается процессор за данными и кодом, в котором располагаются сегменты (названное линейным адресным пространством) может не соответствовать реальной физической памяти. Физическая память (включая буферы внешних устройств, например видеобуфер) может быть отображена в линейное адресное пространство произвольным образом — каждая страница (размером 4 килобайта) линейного пространства может быть переадресована на любую страницу физической памяти через каталог страниц, располагающийся в оперативной памяти (адрес каталога страниц определяется значением нового регистра управления «CR3»). Как и сегменты, страницы линейного адресного пространства могут быть объявлены неприсутствующими (обращение к таким страницам вызывает обработчик страничного нарушения операционной системы). Неприсутствующие страницы, в первую очередь, используются, для организации виртуальной памяти — обработчик страничного нарушения осуществляет свопинг страниц памяти с внешними запоминающими устройствами. Также, неприсутствующие страницы используются в плоской модели памяти (где размер сегмента обычно имеет размер от 2 до 4 гигабайт, даже если у компьютера не имеется столько физической памяти) для маркировки страниц сегмента, в которые операционная система не выделила памяти. В этом случае, страничное нарушение, обычно, завершает задачу или начинает её отладку. Через страничное преобразование i386 может адресовать до 4 Гбайт физической памяти и до 64 Тбайт виртуальной памяти. Улучшенная поддержка многозадачности и защиты Поддержка многозадачности в процессорах x86 обозначает аппаратную поддержку «прозрачного» переключения с одной обычной программы (задачи) на другую. При переключении процессор сохраняет свое состояние в сегменте состояния одной задачи, после чего восстанавливает состояние другой задачи из её сегмента состояния. В i386 механизмы защиты и многозадачности были значительно расширены и улучшены. В зависимости от характера нарушений, они могут тихо игнорироваться. Серьёзные ошибки на уровне операционной системы (или в реальном режиме) могут привести процессор в режим аварийного останова (например, при нарушении в обработчике двойного нарушения), из которого можно выйти только аппаратным сбросом (reset) процессора. Например, i386 поддерживает ограничение доступа к портам ввода-вывода и флагу запрещения прерываний. Кроме всего многозадачность i386 полностью поддерживает все новые возможности — для 32-битных задач сегмент состояния содержит все 32-битные и необходимые новые регистры (например, регистр CR3 с адресом каталога страниц для этой задачи). Виртуальный режим В процессоре i386 компания Intel учла необходимость лучшей поддержки реального режима, потому что программное обеспечение еще не было готово полностью работать в защищенном режиме. Поэтому в i386 возможно переключение из защищенного режима обратно в реальный. В качестве расширенной поддержки реального режима, i386 позволяет одной или нескольким задачам работать в виртуальном режиме — режиме эмуляции режима реального адреса. Выполнение в виртуальном режиме практически идентично реальному, за несколькими исключениями, обусловленными тем, что виртуальная задача выполняется в защищенном режиме:
вместе с тем, в задаче виртуального режима можно использовать:
Например, начиная с версий 4.01 — 5.0, при использовании менеджера памяти EMM386 (и его аналогов других разработчиков) операционная система MS-DOS работает как задача в виртуальном режиме. EMM386, в этом случае является подобием операционной системы защищенного режима (передавая большинство системных прерываний ядру MS-DOS в виртуальной задаче). Режим виртуального 8086 поддерживается и в последующих 32-битных процессорах x86, вплоть до режима совместимости в x86-64. Аппаратная отладка Как и в предыдущих процессорах (начиная с 8086), отладка в i386 осуществляется вызовом отладочного прерывания, обработчик которого передает управление программе-отладчику. В предыдущих процессорах отладка могла быть вызвана двумя событиями:
в i386 отладку также могут начать:
Пошаговое выполнение Пошаговое выполнение или трассировка (вызов отладочного прерывания после выполнения каждой команды при установленном флаге TF) в i386 осталось таким же как и в предыдущих процессорах, работая во всех новых режимах (32-битной адресации и режиме виртуальной задачи). Точки останова Точка останова (breakpoint) — прерывание выполнения программы по достижении определенного адреса. Точки останова i386 определяются адресом в регистрах отладки. Обработчик отладки вызывается, если адрес следующей команды совпадает с адресом в регистре. В связи с тем, что такие точки останова не требуют записи в память, они могут использоваться для отладки программ в ПЗУ. i386 позволяет одновременно устанавливать до четырёх точек останова.
![]() |