Введение в микропроцессор 80386 --------------------------------------------------------------- Корректура: Олег Мартыненко ? http://alec-soft.narod.ru/ --------------------------------------------------------------- СОДЕРЖАНИЕ ОСНОВНЫЕ ХАРАКТЕРИСТИКИ 3 1.1 32-битная архитектура 3 1.2 Высокопроизводительная технология 4 1.3 Обеспечение работы с виртуальной памятью 5 1.4 Механизмы защиты 6 1.5 Расширенные возможности отладки 6 1.6 Совместимость с микропроцессорами 8086/80286 6 1.7 Заключение 7 ПРИКЛАДНАЯ АРХИТЕКТУРА 7 2.1 Регистры 7 2.1.1 Общие регистры 7 2.1.2 Флаги и счетчик команд 8 2.1.3 Регистры математического сопроцессора 8 2.2 Память и логическая адресация 9 2.2.1 Сегменты 9 2.2.2 Логические адреса 10 2.2.3 Регистры сегментов и дескрипторов 10 2.2.4 Способы адресации 11 2.3 Типы данных и команды 12 2.3.1 Главные типы данных 12 2.3.2 Типы данных математического сопроцессора 14 2.3.3 Другие команды 15 2.3.3.1 Команды операций со стеком 15 2.3.3.2 Команды передачи управления 15 2.3.3.3 Дополнительные команды 16 СИСТЕМНАЯ АРХИТЕКТУРА 16 3.1 Системные регистры 16 3.2 Обеспечение многозадачных операционных систем 17 3.2.1 Сегмент состояния задачи 18 3.2.2 Смена задачи 18 3.3 Адресация 19 3.3.1 Принцип трансляции адреса 19 3.3.2 Сегменты 20 3.3.3 Страницы 22 3.3.4 Виртуальная память 23 3.4 Защита 25 3.4.1 Привилегии 25 3.4.2 Привилегированные команды 26 3.4.3 Защита сегментов 26 3.4.4 Защита страниц 27 3.5 Системные вызовы 27 3.6 Прерывания и особые ситуации 29 3.6.1 Таблица дескрипторов 29 3.6.2 Особые случаи и регистры отладки 30 3.7 Ввод/вывод 31 АРХИТЕКТУРНАЯ СОВМЕСТИМОСТЬ 32 4.1 Совместимость с 80286 32 4.2 Режимы реального и виртуального 8086 32 АППАРАТУРНАЯ РЕАЛИЗАЦИЯ 34 5.1 Внутренняя структура 34 5.2 Внешний интерфейс 35 5.2.1 Синхросигнал 36 5.2.2 Шины данных и адреса 36 5.2.3 Определение циклов шины 36 5.2.4 Управление циклом шины 37 5.2.5 Динамическое управление разрядность шины 37 5.2.6 Статус процессора и управление 38 5.2.7 Управление сопроцессором 38 СВЕДЕНИЯ О ФУНКЦИОНИРОВАНИИ 39 6.1 Введение 39 6.2 Описание сигналов 40 6.2.1 Введение 40 6.2.2 Синхросигнал (CLK2) 40 6.2.3 Шина данных (D0-D31) 40 6.2.4 Шина адреса (BE0#-BE3#, A2-A31) 40 6.2.5 Сигналы определения типа цикла шины 42 6.2.6 Сигналы управления шиной 43 6.2.6.1 Введение 43 6.2.6.2 Строб адреса (ADS#) 43 6.2.6.3 Сигнал подтверждения (READY#) 43 6.2.6.4 Запрос следующего адреса (NA#) 43 6.2.6.5 Указатель 16-разрядной шины (BS16#) 43 6.2.7 Сигналы арбитража шины 44 6.2.7.1 Введение 44 6.2.7.2 Запросы на захват шины (HOLD) 44 6.2.7.3 Подтверждение захвата шины (HLDA) 44 6.2.8 Сигналы интерфейса с сопроцессором 44 6.2.8.1 Введение 44 6.2.8.2 Запрос сопроцессора (PEREQ) 45 6.2.8.3 Сопроцессор занят (BUSY#) 45 6.2.8.4 Ошибка сопроцессора (ERROR#) 45 6.2.9 Сигналы прерывания 46 6.2.9.1 Введение 46 6.2.9.2 Маскируемый запрос прерывания (INTR) 46 6.2.9.3 Немаскируемый запрос прерывания (NMI) 46 6.2.9.4 Сигнал сброса (установки в исходное состояние){RESET} 46 6.2.10 Список сигналов 47 6.3 Механизм обмена по шине 49 6.3.1 Введение 49 6.3.2 Пространства памяти и ввода/вывода 50 6.3.3 Организация памяти и ввода/вывода 50 6.3.4 Изменяемый размер шины данных 51 6.3.5 Связь с 32 и 16 разрядным устройствами памяти 52 6.3.6 Выравнивание операндов 54 6.4 Описание функционирования шины 54 6.4.1 Введение 54 6.4.2 Конвейерная адресация 55 6.4.3 Циклы чтения и записи 56 6.4.3.1 Введение 56 6.4.3.2 Неконвейерная адресация 57 6.4.3.3 Режим неконвейерной адресации при изменении размера шины данных 59 6.4.3.4 Конвейерная адресация 60 6.4.3.5 Инициализация и поддержание режима конвейерной адресации 62 6.4.3.6 Конвейерная адресация при изменении размера шины данных 63 6.4.4 Циклы подтверждения прерывания(INTA) 64 6.4.5 Цикл индикации останова 65 6.4.6 Цикл индикации выключения 65 6.5 Дополнительные сведения о функционировании 65 6.6.1 Вход и выход в/из состояния подтверждения захвата шины 65 6.6.2 Сброс в состоянии подтверждения захвата шины 66 6.6.3 Функционирование шины в течение и после действия сигнала RESET 66 6.7 Идентификаторы типа и модификации 67 ОСНОВНЫЕ ХАРАКТЕРИСТИКИ Микропроцессор 80386 является высокопроизводительным 32-битным процессором, предназначенным для построения наиболее совершенных вычислительных систем сегодняшнего и завтрашнего дня. Станции САПР, графические системы с высокой разрешающей способностью, издательское дело, автоматизация контроля производства - вот те области, где сегодня может быть применен 80386. Применения завтрашнего дня скорее будут ограничены воображением разработчиков систем, чем вычислительной мощностью и возможностями 80386. Микропроцессор 80386 дает разработчику систем большое число новых и эффективных возможностей, включая производительность от 3 до 4 миллион операций в секунду, полную 32-битную архитектуру, 4 гигабитное (2 байт) физическое адресное пространство и внутреннее обеспечение работы со страничной виртуальной памятью. Несмотря на введение в него последних достижений микропроцессорной техники, 80386 сохраняет совместимость по объект ному коду с программным обеспечением, в большом количестве написанным для его предшественников, 8086 и 80286. Особый интерес представляет такое свойство 80386, как виртуальная машина, которое позволяет 80386 переключаться в выполнении программ, управляемых различными операционными системами, например, UNIX и MS-DOS. Это свойство позволяет производителям оригинальных систем непосредственно вводить прикладное программное обеспечение для 16-битных машин в системе на базе 32-битных микропроцессоров. Объединяя в себе производительность супермини ЭВМ и низкую стоимость и функциональную гибкость микропроцессора, 80386 может открыть новые рынки для ,(*`./`.f%aa.`-ke систем. Применения, недопустимые прежде из-за невысокого быстродействия микропроцессоров или не экономности использования супермини ЭВМ, стали теперь практически осуществимы благодаря 80386. Такие новейшие применения, как машинное зрение, распознавание речи, интеллектуальные работы и экспертные системы, бывшие до недавнего времени в основном на стадии эксперимента, теперь могут быть предложены на рынке. Для того, чтобы удовлетворить требованиям будущих применений, мало иметь 32-битные регистры, команды и шины. Эти основные свойства являются лишь отправной точкой для 80386. В нижеследующих разделах в общих чертах будет рассмотрена 32-битная архитектура 80386, обладающая такими новыми дополнительными свойствами, как: - высокопроизводительная технология, - обеспечение работы с виртуальной памятью, - механизмы защиты, - расширенное отладочное обеспечение, - совместимость по объектному коду с 8086/80286 1.1 32-битная архитектура 32-битная архитектура 80386 обеспечивает программные ресурсы, необходимые для поддержки "больших " систем, характеризуемых операциями с большими числами, большими структурами данных, большими программами (или большим числом программ) и т.п. Физическое адресное пространство 80386 состоит из 2 байт или 4 Гбайт; его логическое адресное пространство состоит из 2 байт или 64 терабайт (Тбайт). Восемь 32-битных общих регистров 80386 могут быть взаимозаменяемо использованы как операнды команд и как переменные различных способов адресации. Типы данных включают в себя 8, 16 или 32 битные целые и порядковые, упакованные и неупакованные десятичные, указатели, строки бит, байтов, слов и двойных слов. Микропроцессор 80386 имеет полную систему команд для операций над этими типами данных, а также для управления выполнением программ. Способы адресации 80386 обеспечивают эффективный доступ к элементам стандартных структур данных: массивов, записей, массивов записей и записей, содержащих массивы. 1.2 Высокопроизводительная технология 32-битная архитектура не гарантирует высокой производительности. Реализация потенциала архитектуры требует новейшей микроэлектронной технологии, точного разделения функций и внимания к внешним операциям кристалла, в особенности к взаимодействию процессора с памятью. Включение этих свойств обеспечивает 80386 самую высокую производительность по сравнению с любым другим существующим микропроцессором. Микропроцессор 80386 реализован с помощью технологии фирмы ИНТЕЛ CH MOSIII - технологического процесса, объединяющего в себе возможности высокого быстродействия технологии HMOS с малым потреблением технологии КМОП. Использование геометрии 1,5 мкм и слоев металлизации дает 80386 более 275000 транзисторов на кристалле. Сейчас выпускаются оба варианта 80386, работающих на частоте I2 и I6 МГц без состояний ожидания, причем вариант 80386 на 16 МГц обеспечивает скорость работы 3-4 миллиона операций в секунду. Микропроцессор 80386 разделен внутри на 6 автономно и параллельно работающих блоков с соответствующей синхронизацией. Все внутренние шины, соединяющие эти блоки, имеют разрядность 32 бит. Конвейерная организация функциональных блоков в 80386 допускает временное наложение выполнения различных стадий команды и позволяет одновременно выполнять несколько операций. Кроме конвейерной обработки всех команд, в 80386 выполнение ряда важных ./%` f() осуществляется специальными аппаратными узлами. Блок умножения/деления 80386 может выполнять 32-битное умножение за 9- 41 такт синхронизации, в зависимости от числа значащих цифр; он может разделить 32-битные операнды за 38 тактов (в случае чисел без знаков) или за 43 такта (в случае чисел со знаками). Регистр группового сдвига 80386 может за один такт сдвигать от 1 до 64 бит. Во многих 32-битных применениях, в таких как, например, перепрограммируемые ЭВМ коллективного пользования, требуется преобразование логических адресов в физические и защита памяти с помощью блока управления памятью, БУП. В других применениях, например, в системах управления в реальном времени, это не требуется. Для большинства микропроцессорных систем с 32-битной архитектурой такое разделение функций реализуется путем использования дополнительного корпуса блока управления памятью. В отличие от них буп 80386 входит в состав процессора как один из двух функциональных блоков конвейерной структуры. Операционная система, управляющая работой буп, позволяет, например, системе реального времени обходить страничное преобразование. Введение управления памятью внутрь кристалла дает повышенную производительность в системах, использующих буп и не приводит к ее снижению в тех системах, которые БУП не используют. Такие характеристики стали возможны благодаря снижению задержек распространения, использованию внутреннего полупериодного тактирования и параллельной работы. Еще одно свойство, необходимое в одних применениях и не требующееся в других, это обработка больших чисел, в особенности в арифметических операциях с плавающей запятой с одинарной и двойной точностью. Операнды с плавающей запятой имеют большую длину, а необходимый набор команд для операций над ними является довольно сложным; для реализации стандартного набора операций с плавающей запятой в соответствии со стандартом IEEE754 требуется несколько тысяч транзисторов. В этих целях в 80386 имеется аппаратное обеспечение совместной работы с отдельным математическим сопроцессором. К 80386 может быть подключен математический сопроцессор либо 80287, либо более производительный 80387. Для прикладного программного обеспечения сопроцессоры прозрачны; они лишь расширяют архитектуру 80386 с помощью регистров, типов данных и операций, требуемых стандартом IEEE754. Комбинация 80386 и 80387 может исполнять 1,8 миллион операций. 32-битный процессор, работающий с частотой 16 МГц, имеет большее быстродействие, чем большинство быстродействующих памятей, в следствии чего его производительность может быть ограничена временами доступа к памяти. 80386 был спроектирован так, чтобы с максимальной эффективностью использовать как наиболее быстродействующие статистические ОЗУ, так и недорогие динамические ОЗУ. Для обращения к быстрой памяти, например типа кэш, 80386 вырабатывает двухтактный магистральный цикл для адреса/данных. (Памяти типа кэш 80386 могут иметь любой объем от минимального полезного 4 Кбайт до максимального, охватывающего все физическое адресное пространство). Обращение к более медленной памяти (или к устройствам ввода/вывода) может производиться с использованием конвейерного формирования адреса для увеличения времени установки данных после адреса до 3 тактов при сохранении двухтактных циклов в процессоре. Вследствие внутреннего конвейерного формирования адреса при исполнении команды, 80386, как правило, вычисляет адрес и определяет следующий магистральный цикл во время текущего магистрального цикла. Узел конвейерного формирования адреса передает эту опережающую информацию в подсистему памяти, позволяя, тем самым, одному банку памяти дешифрировать следующий , #(ab` +l-k) цикл, в то время как другой банк реагирует на текущий магистральный цикл. 1.3 Обеспечение работы с виртуальной памятью Виртуальная память позволяет ставить максимальный объем программы или группы программ в зависимость от имеющегося адресного пространства на диске, а не от объема физической памяти (ОЗУ), которая в настоящее время приблизительно в 400 раз дороже. Из вытекающей отсюда гибкости выигрывают изготовители оборудования (которые могут поставлять изделия, отличающиеся лишь в конфигурациях памяти и в уровне производительности), программисты (которые могут предоставлять управление хранением программ операционным системам и избегать написания программ с перекрывающимися структурами) и конечные пользователи (которые могут вводить новые и большие по объему прикладные программы, не опасаясь нехватки памяти). Виртуальная память реализуется операционной системой с соответствующей аппаратурной поддержкой. Микропроцессор 80386 обеспечивает работу с системами виртуальной памяти с сегментной или страничной организацией. Сегментная виртуальная память больше подходит для небольших 16-битных систем, в которых объем сегмента не превышает 64 Кбайт. 80386 обеспечивает работу с сегментами объемом до 4 Гбайт; поэтому в большинстве больших систем на базе 80386 системы виртуальной памяти будут использовать возможность страничного запроса. Для каждой страницы 80386 вырабатывает биты присутствия, занятости или регистрации обращения, которые необходимы для эффективной реализации виртуальной памяти со страничными запросами. В случае обращения к несуществующей странице 80386 автоматически делает переход к операционной системе, если операционная система считала с диска отсутствующую страницу, 80386 выполняет команду повторно. Высокая производительность в работе с виртуальной памятью обеспечивается в 80386 использованием внутренней кэш-памяти для хранения страничной информации. Эта кэш-память (называемая буфером просмотра трансляции, TLB) содержит информацию о распределении адресов 32 страниц, использовавшихся последними. Страницы виртуальной памяти 80386 имеют объем 4 Кбайт, храня одновременно распределение 128 Кбайт памяти, буфер TLB позволяет 80386 преобразовать адреса внутри кристалла, не обращаясь к хранящейся в памяти таблице страниц. В типичных системах 98-99% поиска адресов будет осуществляться через буфер TLB. 1.4 Механизмы защиты Выполняя 3-4 миллиона операций в секунду, 80386 имеет достаточно вычислительной мощности для обеспечения самых сложных систем, состоящих из сотен или тысяч программных модулей. В таких системах вопрос заключается не в том, будут ли ошибки, а в том как их найти и по возможности быстро устранить и насколько их действие может быть ограничено. Такие системы могут быть быстро отлажены и сделаны более надежными при серийном освоении, если процессор будет проверять каждую команду по критерию защиты. При этом степень и тип используемой защиты зависит от конкретного применения. Обычно простые системы реального времени работают достаточно хорошо без использования защиты. Различные требования к защите могут быть наиболее полно удовлетворены с помощью набора выборочно используемых функций защиты, введенных в 80386: - разделение адресных пространств задач; - введение 0-4 уровней привилегий; - использование привилегированных команд (например, HALT); - разделение сегментов по типам (например, кодовый сегмент или a%#,%-b данных); - введение прав доступа к сегментам и страницам (например, право только чтения или только исполнения); - проверка границ сегмента. Для сохранения максимальной производительности все проверки защиты в 80386 выполняются одновременно с выполнением команды. 1.5 Расширенные возможности отладки Четыре внутренних отладочных регистра 80386 помогают значительно сократить время отладки программы. Эти регистры работают независимо от системы защиты и поэтому могут быть использованы в любых системах, включая те, которые будут работать без защиты. Не менее важно и то, что они дают возможность устанавливать контрольные точки данных, помимо контрольных точек команд. 80386 отслеживает все четыре текущих адресных контрольных точки одновременно, не снижая скорости выполнения программы. Контрольные точки команд вызывают переход (обычно в программу- отладчик) при выполнении команды, в большинстве процессоров это осуществляется с помощью специальной команды, которую отладчик записывает после команды, представляющей интерес. Задавая адреса контрольных точек в регистрах, 80386 устраняет программные искажения, неизбежные при внесении команд перехода в защищенную или общую часть программы. Контрольные точки данных, наличие которых является, для микропроцессора свойством уникальным, для целей отладки особенно полезны. По контрольной точке данных можно установить момент чтения адреса или же момент его записи или чтения. Используя контрольные точки данных, программист может, например, быстро установить команду, ответственную за ошибочную запись в структуре данных. Кроме регистров контрольных точек, 80386 имеет и более традиционные отладочные функции в виде контрольных точек команд и пошагового исполнения программы. 1.6 Совместимость с микропроцессорами 8086/80286 Два поколения процессоров семейства 86 предшествуют процессору 80386 - 80286 и 8086, с каждым из них 80386 совместим на уровне двоичных кодов. Благодаря такой совместимости экономятся программные затраты, обеспечивается быстрый выход на рынок и доступ к обширной библиотеке программного обеспечения, написанного для машин на базе микропроцессоров семейства 86. Микропроцессор 80386, конечно, может выполнять программы для 8086, он также может одновременно выполнять программы для 80286 и 80386. Однако наиболее важным свойством совместимости 80386 представляется свойство, называемое VIRTUAL 86 ( виртуальный 86), устанавливающее защищенную структуру для 8086 внутри системы задач 80386. Дополняя свойство виртуального 8086 страничной организацией памяти, 80386 может закрепить за каждой задачей виртуального 8086 1 мегабайтное адресное пространство в любой области физического адресного пространства 80386. Более того, если операционная система 80386 обеспечивает работу с виртуальной памятью, то задачи виртуального 8086 могут переноситься с диска и обратно как любые другие задачи. Таким образом, свойство виртуального 8086 позволяет 80386 одновременно выполнять программы, написанные для трех поколений семейства 86. 1.7 Заключение Микропроцессор 80386 обеспечивает ту базовую производительность, которая необходима для построения высокопроизводительных микропроцессорных систем. архитектура 80386 $.ab b.g-. гибка: не ориентируясь на одно представление о вычислительной машине, она дает разработчикам систем возможность выбирать те варианты, которые наилучшим образом подходят для конкретного применения. Полный набор свойств для управления памятью, включающий сегментацию, страничное разделение и обеспечение работы с виртуальной памятью, реализуется внутри кристалла. До четырех уровней защиты может быть использовано для возведения границ между программными компонентами, однако защита может и не использоваться. Задачи виртуального 8086 могут обогатить 32-битные системы необычайно большим набором стандартных программ, уже разработанных для машин на базе 8086. Производительность и гибкость микропроцессора 80386 могут быть дополены другими устройствами фирмы ИНТЕЛ и доведены до максимума. К этим устройствам относятся контроллеры локальных сетей, усовершенстванные контроллеры прямого доступа к памяти, контроллеры дисков и графические сопроцессоры. ПРИКЛАДНАЯ АРХИТЕКТУРА Микропроцессор 80386 дает разработчику прикладных программ на языке ассемблера или разработчику компилятора широкий набор 32- битных ресурсов. В данной главе эти ресурсы рассматриваются в трех разделах: 1)регистры; 2)память и логическая адресация; 3)типы данных и команды. 2.1 Регистры Во всех вычислительных машинах, включая 80386, имеются регистры, которые программисты могут использовать для срочного промежуточного хранения. К данным, хранящимся в этих регистрах, можно обратиться без магистральных циклов, что сокращает время использования команды и предоставляет больше магистрального времени другим процессором, например, контроллерам прямого доступа к памяти. В 80386 имеется восемь программно доступных общих регистров, еще восемь регистров добавляется при подключении математического сопроцессора 80287 или 80387. Два других регистра 80386, предназначенных не для хранения данных, а для хранения статуса и управления процессором, также важны для программистов. Это регистр флагов и счетчик команд. 2.1.1 Общие регистры Как видно из рис.2-1, Общие регистры 80386 имеют разрядность 32 бит, внутренние шины данных, внешние шины данных и адреса процессора также имеют разрядность 32 бит. В соответствии с любым обще принятым определением 80386 являются 32-битной машиной. Однако в соответствии с практикой других процессоров, предшественниками которых были 16-битные машины, принято, что в 80386 слово означает 16 бит, а 32-бита образуют двойное слово. Как видно из рис.2-1 все общие регистры могут использоваться как 16 или 32-битные регистры, а четыре из них могут быть использованы и как 8-битные регистры. Почти во всех операциях любой общий регистр может быть определен как операнд. Любые два регистра, например, могут быть перемножены. Аналогичным образом, любой регистр при вычислении адреса может быть использован в качестве базового или индексного. Поскольку в любой практической программе требуется стек, общий регистр ESP подразумевается как указатель вершины стека. 2.1.2 Флаги и счетчик команд На рис.2-2 показан формат регистра флагов 80386. Флаги делятся на три класса: статусные, управляющие и системные. Процессор устанавливает статусные флаги после многих команд, чтобы отразить результат операции. Например, если два операнда при сравнении оказываются равными, то процессор устанавливает флаг нулевого результата. Другие команды, преимуществен но команды условного перехода, проверяют флаг статуса и дают различные результаты в зависимости от состояния флага. Программист может устанавливать флаги управления для изменения семантики некоторых команд. Например, команда просмотра строки может иметь направление в сторону больших или меньших адресов в зависимости от состояния флага направления. Системные флаги предназначены для использования операционной системой и в прикладных программах могут игнорироваться. (Системные флаги рассматриваются в главе 3). На практике для исключения возможного изменения системных флагов прикладными программами может быть использована система защиты 80386. 1 - статусные флаги 2 - перенос 3 - четность 4 - вспомогательный перенос 5 - ноль 6 - знак 7 - переполнение Счетчик команд 80386, обозначаемый EIP, имеет разрядность 32 бит. Счетчик команд управляет выборкой команд (включая предварительную выборку) и после выполнения команды процессор автоматически увеличивает его на I. Содержимое счетчика команд меняется по прерываниям, в особых и при выполнении команд меняется по прерываниям, в особых случаях и при выполнении команд передачи управления, например, переходах и вызовах. 2.1.3 Регистры математического сопроцессора Регистры математического сопроцессора, показанные на рис.2-3, повышают производительность систем с большим объемом вычислений. При подключении к 80386 математического сопроцессора 80287 или 80387 эти регистры добавляются к 80386. Хотя математический сопроцессор распознает форматы целых, упакованных десятичных и чисел с плавающей запятой различной длины, внутри него все величины хранятся в формате с плавающей запятой в регистровом стеке 8х80 бит. В математических операциях могут быть как неявные ссылки на верхние элементы стека, так и явные на другие регистры. Статусный регистр содержит указатель вершины стека, флаги, идентифицирующие особые случаи (например, переполнение) и коды состояний, отражающие результат последней команды. Регистр управления содержит биты вариантов и масок, которые программист может устанавливать для выбора алгоритма округления, интерпретации бесконечности, а также задания того, как будут обрабатываться особые случаи - сопроцессором или программно. 1-REGISTER STACK 79 78 64 65 0 +----------------------------------------+ | | SIGNIFICAND | EXSPONENT | +--+---------------+---------------------| | | 2 | 3 | +--+---------------+---------------------| | | | | +--+---------------+---------------------| | | | | +--+---------------+---------------------| | | | | +--+---------------+---------------------| | | | | +----------------------------------------+ 15 0 +---------------------+ 4 -| CONTHOL REGISTER | +---------------------| 5 -| STATUS REGISTER | +---------------------+ Рис.2-3 Регистры математического сопроцессора; 1 - регистровый стек; 2 - порядок; 3 - мантисса; 4 - регистр управления; 5 - регистр статуса. 2.2 Память и логическая адресация Для адресации операндов в 4г байтном физическом адресном пространстве прикладные программы 80386 используют логическую адресацию. Процессор автоматически транслирует эти логические адреса в физические, которые затем выдаются на системную магистраль. Как будет рассмотрено более подробно в главе 3, операционная система 80386 может перестраивать представление прикладной программы о ее логическом адресном пространстве. Например, операционная система 80386 может определить логическое адресное пространство так, как это делается во многих архитектурах , а именно, как простой массив из 2 байт. С другой стороны, она может организовать логическое адресное пространство как набор сегментов переменной длины. Операционная система может определить как большое число сегментов, так и всего несколько, в зависимости от ее представления о логической памяти; 80386 не диктует конкретное использование сегментов и позволяет использовать их так, как того требует данное применение. Читая дальнейшие разделы, следует помнить о том, что степень активного использования сегментов прикладной программой зависит от того, как они организованы операционной системой. 2.2.1 Сегменты Как было отмечено выше, операционная система может определить адресное пространство как один или несколько сегментов. Сегменты являются логическими блоками, хорошо приспособленными под программные структуры, которые по сути своей имеют переменную длину. Например, 1516-байтная процедура полностью содержит сегменте 1516 байт, так же, как и 8 мегабайтный массив (например, дисплейный буфер 1028X1028X8) полностью входит в сегмент такого же размера. Имея для сегментов соответствующие архитектурные решения, 80386 повышает производительность систем, в которых механизм структурирования основан на сегментах. (Страницы, которые рассматриваются в главе 3, имеют фиксированные размеры; они не приспособлены под программные структуры, но, с другой стороны, более подходят для таких функций операционной системы, как, например, пересылки между ОЗУ и диском). Сегмент в системе 80386 может иметь любой размер от 1 байта до 4гбайт. Для каждого сегмента операционная система поддерживает ' $ --k) архитектурой дескриптор, содержащий описание сегмента. Описание сегмента включает в себя 32-битный базовый адрес и длину сегмента, а также информацию о защите, предотвращающей неправильное использование сегмента. Ввиду того, что дескрипторы поддерживаются операционными системами, их рассмотрение откладывается до главы 3. Прикладные программы пользуются дескрипторами лишь косвенно, обращаясь к сегментам с помощью логических адресов. 2.2.2 Логические адреса Ввиду того, что программа может в принципе обращаться к нескольким сегментам, логический адрес 80386 должен идентифицировать сегмент. Поэтому логический адрес 80386 состоит из двух частей, 16-битного селектора сегмента и 32-битного смещения в выбранном сегменте (см. Рис.2-4). После селектора в логическом адресе указывает на дескриптор сегмента. В принципе процессор определяет адрес сегмента с помощью селектора, как указателя для таблицы дескрипторов, поддерживаемой операционной системой. Добавление смещения логического адреса к базовому адресу, полученному по дескриптору сегмента, дает адрес операнда. 1 - ЛОГИЧЕСКИЙ АДРЕС 2 - СЕГМЕНТ +---------------+ 47 3 31 32 4 0 | | | +-------------------------+ | | | | СЕЛЕКТОР | СМЕЩЕНИЕ | | | | +-------------------------+ | | | | | | 5 | | 7 | | +-----------| | | +--------------?| ОПЕРАНД | | ДО 2 | | +-----------| | | ТАБЛИЦА ДЕСКРИПТОРОВ | | | | БАЙТ | +-----------------+ | | | | | | | | | | | | | | +-----?| | | | | 8 | | | | | | +-----------------+ | +-----------+ | +--?| ДЕСКРИПТОР ------ ---- +-----------------+ | | | | +-----------------+ Рис.2-4. 2.2.3 Регистры сегментов и дескрипторов Для повышения эффективности логической адресации в 80386 введено 6 регистров сегментов и дескрипторов (см. Рис.2-5) 1. 1 - СЕГМЕНТ 2 - ДЕСКРИПТОР 15 0 63 0 +---------------+ +------------------------------+ | 3-селектор | |4-базовый адрес, размер и т.д.| 5 КОДОВЫЙ СЕГМЕНТ | | | | +---------------| +------------------------------| | | | | 6 СТЕК +---------------| +------------------------------| | | | | 7 ДАННЫЕ +---------------| +------------------------------| | | | | 7 +---------------| +------------------------------| | | | | 7 +---------------| +------------------------------| | | | | 7 +---------------+ +------------------------------+ Фактически эти регистры используются как программно управляемый кэш, позволяющий исключить из большинства команд селекторы и производить трансляцию большинства логических адресов внутри кристалла без обращений к таблице дескрипторов. Адресные ссылки в большинстве программ производятся в небольших адресных диапазонах (такая "локальность ссылок" делают виртуальную память практичной). Например, если процедура хранится в сегменте, то вероятнее всего большое число команд будет считано из сегмента прежде, чем управление перейдет к другой процедуре в другом сегменте. Локальность ссылок в 80386 обеспечивается программно, путем запоминания во внутренних регистрах последних использовавшихся селекторов и дескрипторов. Внутреннее хранение дескрипторов позволяет транслировать большинство логических адресов без обращений к памяти, занимающих много времени. В любой момент времени можно адресовать до шести сегментов: кодовый сегмент, сегмент стека и четыре сегмента данных. В сегментных регистрах CS, SS, DS, ES, FS и GS хранятся селекторы этих сегментов. Их дескрипторы хранятся в соответствующих регистрах дескрипторов. В случае необходимости программа может сделать адресуемым новый сегмент с помощью загрузки селектора нового сегмента в сегментный регистр. Процессор автоматически поддерживает регистры дескрипторов, загружая требуемый дескриптор каждый раз, когда программа меняет сегментный регистр. (Фактически, регистры дескрипторов могут загружаться только процессором; программе они не доступны). Счетчик команд содержит смещение текущей команды в текущем кодовом сегменте (определяемом регистром CS), а регистр ESP содержит смещение вершины стека в текущем сегменте стека (определяемом регистром SS).Высокая эффективность дешифрации команд достигается для большинства из них благодаря отсутствию явных ссылок на сегментные регистры. Например, в командах перехода и занесение в стек ссылки, соответственно, на регистры CS и SS, делаются неявно. В случае необходимости программист может указать процессору на использование конкретного сегмента в данной команде, что осуществляется путем добавления перед командой однобайтного префикса перемены сегмента. Префикс указывает процессору на регистр сегмента, который должен использоваться в трансляции адреса в следующей за префиксом команде. Сегмент, базовый адрес которого равен 0, а предельный размер - 4 Гбайт, определяет 4 гигабайтное логическое адресное пространство. Поскольку процессор выбирает сегментный регистр автоматически, то команда может ссылаться на операнд в любой ячейке этого 4гбайтного пространства с помощью 32-битного смещения. Если, как показано на рис.2-6, Все регистры дескрипторов будут загружены базовым адресом 0 к предельным размерам 4гбайт, то в этом случае сегменты исчезают. Любой байт в логическом адресном пространстве, независимо от того, командный это байт или байт данных, или же элемент стека, адресуется с помощью простого 32- байтного смещения. Таким образом, сегментные регистры дают 80386 шесть одновременно адресуемых логических адресных пространств размером до 4 Гбайт каждое. В том случае, если эти сегменты совпадают, то программа будет располагать одним 4гбайтным +.#(g%a*(, адресным пространстве, идентичным такому пространству, которое обеспечивается менее гибкими 32-битными архитектурами. 2.2.4 Способы адресации Микропроцессор 80386 обеспечивает регистровую и непосредственную адресацию операндов, содержащихся, соответствен но, в регистрах или командах. Еще более важным является способность 80386 обеспечивать различные способы адресации необходимые для эффективного обращения к таким элементам структур данных в памяти как массивы, записи (структуры), массивы записей и записи, содержащие массивы. При этом программа определяет поле смещения в логическом адресе по одному из способов адресации памяти в 80386. Процессор 80386 вычисляет поле смещения логического адреса по следующей формуле: смещение = база + (индекс X масштаб) + отклонение Для вычисления смещения могут быть использованы любые или все переменные базы, индекса и отклонения. Переменные базы и индекса являются величинами, хранящимися в общих регистрах, а величина отклонения содержится в команде. Для хранения базы или индекса может быть использован любой общий регистр. Величина в индексном регистре может быть отмасштабирована (умножена) коэффициентом 1,2,4 или 8, что дает возможность делать ссылки на элементы массива или записи соответствующей длины. Величина отклонения может иметь разрядность 8 или 32 бит и интерпретируется процессором как величина со знаком в дополнительном коде. Разумные комбинации базы, индекса и отклонения дают следующие способы адресации памяти 80386: - прямая: используется только отклонение; - регистровая косвенная: используется только база; - базовая: используется база + отклонение; - индексная: используется индекс (в масштабе); - индексная с отклонением: используется индекс (в масштабе) + отклонение; - базовая индексная: используется база + индекс (в масштабе); - базовая индексная с отклонением: используется база + индекс (в масштабе) + отклонение; 2.3 Типы данных и команды В данном разделе будут рассмотрены команды, чаще всего используемые программистами. Поскольку большинство команд оперирует с конкретными типами данных (например, с целыми), эти типы и команды рассматриваются совместно. Привилегированные команды, включая те, которые осуществляют ввод/вывод и обработку прерываний будут рассмотрены в главе 3. 2.3.1 Главные типы данных В табл. 2-1 Перечислены типы данных и команды, обеспечиваемые процессором 80386. В этой таблице приведены только наиболее употребимые команды. Варианты команд, такие как (в случае циклического сдвига) циклический сдвиг вправо и циклический сдвиг через перенос, также опущены. Таблица 2-1 ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ +------------------------------------------------------------------------------+ | ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ 3 +--------------+----------------+----------------------------------------------| | ЦЕЛОЕ, | 8, 16, 32 БИТ | ПЕРЕСЫЛКА, ОБМЕН, ПРЕОБРАЗОВАНИЕ, ПРОВЕРКА, | | ПОРЯДКОВОЕ | | СРАВНЕНИЕ, ПЕРЕВОД, СДВИГ, ДВОЙНОЙ, СДВИГ, | | | | ЦИКЛИЧЕСКИЙ СДВИГ, ОТРИЦАНИЕ, ЛОГИЧЕСКОЕ "И",| | | | "ИЛИ", ИСКЛЮЧАЮЩЕЕ "ИЛИ". | | | | | | | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, | | | | УВЕЛИЧЕНИЕ НА 1, УМЕНЬШЕНИЕ НА 1, ПЕРЕВОД | | | | (ПЕРЕСЫЛКА С РАСШИРЕНИЕМ ЗНАКА/НОЛЯ) | +------------------------------------------------------------------------------+ +------------------------------------------------------------------------------+ |НЕУПАКОВАННОЕ | 1 ЦИФРА | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ, | | ДЕСЯТИЧНОЕ | | УМНОЖЕНИЯ, ДЕЛЕНИЯ | +--------------+----------------+----------------------------------------------| | УПАКОВАННОЕ | 2 ЦИФРЫ | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ | | ДЕСЯТИЧНОЕ | | | +--------------+----------------+----------------------------------------------| | СТРОКА | 0-4 ГБАЙТ СЛОВ | ПЕРЕСЫЛКА, ЗАГРУЗКА, ЗАПОМИНАНИЕ, | | БАЙТОВ, СЛОВ,| ДВОЙНЫХ СЛОВ | СРАВНЕНИЕ, ПРОСМОТР, ПОВТОР | | ДВОЙНЫХ СЛОВ | | | +--------------+----------------+----------------------------------------------| | СТРОКА БИТ | 1-4ГБИТ | ПРОВЕРКА, ПРОВЕРКА И УСТАНОВКА, | | | | ПРОВЕРКА И ГАШЕНИЕ, ПРОВЕРКА И ДОПОЛНЕНИЕ, | | | | ПРОСМОТР, ВСТАВЛЕНИЕ, ИЗЪЯТИЕ | +--------------+----------------+----------------------------------------------| | ЛОКАЛЬНЫЙ | 32 БИТ | (СМ. ПОРЯДКОВОЕ) | | УКАЗАТЕЛЬ | | | +--------------+----------------+----------------------------------------------| | ГЛОБАЛЬНЫЙ | 48 БИТ | ЗАГРУЗКА | | УКАЗАТЕЛЬ | | 3 +------------------------------------------------------------------------------+ Примечание: Локальный указатель - 32 битное смещение в сегменте, определенном одной из регистрированных пар сегмента/дескриптора. Глобальный указатель - это полный логический адрес, состоящий из селектора и смещения. На рис.2-7 показаны примеры того, как главные типы данных хранятся в памяти. Многобайтные элементы могут размещаться с любого адреса байта в зависимости от структуры магистрали, для обращения к операндам, размещенным по адресу, не кратным длине операнда в байтах, могут потребоваться дополнительные магистральные циклы. Поэтому для высокой производительности, не зависящей от структуры магистрали, большинство программ ориентируют словные операнды из двойных слов на границах двойных слов и т.п. | 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА-1 +------------------------------------------------------------ ---------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2 7 0 +-------+ | |3 | | БАЙТ ПОРЯДКОВОГО +-------+ +-----------+ 4 | ВЕЛИЧИНА -------- 31 0 +------------------------+ | | |5 | | | ДВОЙНОЕ СЛОВО ЦЕЛОГО +------------------------+ -------- ВЕЛИЧИНА - 4 - L------- ЗНАК 6 7 0 +-------+ | |7 | | НЕУПАКОВАННОЕ L-------- ДЕСЯТИЧНОЕ 7 3 0 +-------+ | | |8 | | | УПАКОВАННОЕ L---+---- ДЕСЯТИЧНОЕ +------- ------------------------+ | | | | | | | 9 | | | | | | | СТРОКА БАЙТОВ +------- ------------------------+ 10 МЛАДШИЙ БАЙТ ------- 31 0 +-----------------------+ | | 11 | | ЛОКАЛЬНЫЙ УКАЗАТЕЛЬ +-----------------------+ 47 31 0 +--------------------------------+ | | | 12 | 13 | 14 | ГЛОБАЛЬНЫЙ УКАЗАТЕЛЬ +--------------------------------+ +--------------------------------+ СЕЛЕКТОР СМЕЩЕНИЕ 2.3.2 Типы данных математического сопроцессора Математический сопроцессор 80287 или 80387 добавляют к типам данных и командам процессора 80386 свои, приведенные в табл.2-2. В большинстве прикладных задач входные величины и получаемые результаты хранятся в виде типов целых, действительных или упакованных десятичных, а для промежуточных величин имеется тип данных промежуточное действительное, расширенный диапазон и точность которого в сложных вычислениях сводят к минимуму ошибки округления, переполнения и исчезновения порядка. В соответствии с такой моделью математический сопроцессор производит большую часть вычислений над промежуточными величинами, хранящимися в его регистрах. При загрузке любого типа данных в регистровый стек, этот тип автоматически меняется на промежуточный действительный. Промежуточная действительная величина в регистре, в свою очередь, может быть переведена в любой другой тип с помощью команды запоминания. На рис.2-8 Показано, как типы данных математического сопроцессора хранятся в памяти. Таблица 2-2 ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ МАТЕМАТИЧЕСКОГО СОПРОЦЕССОРА +------------------------------------------------------------------------+ | ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ | +------------------------------------------------------------------------+ +------------------------------------------------------------------------+ | ЦЕЛОЕ | 16,32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ, | | | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ | +--------------+--------------+------------------------------------------| | УПАКОВАННОЕ | 18 ЦИФР | ЗАГРУЗКА, ЗАПОМИНАНИЕ | | ДЕСЯТИЧНОЕ | | | +------------------------------------------------------------------------+ +------------------------------------------------------------------------+ |ДЕЙСТВИТЕЛЬНОЕ| 32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ | | | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ | +--------------+--------------+------------------------------------------| |ПРОМЕЖУТОЧНОЕ | 80 БИТ | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, | |ДЕЙСТВИТЕЛЬНОЕ| | ИЗВЛЕЧЕНИЕ, КВАДРАТНОГО КОРНЯ, | | | | МАСШТАБИРОВАНИЕ ОСТАТКА, ВЫЧИСЛЕНИЕ | | | | ЧАСТИ ЦЕЛОГО, СМЕНА ЗНАКА, ВЫЧИСЛЕНИЕ | | | | АБСОЛЮТНОЙ ВЕЛИЧИНЫ, ВЫДЕЛЕНИЕ ПОРЯДКА | | | | И МАНТИССЫ, СРАВНЕНИЕ, ОСМОТР, ПРОВЕРКА, | | | | ОБМЕН, АРКТАНГЕНС, 2-1,Y*LOG(X+1), | | | | Y*LOG(X), ЗАГРУЗКА КОНСТАНТЫ (0.0, П, И | | | | Т.Д.) (80387 ДОБАВЛЯЕТ СИНУС, КОСИНУС, | | | | СИНУС И КОСИНУС, НЕУПОРЯДОЧЕННОЕ | | | | СРАВНЕНИЕ). | +------------------------------------------------------------------------+ +-------------------------------------------------------------------+ | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА - 1 | +-------------------------------------------------------------------+ --------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2 79 71 3 0 --------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ УПАКОВОЧНОЕ | | | | | | | | | | | | | | | | | | | ДЕСЯТИЧНОЕ +-----------------------------------------+ 5 | L-------- 4 ВЕЛИЧИНА ---------------- L------- ЗНАК - 3 31 23 0 +----------------------+ 7 | | | | НЕПОЛНОЕ | | | | ДЕЙСТВИТЕЛЬНОЕ +----------------------+ |L---T---L- ВЕЛИЧИНА -- | L-------- СМЕЩЕННЫЙ ПОРЯДОК 6 L------------- ЗНАК 60 51 0 +--------------------------------------------+ 8 | | | | ПОЛНОЕ | | | | ДЕЙСТВИТЕЛЬНОЕ +--------------------------------------------+ | +-------------+ +------- ВЕЛИЧИНА --------- | L------ СМЕЩЕННЫЙ ПОРЯДОК L--------------- ЗНАК 79 62 0 --T-----------T--T---------------------------+ ПРОМЕЖУТОЧНОЕ | | | | | ДЕЙСТВИЕ +--------------------------------------------+ 9 | L-----T------ L------ 4 ВЕЛИЧИНА --------- | L------------------ СМЕЩЕННЫЙ ПОРЯДОК L------- ЗНАК - 3 Рис.2-8.Примеры хранения типов данных математического сопроцессора 2.3.3 Другие команды Не все команды процессора 80386 связаны с типами данных. Такие команды рассматриваются в нижеследующих параграфах. 2.3.3.1Команды операций со стеком Стек процессора 80386 является стеком двойных слов, основание и вершина которого определяются регистрами, соответственно, SS и ESP. Команда PUSH заносит двойное слово в стек, а команда POP извлекает с вершины стека двойное слово и хранит его в регистре памяти или в памяти. По команде PUSH ALL в стек заносятся все общие регистры, а по команде POP ALL производится обратная операция. Команда INTER (входа в процедуру) и LEAVE (выхода из процедуры) предназначены для языков высокого уровня с блочной структурой. По команде ENTER создается кадр и образ стека, которые компиляторы используют для связки вызовов процедур. По команде LEAVE кадр стека и образ удаляются из стека для подготовки возврата к процедуре, сделавшей вызов. 2.3.3.2Команды передачи управления Команда JUMP (переход) передает управление другой команде путем замены содержимого счетчика команд. Новая команда может быть в том же кодовом сегменте (со смещение до 2 байт) или совсем в другом. Операндом внутрисегментного перехода является локальный указатель, т.е. смещение новой команды в текущем кодовом сегменте; переход таким образом, может быть сделан к любой ячейке в максимально возможном сегменте. Операндом межсегментного перехода является глобальный указатель, что позволяет передавать управление в любую точку сегмента. (Поле селектора в глобальном указателе замещает величину в регистре CS, а поле смещение - величину в EIP). В системе команд также имеется полный набор команд условных переходов, ветвление которых основано на величине флага статуса; эти команды могут передавать управление ячейкам, которые также смещены на максимум 2 байта. Вызов процедур и функций (подпрограмм) производится по командам CALL (вызов), а возврат к вызывавшей подпрограмме осуществляется с помощью команды RETURN (возврат). Так же, как команды перехода, вызовы внутри сегмента имеют своими операндами локальный указатель, задающий новую величину в счетчике команд, а вызовы между сегментами используют в качестве операндов глобальный указатель, который кроме CS изменяет и величину EIP. По командам вызова адрес следующей команды заносится в стек, после чего производится загрузка счетчика команд (и регистра CS, если переход делается в другой сегмент). По команде возврата сохраненные величины извлекаются из стека в EIP и, если требуется, в CS. Вызовы могут иметь бесконечную вложенность и рекурсивность, ограниченные лишь размером стека. Для управления циклами, помимо условных переходов, 80386 обеспечивает выполнение команд LOOP (безусловно и условного цикла). Команды цикла в качестве счетчика циклов используют регистр ECX; в каждом цикле ECX уменьшается на 1 и выполнение *., -$k заканчивается, когда величина в ECX становится равной нулю. Команды условных циклов заканчиваются в том случае, если флаг содержит заданную величину. В то время как команды цикла предназначены для проверок "в конце цикла", команда "переход", если ECX=0 реализует проверку в начале цикла и позволяет выполнять цикл 0 раз. 2.3.3.3Дополнительные команды Команда BOUND (проверка границ) 80386 может быть использована для проверки того, что индекс массива находится в его границах. Процессор 80386 имеет также команды установки и гашения флагов, загрузки и запоминания байта статуса регистра флагов. Математический сопроцессор 80287 или 80387 добавляет команды, необходимые операционной системе для его инициализации, обработки особых случаев, а также для запоминания и восстановления статуса сопроцессора. Наконец, естественно, процессоре 80386 имеет команду "нет операции". СИСТЕМНАЯ АРХИТЕКТУРА Назначение системной архитектуры заключается в обеспечении операционных систем, однако операционные системы весьма различны по своим требованиям. Для решения этой проблемы, процессор 80386 обеспечивает набор ресурсов, которые разработчики операционных систем могут использовать по своему усмотрению. В результате системная архитектура 80386 может быть сконфигурирована так, чтобы удовлетворить всем требованиям разрабатываемой операционной системы. 3.1Системные регистры Кроме регистров, рассмотренных в предыдущей главе, операционная система иногда использует регистры 80386, показанные на рис.3-1. (Далее в этой главе эти регистры еще будут рассматриваться; здесь они показаны для справки). В основном этими регистрами пользуется сам 80386; операционная система лишь инициализирует системные регистры и игнорирует их при нормальной работе. Однако, операционная система может воспользоваться системным регистром при обработке особого случая. Например, при страничной ошибке процессор загружает ошибочный адрес в регистр CR2; обработчик страничных ошибок операционной системы использует этот адрес для поиска соответствующего элемента страничной таблицы. Системные регистры обычно недопустимы прикладным программам, поскольку оперировать с ними могут только привилегированные команды. (Особые случаи, страничные ошибки и привилегированные команды рассматриваются далее в этой главе). 47 15 0 +-----------------------------+ | БАЗОВЫЙ АДРЕС | ПР. РАЗМЕР | ГЛОБАЛЬНАЯ ТАБЛИЦА +----------------+------------+ ДЕСКРИПТОРОВ | | | ТАБЛИЦА ДЕСКРИПТОРОВ +-----------+----------------+------------+ ПРЕРЫВАНИЙ | СЕЛЕКТОР | | | ЛОКАЛЬНАЯ ТАБЛИЦА L-----------+----------------+------------- ДЕСКРИПТОРОВ +-----------------------------------------+ СИСТЕМНЫЕ АДРЕСНЫЕ РЕГИСТРЫ 31 0 +-------------------------+ | | ВСПОМОГАТЕЛЬНЫЙ +-------------------------| | | РЕЗЕРВНЫЙ +-------------------------| | | ЛИНЕЙНЫЙ АДРЕС СТР. ОШИБКИ +-------------------------| | | БАЗОВЫЙ АДРЕС СПРАВОЧНИКА | | СТРАНИЦ +-------------------------+ СИСТЕМНЫЕ УПРАВЛЯЮЩИЕ РЕГИСТРЫ 3.2Обеспечение многозадачных операционных систем Многие свойства системной архитектуры 80386 непосредственно обеспечивают многозадачные операционные системы, хотя, конечно, 80386 может быть использован и в однозадачных системах с повышенными требованиями. Многозадачная работа представляет собой способ управления работой вычислительной системой в тех случаях, когда работа системы состоит из нескольких видов деятельности; тремя видами деятельности могут быть например, редактирование одного файла, компиляция другого и передача третьего файла в другую машину. В многозадачной системе каждый вид деятельности, который может осуществляться одновременно с другими, называется задачей. (В данном материале термин "задача " эквивалентен термину "процесс"). Каждая задача выполняет программу, состоящую из команд и исходных данных. Одна и та же программа может выполнятся несколькими задачами; например, в многозадачной системе с разделением времени несколько задач (по числу пользователей) могут использоваться одним и тем же компилятором или редактором. Программы и задачи соотносятся друг с другом подобно партитуре музыкального произведения и его исполнению: программа - это текст, описывающий алгоритм, а задача - это однократное исполнение этого алгоритма. Программы, выполняемые задачами. Составлены так, как если бы они выполнялись на отдельных процессорах с общей памятью, т.е. Используя паузы, необходимые для связи или синхронизации с другими задачами, теоретически каждая задача выполняется непрерывно параллельно с другими задачами. На самом деле , однако, задачи выполняются поочередно одним процессором. Многозадачная операционная система моделирует несколько процессоров, предоставляя каждой задаче "виртуальный процессор". В каждый момент времени операционная система передает реальный процессор одному из виртуальных процессоров, выполняющему свою задачу. Для поддерживания впечатления, что каждая задача имеет свой процессор, операционная система часто переключает реальный процессор на различные виртуальные процессоры. В системной архитектуре 80386 для операции смены задачи предусмотрены сегменты состояния задачи и команды, выполняющие эту операцию. 3.2.1 Сегмент состояния задачи Сегмент состояния задачи (TSS) является одной из нескольких структур данных, определяемых системной архитектурой 80386. Фактически, эти структуры данных являются "типами данных" для операционных систем. Сегмент TSS(см.Рис.3-2) Соответствует тому, что в некоторых операционных системах называется блоком управления задачей; в этом сегменте хранится состояние виртуального процессора задачи. Каждая задача 80386 представлена своим TSS, который делится на две части. Младшая часть TSS определена системной архитектурой 80386 и содержит значения регистров процессора. Старшая часть TSS может быть определена операционной a(ab%,.) для хранения данных, связанных с задачей, например, приоритета выполнения, дескрипторов файлов и т.д. Для создания своей задачи операционная система формирует TSS и инициализирует его величинами, необходимыми задаче для начала ее выполнения. В результате 80386 поддерживает младшую часть TSS, а за его старшую часть несет ответственность операционная система. +--------------------------------------+ | (ОПРЕДЕЛЕННАЯ ОПЕРАЦИОННАЯ СИСТЕМА) | . . +--------------------------------------| | АДРЕС ЛОКАЛЬНОЙ ТАБЛИЦЫ ДЕСКРИПТОРОВ | +--------------------------------------| | СПРАВОЧНЫЙ АДРЕС СТРАНИЧНОЙ ТАБЛИЦЫ | +--------------------------------------| | ОБЩИЕ РЕГИСТРЫ | . . +--------------------------------------| | РЕГИСТР ФЛАГОВ | +--------------------------------------| +--------------------------------------| | СЕГМЕНТНЫЕ РЕГИСТРЫ | . . +--------------------------------------| | ПРИВИЛЕГИРОВАННЫЕ | . . +--------------------------------------+ 3.2.2 Смена задачи Операционная система разрешает выполнение ??????? в соответствии с планом. Этот план устанавливает время выполнения задач. Поскольку методы планирования ???????? различные, 80386 предоставляет это операционной системе. ???? Когда операционная система решает начать выполнение ????? задачи, она направляет процессор на выполнение еще одного ?????, иногда называемого сменой контекста. Процессор 80386 хранит селектор и дескриптор ????? текущей задачи в своем регистре задачи ?????? операционная система выдает команду перехода ???????? является селектор сегмента TSS новой задачи ?????? эту команду, занося вначале свои регистры в текущий TSS, а затем загружая TR селектором (и связанным с ним дескриптором), указанным в команде. Получив адрес нового TSS, процессор загружает свои регистры величинами из нового TSS. После чего выполнение программы продолжается с команды, на которую указывает счетчик команд новой задачи. Для возобновления старой задачи операционная система должна выдать команду перехода и TSS старой задачи, после этого выполнение старой задачи продолжается с командой, следующей после команды перехода TSS, прекратившей ее выполнение. Такая смена задачи занимает 17 мкс (при рабочей частоте 16 Мгц и отсутствии состояний ожидания). 3.3Адресация Физическое адресное пространство большинства вычислительных машин организовано просто как массив байтов. С появления блоков управления памятью (БУП), архитектура машин стала различать физическое адресное пространство, реализуемое, аппаратурой памяти и логическое адресное пространство, видимое программистом. Блок управления памятью транслирует логические адреса программ в физические адреса, выдаваемые на системную магистраль. В большинстве архитектур логическое адресное пространство задачи представляется как набор следующих вариантов: Логическое адресное пространство состоит из массива байтов, не имеющего определенной БАЙТЫ структуры (такое адресное пространство иногда называется "плоским" или "линейным"). Трансляция адреса в этом случае не требуется, поскольку логический адрес точно эквивалентен физическому. Логическое адресное пространство состоит из нескольких или большого числа сегментов, СЕГМЕНТ каждый из которых содержит переменное число байтов. Логический адрес разделен на две части, номера сегмента и смещения внутри сегмента. Буп производит трансляцию логического адреса в физический. Логическое адресное пространство состоит из большого числа страниц, каждая из которых СТРАНИЦЫ включает в себя фиксированное число байтов. Логический адрес состоит из номера страницы и смещения внутри страницы. Буп производит трансляцию логического адреса в физический. СТРАНИЧНЫЕ Логическое адресное пространство состоит из сегментов Сегменты в свою очередь, состоят из страниц. СЕГМЕНТЫ Логический адрес состоит из номера сегмента и смещения внутри сегмента. Буп производит трансляцию логического адреса в номер страницы и смещение в ней, которые затем транслируются в физический адрес. Каждый из этих вариантов хорошо подходит для одних систем и мало пригоден для других. Например, линейное пространство вполне подходит для систем с простыми ветвлениями, в то время как для систем, которые выполняют индивидуальное управление и защиту отдельных программных структур, больше подходит вариант с сегментацией памяти. В 80386 реализован вариант, представляющий память как набор сегментов, которые по желанию могут быть разделены на страницы. На практике архитектура 80386 обеспечивает операционные системы любым из четырех вариантов представления памяти. 3.3.1 Принцип трансляции адреса Принцип трансляции логического адреса в физический в процессоре 80386 иллюстрируется на рис.3-3. Последовательность операций, показанная на рис.3-3, является центральной как для адресации, так и для защиты. Здесь она рассматривается в схематичной форме с целью дать ясное общее представление о ней прежде, чем перейти к рассмотрению таких свойств, как виртуальная память и защита. В последующих разделах будут подробно рассмотрены различные этапы трансляции адреса и будет показано, как они могут быть приспособлены под требования конкретной системы. Как показано в предыдущей главе, способы адресации памяти 80386 дают 32-битное смещение искомого операнда. Совместно с селектором сегмента это смещение образует составной логический адрес: селектор этого адреса идентифицирует искомый сегмент, а смещение указывает на операнд в сегменте. В большинстве команд селектор задается неявно как содержимое сегментного регистра. +--------------+ | ТАБЛИЦЫ | | ДЕСКРИПТОРОВ | +--------------+ ЛОГИЧЕСКИЙ АДРЕС ---------+-+ ЛИНЕЙНЫЙ АДРЕС +-----------------+ | | +--------+ +--+ |СЕЛЕКТОР|СМЕЩЕНИЕ+->|ТРАНСЛЯЦИЯ+--->| +--+ +----T-+ L--------+--------- | СЕГМЕНТА | L--------- L--- | | 47 31 0 L----------- 31 0 ЗАПРЕТ | | СТРАНИЦ | | +-------------------------------------------+ | | +--------------+ | +-----------+ | 31 0 | | ТАБЛИЦЫ | |--------------------+ | | СТРАНИЦ | +--+ ФИЗИЧЕСКИЙ АДРЕС| | +-----------+ |-+------------------+ | |+--------------------------+ 31 | 0 | 31 0 | +----------------+ +---------------------++------------------+| | ЛИНЕЙНЫЙ АДРЕС +-->| ТРАНСЛЯЦИЯ СТРАНИЦЫ +-->|ФИЗИЧЕСКИЙ АДРЕС+-- +----------------+ +---------------------++------------------+ Селектор представляет собой индекс в таблице дескрипторов сегментов, т.е. это поле содержит номер сегмента. Каждый элемент таблицы дескрипторов сегментов содержит базовый адрес сегмента. Процессор добавляет к нему смещение и получает 32-битный линейный адрес. Если страницы не разрешены, процессор считает, что линейный адрес является физическим, и выдает его на адресные выводы. Если страницы разрешены, то 80386 транслирует линейный адрес в физический. Это делается с помощью страничных таблиц. Страничная таблица по своей организации аналогична таблице дескрипторов, за исключением того, что каждый элемент страничной таблицы содержит физический базовый адрес страницы 4кбайт. Поскольку способы адресации 80386 охватывают как традиционные элементы структурного деления адресного пространства (сегменты, и дополнительно, страницы) и поскольку сегменты могут быть очень большими (до 4 Гбайт), то эти способы адресации оказываются очень гибкими. Таким образом, операционная система может дать задаче одно линейное адресное пространство, линейное адресное пространство из страниц, адресное пространство из сегментов или сегментированное адресное пространство со страничным делением. По всей своей гибкости многоступенчатая трансляция адреса в 80386 выполняется достаточно быстро. Типичное время вычисления смещения и трансляции логического адреса в физический составляет 1,5 такта. Более того, время трансляции адреса незаметно для программы, поскольку внутренний БУП 80386 транслирует адрес параллельно с другими операциями процессора (кроме случаев, когда команды перехода или вызова временно прерывают совмещенное выполнение операций). 3.3.2 Сегменты Сегмент является единицей логического пространства, представляемого процессором задаче, т.е. логическое адресное пространство задачи состоит из одного или нескольких сегментов. Операционные системы существенно отличаются друг от друга по способу определения логического адресного пространства задачи. Например, система реального времени с ветвлениями может определить логическое адресное пространство как единое целое, совместно используемое всеми задачами и самой операционной системой, другими словами один сегмент коллективно используется всей системой. В другом крайнем случае система может распределить каждую структуру данных и процедуру по своим сегментам, в следствии чего логическое адресное пространство задачи предстанет в виде десятков или сотен адресных пространств, каждое из которых будет соответствовать своей структуре данных или процедуре. Между этими крайними случаями оказывается универсальная система с разделением времени, в которой задачи выполняются в отдельных логических адресных пространствах, и в которых программы задач отделены от их данных, а прикладные программы и данные отделены от программы и данных операционной системы. Свойство сегментации в процессоре 80386 достаточно гибкое, и может обеспечить каждый из этих примеров, как и любые другие. Как уже было показано в главе 2, команда 80386 ссылается на операнд в памяти с помощью составного логического адреса, a.ab.oi%#. из селектора сегмента и смещения внутри сегмента. В принципе 80386 транслирует логический адрес в линейный с помощью селектора, указывающего на дескриптор сегмента в таблице дескрипторов. Дескриптор содержит базовый адрес сегмента в линейном адресном пространстве, добавление смещения к базовому адресу дает линейный адрес операнда. На практике трансляция логического адреса в линейный оптимизирована с помощью неявного указания на селекторы и хранения дескрипторов в регистрах. Поэтому обращение к таблице дескрипторов производится только для тех команд, которые загружают новые селекторы в сегментные регистры (например, вызов процедуры из другого сегмента приводит к замене селектора в регистре CS). Хотя на практике это бывает редко, тем не менее удобнее представлять трансляцию процессором логического адреса как обращение к дескрипторам в таблицах дескрипторов сегментов, поскольку отсюда следует, что именно дескрипторы в таблицах дескрипторов сегментов задачи определяют логическое адресное пространство задачи. Без дескриптора задача не в состоянии сгенерировать линейные адреса. Таблица дескрипторов сегментов представляет собой массив дескрипторов, на рис.3-4 дан логический формат дескриптора. Поле базового адреса уже рассматривалось выше. Поле предельного размера определяет длину сегмента, 80386 использует поле предельного размера для проверки правильности величины смещения в логическом адресе, а именно, что оно попадает внутрь сегмента. Атрибуты сегмента, в основном, относятся к защите и будут рассмотрены далее в этой главе. АТРИБУТЫ ПРИЗНАК ПОСЛЕДНЕГО ОБРАЩЕНИЯ ---------------------+ ПРАВА -----------------------------------------+ | ТИП ----------------------------------------+ | | ПРИВИЛЕГИЯ ------------------------------+ | | | ПРИЗНАК ПРИСУТСТВИЯ ------------------+ | | | | | | | | | +--------------+ | | | | | | +------------------------------| | ПРЕДЕЛЬНЫЙ РАЗМЕР | +------------------------------| | БАЗОВЫЙ АДРЕС | +------------------------------+ Каждая задача может иметь системное и индивидуальное логическое адресное пространство. Эти пространства описываются, соответственно глобальной таблицей дескрипторов (GDT) и локальной таблицей дескрипторов (LTD). (В селекторе имеется бит, связывающий его с той или иной таблицей). Эти таблицы дескрипторов могут содержать максимум 8192 дескриптора и совместно они определяют логическое адресное пространство задачи. Это означает, что для того, чтобы новый сегмент мог адресоваться задачей, операционная система должна внести новый дескриптор этого сегмента либо в GDT, либо в LDT задачи. В системах с защитой GDT и LDT могут быть сделаны привилегированными структурами так, что изменения в них сможет производить только операционная система. Операционная система из ее названия, глобальная таблица дескрипторов доступна всем задачам, обычно операционные системы заносят дескрипторы системных сегментов в GDT. Кодовый сегмент (или сегменты) операционной системы является хорошим примером сегмента, который должен быть доступным всем задачам, и дескриптор которого обычно находится в GDT. В противоположность этому каждая ' $ g может иметь свою локальную таблицу дескрипторов. Процессор поддерживает адрес LDT текущей задачи в своем регистре локальной таблицы дескрипторов (LDTR), однако он перезагружает этот регистр (так же, как он перезагружает свои общие и сегментный регистры) новым значением TSS при смене задач. Задачи могут делить одни сегменты в следующих случаях (см. рис.3-5): 1. Сегмент, дескриптор которого находится в GDT, является общим для всех задач. 2. Задачи, имеющие общую LDT, имеют и общие сегменты, описываемые этой LDT, такой подход допустим в случае тесно взаимодействующих задач. 3. Дескрипторы в различных LDT могут указывать на один и тот же сегмент, такие дескрипторы называются псевдоименами. Использование псевдоимени позволяет задачам иметь общим только один сегмент, а не все сегменты, определенные таблицей дескрипторов. 3.3.3 Страницы Независимо от того, содержит ли логическое адресное пространство задачи один или много сегментов, операционная система может разделить линейное адресное пространство на страницы. С точки зрения операционной системы страницы являются удобными элементами для распределения и перераспределения памяти, поскольку они все имеют одинаковый размер. Страницы также являются средством защиты частей больших сегментов и, что особенно важно, обеспечивают удобный способ организации виртуальной памяти. Указанные применения страничной организации памяти обсуждаются ниже. Страница в 80386 имеет длину 4к байт. Этот размер находится в согласии с промышленной тенденцией к увеличению длины страниц и ведет к увеличению производительности по двум направлениям. Во-первых, он обеспечивает хорошее отношение показаний страниц в кэш при данном объеме кэш-памяти, которая может быть в настоящее время реально размещена на кристалле, исходя из достигнутого уровня технологии. (Кэш-память 80386, расположенная на кристалле, описывается кратко). Во-вторых, 4к байтов являются эффективным размером блока для дисковых передач. Большинство операционных систем, работающих на машинах с меньшей длиной страницы, должны группировать страницы в "кластеры", чтобы сократить количество дисковых передач. Операционная система 80386 включает страничный механизм, устанавливая бит PG в управляющем регистре 0 при помощи привилегированной команды. Когда страничный механизм включен, процессор транслирует линейный адрес в физический адрес, используя страничные таблицы. Страничные таблицы являются частью таблиц дескрипторов сегментов. Так же как таблицы дескрипторов сегментов задачи определяют ее логическое адресное пространство, страничные таблицы задачи определяют ее линейное адресное пространство. Аналогично супермини-ЭВМ и большим ЭВМ страничные таблицы 80386 организованы по принципу двухуровневой иерархии, как показано на рис.3-6. Каждая задача может иметь справочник системных таблиц. Системный регистр CR3 процессора 80386 (база справочника системных таблиц) указывает на справочник страничных таблиц работающей задачи. Процессор обновляет регистр CR3 при каждом переключении задачи, получая новый адрес задачи из TSS новой задачи. Справочник страничных таблиц имеет длину, равную одной странице и содержит элементы ab` -(g-.) таблицы описывают 1024 страницы. Таким образом, каждая страничная таблица описывает 4м байта, а оглавление может описать до 4г байт - максимальное адресное пространство. На рис.3-6 в функциональных обозначениях показано как 80386 транслирует линейный адрес в физический адрес, если страничная адресация включена. Процессор использует старшие 10 бит линейного адреса как индекс в оглавлении. Выбранный элемент оглавления содержит адрес страничной таблицы. Процессор добавляет средние 10 бит линейного адреса к адресу страничной таблицы, чтобы найти элемент страничной таблицы, который описывает необходимую страницу. Добавляя младшие 12 бит линейного адреса к адресу начала страницы, процессор получает 32-битный физический адрес. Для того, чтобы сократить накладные расходы, возникшие от поиска в страничных таблицах, 80386 помещает справочную информацию о 32-х последних страницах, использовавшихся им, в специальную быструю память (кэш), находящуюся внутри самого микропроцессора. Эта память называется перекодированным буфером просмотра исключений (TLB). Только в том случае, если процессор не находит справочной информации для страницы в TLB, он обращается к справочникам и страничным таблицам, находящимся в памяти. Как правило, 98-99% адресных ссылок попадают в TLB, не требуя обращений к основной памяти для трансляции. Когда необходимой информации в TLB не оказывается, процессор заменяет наиболее старый элемент TLB новым элементом. Принцип локальности ссылок предполагает, что новый элемент скорее всего будет использоваться в будущем. Поскольку включение страничного механизма не увеличивает времени трансляции адреса, оно мало влияет на время исполнения команды только при непопаданиях в TLB. На рис.3-7 показаны основные поля элемента страничной таблицы (PTE). Элементы справочника страничных таблиц идентичны показанному за тем исключением, что поле адреса рассматривается как физический адрес страничной таблицы, а не адрес страницы. АТРИБУТЫ ПРИСУТСТВИЕ -------------------------------------+ ПРАВА ---------------------------------------+ | ПРИВИЛЕГИИ ------------------------------+ | | БЫЛО ОБРАЩЕНИЕ ----------------------+ | | | БЫЛА ЗАПИСЬ ---------------------+ | | | | ОПРЕДЕЛЯЕТСЯ ПОЛЬЗОВАТЕЛЕМ --+ | | | | | | | | | | | +-----------------------------------------------------------+ | АДРЕС СТРАНИЦЫ | | | | | | | +-----------------------------------------------------------+ Задачи могут совместно пользоваться отдельными страницами или целыми страничными таблицами. Элементы 1 различных страничных таблиц, указывающие на одну и ту же страницу , являются синонимами один для другого, также как дескрипторы с теми же самыми адресами являются синонимами друг для друга. В двух уровневой структуре страничных таблиц процессора 80786 легче разделять страницы между задачами путем разделения целой страничной таблицы. Поскольку адрес разделяемой страницы в этом случае находится в одной страничной таблице, операционной системы необходимо изменить только один элемент страничной таблицы, когда она перемещает эту страницу. 3.3.4 Виртуальная память Виртуальная память позволяет очень большим программам или #`c// , работать в значительно меньшем объеме физической памяти без использования техники оверлеев. Системы с виртуальной могут основываться или на сегментах, или на страницах. В обоих случаях основная идея виртуальной памяти состоит в том, чтобы использовать значительно более дешевую дисковую память вместо полупроводниковой памяти. Операционная система в случае с виртуальной памятью запоминает все сегменты или страницы в большой области дисковой памяти, называемой часто "областью обмена". Значительно меньшая физическая (реальная) память содержит только наиболее часто используемые сегменты или страницы. До тех пор, пока сегменты или страницы запомненные на диске, используются нечасто, система с виртуальной памятью будет вести себя также хорошо, как и система со значительно большей оперативной памятью, но за значительно меньшую цену. Ключевые архитектурные свойства, необходимые для эффективного использования виртуальной памяти, перечисляются ниже: з бит для каждого сегмента или страницы, который говорит процессору (или устройству управления памятью), имеется ли данный сегмент или страница в памяти, или необходимо загрузить его (ее) с диска; з механизм ловушки или особого прерывания, при помощи которого процессор может указать операционной системе о необходимости загрузки в память отсутствующего сегмента или страницы; з перезапускаемые команды, которые позволяют процессору выбирать заново команду после того, как операционная система загрузила только что не присутствующую страницу в память и пометила ее присутствующей. Процессор 80786 имеет все эти необходимые свойства, а также другие, которые улучшают эффективность механизма управления виртуальной памятью. Как дескрипторы, так и элементы страничных таблиц имеют бит присутствия и поэтому могут быть использованы как основа для построения виртуальной памятью. Обмен сегментами между памятью и диском являются разумным подходом, когда сегменты относительно малы, как это было в 16-битных архитектурах. Когда сегменты могут быть очень велики, как это возможно в 80786, обмен страницами обычно является более эффективным приемом благодаря фиксированному размеру страниц. В страничных системах операционная система распределяет и освобождает память элементами размером со страницу, называемыми страничными кадрами; страница , загружаемая с диска, будет подходить любому имеющемуся кадру. Поскольку большинство из 32-битных систем с виртуальной памятью основывается на механизме страниц, оставшаяся часть этого раздела описывает страничный виртуальный механизм 80786. В общем случае операционная система со страничной виртуальной памятью пересылает отсутствующие страницы с диска в страничные кадры по запросам, т.е. когда она будет оповещена процессором, что команда обращается к отсутствующей странице. Когда количество свободных кадров становится маленьким, операционная система также передает страницы из страничных кадров на диск, пытаясь изъять те страницы, которые вряд ли будут использованы в ближайшем будущем. Путем такого "прозрачного" обмена страницами между страничными кадрами и диском операционная система создает у прикладного программного обеспечения иллюзию, что физическая память имеет размер очень большой области обмена на диске. Ниже подробно описывается этот механизм. Когда в процессе трансляции логического адреса процессор получает линейный адрес, который ссылается на элемент страничной таблицы, чей бит присутствия сброшен, в процессоре возникает особая ситуация, называемая, условно, страничной ошибкой. Особые a(bc f(( рассматриваются ниже в этом разделе, но основным следствием этой ошибки является вызов процессором процедуры операционной системы, называемой обработчиком страничной ошибки. При входе в обработчик страничной ошибки Управляющий регистр 2 содержит линейный адрес, связанный с отсутствующей страницей. По этому адресу обработчик страничной ошибки может найти относящийся к нему элемент страничной таблицы путем трансляции линейного адреса, как это делает процессор. Отметим, что все остальные биты, за исключением бита присутствия в элементе страничной таблицы, определяются пользователем; они представляют для операционной системы удобное место для запоминания дискового адреса отсутствующей страницы. Определив дисковый адрес отсутствующей страницы, обработчик страничной ошибки может найти свободный страничный кадр и передать страницу с диска в этот кадр. Затем обработчик страничной ошибки изменяет адресное поле в элементе страничной таблицы и бит присутствия, после чего возвращает управление программе, прерванной страничной ошибкой. После этого процессор автоматически заново выбирает команду, в которой произошла страничная ошибка, и результат будет таким же, как если бы страница ранее находилась в памяти, когда команда начала исполняться в первый раз. Другие поля в элементе страничной таблицы процессора 80786 помогают операционной системе эффективно производить действия, связанные с управлением виртуальной памятью. Кроме загрузки страниц по запросам операционная система должна поддерживать набор свободных страничных кадров, которые могут быть распределены обработчиком страничных ошибок. Для увеличения набора свободных страничных кадров операционная система должна знать, какой кадр освободить. Прежде чем освободить кадр, операционная система должна записать эту страницу на диск, если страница была модифицирована с тех пор, когда она была загружена. Для того, чтобы помочь операционной системе в этой длительности, архитектура 80786 имеет бит доступа и бит изменения в каждом элементе страничной таблицы, процессор изменяет эти биты автоматически, для всех имеющихся в памяти страниц 80786 устанавливает бит доступа всегда, когда происходит чтение или запись в данной странице, и устанавливает бит изменения, когда происходит запись в эту страницу. Путем периодического просмотра и сброса битов доступа операционная система может определить страницы, которые давно не использовались. Кадры, содержащие такие страницы, являются хорошими кандидатами на освобождение, поскольку страницы, которые давно не использовались, вряд ли будут использованы в ближайшем будущем. Когда операционная система выбрала страницу для освобождения ее страничного кадра, страница не должна записываться на диск за исключением случая, когда процессор установил ее бит изменения. Каждый элемент страничной таблицы также содержит 3-х битное поле, которое операционная система может использовать по своему усмотрению. Операционные системы обычно используют это поле для маркировки страниц специальными знаками такими как, например, "закрыто для ввода/вывода". 3.4Защита Процессор 80786 обеспечивает несколько механизмов защиты, которое операционная система может селективно выбирать для своих нужд. Одна из форм защиты - отделение пространств адресов задач при помощи таблиц дескрипторов сегментов и страничных таблиц, обсуждалась выше. Это разделение эффективно предотвращает наложение кодов и данных различных прикладных задач. В дополнение к изоляции задач друг от друга 80386 обеспечивает возможность ' i(bk операционной системы от прикладных задач, защиту одной части операционной системы от других частей и защиту задач от некоторых их собственных ошибок. Кроме того, что система защиты 80386 делает операционные системы более надежными, она может упростить процесс отладки, используя прерывания (ловушки) по ошибкам для конкретных задач. Все свойства защиты процессора 80386 реализованы внутри кристалла, поэтому действия по проверке защиты не влияют на производительность процессора. 3.4.1 Привилегии Многие из свойств защиты процессора 80386 базируются на понятии иерархии привилегий. В любой момент привилегии задачи эквивалентна уровню привилегий исполняемого кодового сегмента. В каждом дескрипторе сегмента имеется поле, которое определяет уровень привилегии связанного с ним сегмента, поле может принимать 0 - это наиболее привилегированный уровень, а уровень привилегии 3 - наименее привилегированный. На рис.3-8 Показано, как уровни привилегии процессора 80386 могут быть использованы для установки различных стратегий защиты. Система без защиты может быть реализована путем простого помещения всех процедур в сегмент (или сегменты), чей уровень привилегии равен 0. Традиционное разделение на супервизора и пользователя может быть реализовано путем помещения прикладной задачи в сегмент с уровнем привилегии 3, а процедур супервизора - в сегмент чей уровень привилегий равен 0. Операционная система может также использовать уровни привилегии 1 и 2, если это необходимо. Например, наиболее критические и наиболее изменяемые процедуры операционной системы (иногда называемые ядром операционной системы) могут иметь уровень привилегий 0. Уровень привилегий 0. Уровень привилегий 1 может быть использован для функций операционной системы , которые являются менее критическими и более часто изменяются или расширяются, например, для драйверов устройств. Уровень 2 может быть использован для использования производителями оригинального оборудования, такие производители оригинального оборудования должны затем присваивать уровень привилегий 2 своим программам, оставляя уровень привилегий 3 для конечных пользователей. В этом случае программы производителей оригинального оборудования защищены от программ конечных пользователей. Операционная система защищена как от программ производителей оригинального оборудования и программ конечных пользователей, а ядро операционной системы защищено от всех остальных программ, включая ту часть операционной системы, которая является предметом частных изменений. Как будет показано ниже, уровень привилегий задачи определяет, какие команды можно использовать и какое подмножество сегментов и/или страниц в их адресном пространстве они могут обрабатывать (исполнять). Процессор осуществляет проверку на допустимость работы согласно уровню привилегии задачи и уровню привилегии сегментов или страниц, которые являются операндами команд. Любая попытка задачи использовать более привилегированный сегмент или страницу приводит к остановке работы процессора над командой и возникновению особой ситуации защиты. (Особые ситуации описываются в данном разделе ниже как системные вызовы, которые обеспечивают управляемый путь для вызова менее привилегированными процедурами более привилегированных процедур). 3.4.2 Привилегированные команды В дополнение к тому, какие сегменты и страницы могут быть использованы, уровень привилегии задачи определяет команды, которые задачей могут быть использованы. Процессор 80386 имеет /.$,-.&%ab". команд, исполнение которых должно быть тщательно проанализировано для того, чтобы предотвратить серьезные разрушения системы. Все команды, которые загружают новые значения в системные регистры, являются примерами привилегированных команд. Только задача, работающая на уровне привилегий 0, может исполнять привилегированные команды. 3.4.3 Защита сегментов Дескрипторы в регистрах LDT и GDT - задач определяют логическое адресное пространство задачи. Сегменты, определенные в этих таблицах, теоретически адресуемы, поскольку таблицы дескрипторов обеспечивают информацией, необходимой для вычисления адреса сегмента. Однако адресуемый сегмент не может быть доступен для некоторых операций, из-за дополнительных проверок защиты, осуществляемых процессором 80386. Процессор проверяет каждое обращение к сегменту (сгенерированное при исполнении команды или при выборке команды), чтобы определить, что обращение согласуется с атрибутами защиты сегмента, как это описано ниже. Привилегия: Чтобы получить доступ к сегменту, программа должна иметь, по крайней мере, такую же привилегию как сегмент. Например, программа, работающая на уровне 3, может обращаться только к тем сегментам, чей уровень привилегий также равен 3, в то время, как программа, работающая на уровне 0, может обращаться ко всем сегментам в своем адресном пространстве. Граница: Обращение к сегменту должно находиться внутри границ сегмента. Границы сегмента позволяют процессору обнаруживать программные ошибки, такие как переполнение стека, неверные указатели и индексы массивов, а также неправильные адреса вызовов и переходов. В случаях, когда операционная система может определить, что обращение за границы сегмента не является ошибкой (переполнение стека является примером для некоторых систем), операционная система может расширить сегмент (например, путем добавления страницы к нему) и начать команду с начала. Тип: Каждый дескриптор содержит поле типа, которое процессор проверяет на соответствие команде, которую он исполняет. Обычные сегменты имеют тип команд или данных , позволяя процессору, например, обнаружить попытку записи в существующий код, например, типы сегментов, непосредственно работающие в прикладных программах - это команды и данные. Системные дескрипторы также имеют тип, так что процессор может, например, проверить при переключении задач, что сегмент, указанный в команде JUMP TSS, действительно является сегментом состояния задачи. Права: Дескриптор сегмента может быть помечен правами, ограничивающими операции, которые можно производить со связанным с ним сегментом. Сегменты команд могут быть помечены как исполняемый или читаемый. Сегменты данных могут быть помечены как доступные только для чтения или как доступные для чтения и записи. Все проверки, описанные выше, зависят от целостности дескрипторов. Если задача, исполняющая прикладную программу, могла бы изменять дескриптор, проверка ничего бы не гарантировала. По этой причине операционная система может ограничить доступ к таблицам дескрипторов только для программ с уровнем привилегии 0. Заметим, что в случае разделяемых сегментов различные дескрипторы для одного и того же сегмента (т.е. синонимы) могут иметь различные атрибуты защиты, позволяя, например, одной задаче читать и писать сегмент, в то время, как другой только читать его. Синонимы также позволяют операционной системе преодолеть механизм защиты, если это необходимо, например для перемещения кодового сегмента. 3.4.4 Защита страниц Системы, которые широко не используют защиту сегментов, вместо этого могут защищать страницы (защита страниц может быть также приложима к отдельным частям больших сегментов). Аналогично дескриптору элемент страничной таблицы имеет набор атрибутов защиты, процессор 80386 проверяет каждое обращение к странице на соответствие этим атрибутам. Элемент страничной таблицы может быть отмечен одним из двух уровней привилегий: пользовательский или супервизорный. Пользовательский уровень соответствует уровню привилегий 3, а супервизорные страницы могут быть доступны только задачам, работающим с уровнями привилегий 0, 1 или 2, пользовательская страница может быть отмечена как доступная только для чтения или для чтения и записи. Процессор 80386 проверяет атрибуты защиты страниц после того, как он удостоверился, что доступ находится в соответствии с атрибутами сегмента. Таким образом, защита страниц является удобным средством для операционной системы реализовать дополнительную защиту частей сегментов. Например, операционная система может безопасно заполнить данные операционной системе, относящиеся к задачам, такие как страничные таблицы и дескрипторы файлов, в сегменте данных задачи, обозначив страницы, где расположены эти данные, как супервизорные. 3.5Системные вызовы Большинство операционных систем организуют свои функции как набор процедур, которые могут быть вызваны задачами. Незащищенная операционная система процессора 80386 может поместить свои процедуры и прикладной код в кодовой сегмент с уровнем привилегии 0/ или в более чем один такой сегмент, прикладная задача может затем вызвать функцию операционной системы обычной командной вызова. Такой подход является быстрым, но требует от прикладных задач, чтобы в них не было ошибок и чтобы они выполнялись правильно (как это, например, реализуется во встроенных системах). Ничто не запрещает задаче, работающей на уровне привилегии 0, вызывать процедуры, находящиеся в адресе, который не является точкой входа в операционную систему, ничто не запрещает такой задаче испортить данные операционной системы. Для защиты операционной системы прикладные программы и данные могут быть помещены в менее привилегированные сегменты. Также как задача, работающая на данном уровне привилегии, не может читать или писать данные в сегмент с большим уровнем привилегии, задача также не может непосредственно вызвать процедуру из более привилегированного сегмента. Для того, чтобы позволить задаче, исполняющей команды из менее привилегированного сегмента, сделать вызов защищенной системной процедуры, операционная система должна определить одну или более входных точек. В процессоре 80386 эти входные точки называются шлюзами (см. рис.3-9). АТРИБУТЫ СЧЕТЧИК ДВОЙНЫХ СЛОВ ТИП ПРИВИЛЕГИЯ +------------------------------------------------+ | | | | | БИТ НАЛИЧИ | +------------------------------------------------| | УКАЗАТЕЛЬ ТОЧКИ ВХОДА | +------------------------------------------------+ СЧЕТЧИК ДВОЙНЫХ СЛОВ ОТНОСИТСЯ ТОЛЬКО К ШЛЮЗАМ Имеются два типа шлюзов, которые могут быть использованы для реализации входных точек операционной системы: шлюзы ловушек и шлюзы в