амяти для трансляции. Когда необходимой информации в 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). АТРИБУТЫ СЧЕТЧИК ДВОЙНЫХ СЛОВ ТИП ПРИВИЛЕГИЯ +------------------------------------------------+ | | | | | БИТ НАЛИЧИ | +------------------------------------------------| | УКАЗАТЕЛЬ ТОЧКИ ВХОДА | +------------------------------------------------+ СЧЕТЧИК ДВОЙНЫХ СЛОВ ОТНОСИТСЯ ТОЛЬКО К ШЛЮЗАМ Имеются два типа шлюзов, которые могут быть использованы для реализации входных точек операционной системы: шлюзы ловушек и шлюзы вызовов. Два типа шлюзов, вообще говоря, похожи, однако шлюз вызова позволяет сделать интерфейс операционной системы идентичным с интерфейсом обычной процедуры. Используя шлюзы вызовов, программисты компиляторов и ассемблеров могут использовать общий набор соглашений для вызова любых процедур, оставляя за процессором 80386 заботы о дополнительной обработке, необходимой для изменения уровней привилегии. Как показано на рис.3-9, шлюз содержит логический адрес входной точки и набор атрибутов. Наиболее важный атрибут - это уровень привилегии шлюза. Уровень привилегии шлюза определяет уровни привилегии, которые могут использовать шлюз, для использования шлюза вызывающая процедура должна быть, как минимум, также привилегированна как шлюз. На рис.3-10 Показан пример. В этой гипотической системе программа пользователя имеет уровень привилегии 3, в то время как операционная система разделена на 2 уровня. Ядро операционной системы работает на уровне привилегии 0, а менее критичные функции операционной системы работают на уровне привилегии 1. (Уровень привилегии 2 не используется). В этой системе пользовательская программа позволяет вызывать сервисные процедуры, но не ядро. В соответствии с этим обеспечивает шлюз для сервисных процедур. Уровень привилегий этого шлюза равен 3, так что программа пользователя может вызывать процедуры через него. Присваивая шлюзу ядра уровень привилегии 1, операционная система позволяет сервисным процедурам вызывать ядро, но запрещает доступ к программе пользователя, которая менее привилегированна, чем шлюз ядра. Таким образом операционная система может применять шлюзы для аккуратного определения своих точек входа, включая уровни привилегии, необходимые для использования этих точек входа. Для того, чтобы сделать функции операционной системы вызываемыми из всех задач, операционная система, обычно помещает их шлюзы вызовов в глобальную таблицу дескрипторов. Для осуществления вызова через шлюз ловушки задача использует команду прерывания, для осуществления вызова через шлюз вызова задача исполняет команду обычного межсегментного вызова. Обе команды изменяют уровень привилегии задачи переходят к стеку, определенному (в TSS задаче) для старшего уровня привилегии. (Определенная система должна иметь свой собственный стек для того, чтобы гарантировать достаточно стековое пространство для работы, нельзя верить прикладным задачам, что они имеют достаточное стековое пространство). Перед вызовом через стек вызова задача может заслать параметры в свой стек, как она сделала бы это перед вызовом другой процедуры. Процессор 80386 автоматически копирует параметры в привилегированный стек (поле счетчика двойных слов в шлюзе вызова говорит процессору 80386, сколько двойных слов параметров необходимо скомпилировать). Системы, которые осуществляют вызовы через шлюзы ловушек, могут пересылать параметры в регистрах. 3.6Прерывания и особые ситуации Устройства генерируют прерывания, когда они требуют внимания, в то время как команды могут вызвать особые ситуации, если при их использовании возникают особые условия, такие как несуществующая страница. Типичное прерывание или особая ситуация требуют быстрого вмешательства программного драйвера, который отвечает на прерывание или особую ситуацию. После того, как драйвер вернет управление, 80386 возобновляет исполнение командного потока, который был прерван или который вызвал особую ситуацию. Поскольку прерывания и особые ситуации весьма похожи, процессор 80386 ` aa, b`(" %b их унифицированным способом. Каждый источник прерывания и каждый тип особой ситуации имеет идентификационный номер в диапазоне от 0 до 255, процессор 80386 использует этот номер для того, чтобы вызвать обработчик, связанный с прерыванием или особой ситуацией. При возникновении особых ситуаций они распознаются процессором 80386, который определяет номера особых ситуаций, как это показано в табл.3-1. Номера прерываний определяются операционной системой. Операционная система инициализирует программируемый контроллер прерываний 8259а таким образом, что каждый источник прерываний связывается со своим номером. При появлении прерывания 8259а передает процессору 80386 номер прерывания. Команды прерываний указывают свои номера своих операндах. Заметим, что для совместимости с существующим и будущим оборудованием фирмы INTEL номера прерываний и особых ситуаций от 0 до 71 не должны использоваться иначе, чем это указано в табл.3-1. Все другие номера могут применяться без ограничений. Таблица 3-1 +-----------------------------------------------------------+ | НОМЕР | ОПИСАНИЕ | +----------------+------------------------------------------| | 00 | ДЕЛЕНИЕ НА 0 | | 01 | ОСОБАЯ СИТУАЦИЯ ОТЛАДКИ | | 03 | КОНТРОЛЬНАЯ ТОЧКА ПРОГРАММЫ | | 04 | ПЕРЕПОЛНЕНИЕ | | 05 | НАРУШЕНИЕ ГРАНИЦ МАССИВА | | 06 | НЕДОПУСТИМЫЙ КОД ОПЕРАЦИИ | | 07 | СОПРОЦЕССОР ОТСУТСТВУЕТ | | 08 | ДВОЙНАЯ ОШИБКА | | 10 | НЕПРАВИЛЬНЫЙ TSS | | 11 | СЕГМЕНТНАЯ ОШИБКА | | 12 | ПЕРЕПОЛНЕНИЕ СТЕКА СВЕРХУ ИЛИ СНИЗУ | | 13 | НАРУШЕНИЕ ОБЩЕЙ ЗАЩИТЫ | | 14 | СТРАНИЧНАЯ ОШИБКА | | 16 | ОШИБКА СОПРОЦЕССОРА | +-----------------------------------------------------------+ 3.6.1 Таблица дескрипторов Сгенерировав или получив номер прерывания или особой ситуации, процессор 80386 использует его как индекс в таблице дескрипторов прерываний (IDT). IDT Может быть расположена в любом месте памяти, операционная система инициализирует IDT и загружает ее адрес в регистр таблицы дескрипторов прерываний (IDTR). Подобно GDT или LDT, IDT является вектором дескрипторов, хотя шлюзы являются единственным типом дескрипторов, допустимых в IDT. В IDT имеется один шлюз для каждого обработчика прерывания и особой ситуации (IDT функционально подобна таблице прерываний, имеющейся во многих архитектурах). Обработчик прерываний или особых ситуаций процессора 80386 может быть реализован в виде процедуры или задачи, ниже кратко обсуждаются достоинства этих двух способов. Процессор 80386 вызывает обработчик, организованный в виде процедуры так, он выполняет системный вызов через шлюз. Для вызова обработчика, организованного в виде задачи, процессор 80386 осуществляет переключение задач. Тип шлюза IDT обработчика говорит процессору, каким образом необходимо вызвать обработчик (см. Табл.3-2). Как было указано, шлюзы прерываний и ловушек функционально подобны шлюзам вызовов, за исключением того что они заставляют 80386 запомнить регистр флагов в стек обработчика. Они отличаются один от другого только состоянием флага разрешения прерывания (IF) при "e.$% в обработчик, в обработчик прерываний входят с запрещенными прерываниями, в то время как в обработчик ловушки, который обычно используется для обработки особых ситуаций, входят без изменения запрета. В процессе входа в обработчик - задачу 80386 загружает регистр флагов значением, запомненным в его TSS - задаче, разрешая обработчику работать с разрешенными или запрещенными прерываниями. Таблица 3-2 ХАРАКТЕРИСТИКИ ШЛЮЗОВ ПРЕРЫВАНИЙ И ОСОБЫХ СИТУАЦИЙ +-----------------------------------------------------------+ | ТИП ШЛЮЗА | ОБРАБОТЧИК | ПРЕРЫВАНИЯ | +------------+----------------------+-----------------------| | ПРЕРЫВАНИЕ | ПРОЦЕДУРА | ЗАПРЕЩЕНЫ | | ШЛЮЗ | ПРОЦЕДУРА | РАЗРЕШЕНЫ | | ЗАДАЧА | ЗАДАЧА | (ФЛАГ IF ОБРАБОТЧИКА) | +-----------------------------------------------------------+ Обработчики - процедуры являются подходящим средством для программ, которые должны работать в контексте (т.е. использовать адресное пространство и значения регистров) задачи, которая прервана или вызвала особую ситуацию. При 16-мгц-синхросигнале процедура входа в обработчик занимает 3,6 мкс. Подобно любой другой процедура прерывания или особой ситуации имеет доступ ко всем ресурсам работающей задачи: к ее данным и коду, ее регистрам и стеку. Так и должно быть для большинства особых ситуаций, поскольку в задаче возникла особая ситуация и может потребоваться доступ к данным задачи, чтобы эту особую ситуацию разрешить. Например, обработчику страничных ошибок необходимы страничные таблицы работающей задачи для того, чтобы найти дисковый адрес отсутствующей страницы. В идеале прерывания должны обрабатываться задачами, а не процедурами, так как прерывание , вообще говоря, не относится к задаче, которую оно прерывает. Более того, обработчик прерываний должен иметь свои собственные ресурсы (например, свой собственный стек), а не внедрять в стек какой-то задачи, которая работала в момент появления прерывания. С другой стороны переключение задач требует значительно большего времени чем вызов процедуры (17 мкс вместо 3,6), поскольку процессор запоминает и восстанавливает регистры при переключении задач. Системы, которые чрезвычайно чувствительны ко времени реакции на прерывания, могут обрабатывать прерывания при помощи процедур. 3.6.2 Особые случаи и регистры отладки Подобно большинству процессоров 80386 имеет команду контрольной точки, которую можно использовать для вызова отладчика. Однако отладочная аппаратура 80386 имеет форму регистров отладки, показанных на рис.3-11. Регистры отладки поддерживают контрольные точки данных являются важным нововведением, которое может сократить время отладки на многие часы, т.К. Например, позволяет установить, когда происходит непредусмотренная запись в структуры данных. Регистры отладки также сокращают искажения в программах, необходимые для записи команды точек останова в код, особенно для программ, которые защищены от записи или разделены другими задачами. Отладчик 80386 реализует в виде обработчика особой ситуации с номером 1. Процессор может непосредственно вызвать отладчик после исполнения любой команды (путем установки флага TF - флага ловушки пошагового исполнения), после переключения определенной задачи или после появления условия точки останов, определенного одним из `%#(ab`." отладки. Анализируя регистр статуса отладки, обработчик отладочной особой ситуации может определить, какая из причин его вызвала. Будучи вызван при переключении задач, отладчик может перезагрузить регистры отладки значениями, подходящими для новой задачи. 80386 Может ожидать появления одновременно до четырех условий контрольных точек, вызывая обработчик отладочной особой ситуации про появлении одного из условий. Каждое условие контрольной точки определяется содержимым регистра отладки, эти регистры могут быть загружены и запомнены при помощи привилегированных форматов команды MOVE. Условие контрольной точки содержит 32-битный линейный адрес, 2-битное поле длины и поле доступа, последние два элемента указываются в полях регистра управления отладкой DR7. Адрес условия контрольной точкой и длина формируют адресный диапазон, который контролируется процессором при каждой ссылке на память. Поле доступа определяет тип доступа, для которого процессор может вызвать особую ситуацию 1. Могут быть указаны 3 типа доступа: 1) исполнение команды по указанному адресу; 2) запись данных в диапазон адресов; 3) чтение или запись данных в диапазоне адресов. 3.7Ввод/вывод Системы, базирующиеся на 80386, могут распределять устройства ввода/вывода в пространство памяти процессора или в отдельное пространство ввода/вывода. Устройствам ввода/вывода, распределенным в пространство памяти, можно обращаться для чтения или записи, используя такие команды обращения, как MOVE, OR или аналогичные. Устройства, распределенные в памяти, могут быть защищены с помощью стандартного механизма защиты сегмента и страницы процессора 808386. В дополнении к своему адресному пространству процессор 80386 имеет 64к-байтное адресное пространство ввода/вывода. Устройства, распределенные в это пространство, управляются командами ввода, вывода, ввода строки и вывода строки. Первые две команды передают байт, слово, двойное слово в или из EAX-регистра. Последние две команды передают строку байтов, слов или двойных слов в память или из памяти. Команды ввода-вывода 80386 чувствительны к уровню привилегий. В регистре флагов имеется поле, называемое уровнем привилегий ввода/вывода (IOPL), которое определяет минимальный уровень привилегий , на котором работающая задача может исполнять команды ввода/вывода (IOPL загружается из TSS, так что задачи могут иметь различные IOPL). Например, если IOPL задачи равен 1, то задача не может выдавать команды ввода-вывода, исключая случаи, когда она работает на уровне привилегии 0 или 1. Механизм IOPL поддерживает операционные системы с многоуровневой защитой, в которых, например, критичные и стабильные процедуры ядра работают на уровне привилегии 0, а более изменчивые процедуры ввода-вывода работают на уровне привилегии 1, в этом случае операционная система должна только установить IOPL равным 1, когда она создает задачу, поскольку IOPL характерен для задачи, те задачи, которым можно доверять, могут исполнять команды ввода-вывода на прикладном уровне, позволяя тем самым непосредственно работать со специальными устройствами, для которых не имеется драйвера операционной системы. Для того, чтобы реализовать прямой доступ к памяти (DMA) от устройств вода/вывода, операционная система 80386 передает d('(g%a*() адрес контроллеру DMA и должна гарантировать, что сегменты и/или страницы, ко которым происходит обращение при DMA- передачах , не будут перемещаться во время этой операции. Один из способов пометить страницы "фиксированными на время ввода-вывода" - это использование одного из трех битов пользователя в страничной таблице. АРХИТЕКТУРНАЯ СОВМЕСТИМОСТЬ 80386 совместим на уровне объектного кода с 80286 и с 8086. Хотя можно просто использовать 80386 как быстрый 80286 или как очень быстрый 8086, их совместимость обладает достаточно большой гибкостью. Процессор 80386 может выполнять программы 80286 и 80386 параллельно, и, используя виртуальный режим 86 процессора 80386, существующие программы 8086 могут также исполняться параллельно. Таким образом при помощи 80386 становится возможным строить системы, которые могут параллельно исполнять программы, написанные для различных поколений семейства микропроцессоров. 4.1Совместимость с 80286 Архитектура 80286 является точным подмножеством архитектуры 80386. Так как процессор 80386 распознает все команды 80286, регистры, дескрипторы и т.Д., То операционная система 80286 и прикладные программы могут быть перенесены на аналогичное оборудование, построенное на основе 80386 без изменения хотя бы одного бита. Прямой перенос, упомянутый выше, является наиболее быстрым путем для того, чтобы запустить существующие программы, написанные для 80286 на системе, построенной на 80386. С другой стороны операционные системы для 80386 могут разрабатываться так, чтобы они поддерживали существующие прикладные программы для 80286, и, позволяя в то же время, новым прикладным программам полностью использовать свойства архитектуры 80386 (например, 32-битные параметры и длинные сегменты). В таких гибких разработках новые прикладные программы вызывают операционную систему непосредственно, передавая 32-битные параметры. Вызовы старых прикладных программ, которые организованы в 16-битном формате 80286, перехватываются и преобразуются в 32-битный формат, а затем передаются в операционную систему. 4.2Режимы реального и виртуального 8086 Процессор 80386 может выполнить объектные программы 80386 водном из 2 режимов: реальном режиме или виртуальном режиме 86. 80386 Входит в реальный режим при сбросе. В реальном режиме процессор обеспечивает быстрое исполнение без защиты так, как на 8086. Многие операционные системы будут переключаться из реального режима в режим защиты после инициализации, но также возможно работать все время в реальном режиме 8086. Принципиальное различие между реальным режимом 80386 и действительным режимом 8086 заключается в скорости: программы 8086, которые критичны по скорости исполнения (например, использующие рассчитанные временные циклы), могут потребовать небольших изменений для того, чтобы они работали правильно в значительно более быстром реальном режиме 80386. Но основное множество программ 8086 будет работать без каких-либо трудностей, т.к. они работают в реальном режиме 80286. Виртуальный режим 86 устанавливает исполнительную среду 8086 внутри защищенной многозадачной среды 80386. В то время, как реальный режим управляет всем, что делает процессор, виртуальный режим 86 может применяться в избранных задачах 80386. Когда процессор работает в виртуальном режиме 86, он ведет себя, как в 8086, но поле переключения к нормальной задаче, процессор работает как 80386 (который, на самом деле, может интерпретировать программы как для 80286, так и 80386). Таким образом виртуальный режим 86 позволяет операционной системе поддерживать исполнение программ 8086, 80286 и 80386 одновременно. В разделе 3 было описано, как сегмент состояния задачи отражает состояние своего виртуального процессора. Флаг VM86 в регистре флагов, который загружается из TSS, определяет работающий виртуальный процессор задачи как 8086 или 80386. Когда 80386 загружает свои регистры из TSS, у которого флаг VM86 установлен, процессор входит в виртуальный режим 86. Когда при последующем переключении задачи, процессор загружает значения в регистр из TSS, у которого флаг VM86 сброшен, он выходит из виртуального режима 86. Таким образом от задачи к задаче процессор эмулирует 80386 или 8086 согласно значению флага VM86. 80386 Также выходит из виртуального режима 86, когда он выдает особую ситуацию или возникает прерывание, и предоставляет полные ресурсы архитектуры обработчику прерываний и особых ситуаций. При возврате из обработчика, вызванного в виртуальном режиме 86,80386 автоматически возвращается в виртуальный режим 86. Так как адресное пространство 8086 равно 1 мегабайту, логические адреса, генерируемые задачей в виртуальном режиме 86, попадает в первый мегабайт линейного адресного пространства 80386. Множество задач, работающих в виртуальном режиме 86, могут пересекаться друг с другом, поэтому они все должны разделять младший мегабайт линейного адресного пространства. Операционная система может использовать страничный механизм 80386 для перемещения линейных адресных пространств задач, работающих в виртуальном режиме 86, в различные области физического адресного пространства. Используя страничный механизм таким способом, не только предотвращают наложение задач, работающих в виртуальном режиме 86, но позволяют операционной системе с виртуальной памятью обменивать страницы задач, работающих в виртуальном режиме 86, как если бы они были задачами 80386. Задача, работающая в виртуальном режиме 86, может выполнять программу, которая была написана для выполнения на однозадачном персональном компьютере. Такая программа может содержать команды, которые потенциально опасны, когда они выполняются в многозадачной среде. Например позволяя задаче, работающей в виртуальном режиме 86, выполнять команду очистки флага прерываний, тем самым запрещая прерывания, можно остановить в