ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 5

			    - 139 -
			    ЧАСТЬ 5
	  БОЛЕЕ ГЛУБОКОЕ ОПИСАНИЕ ЗАЩИЩЕННОГО РЕЖИМА.
	   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Принцип   использования   процессора   80386   для	 простых
защищенных 32-битных систем был раскрыт в части 3. Затем в части
4 описан новый и полезный режим виртуального 8086. Но кроме того
процессор  80386  предоставляет  еще  дополнительные  интересные
возможности.
   Этот  раздел  раскрывает  наиболее  интересные  и   наиболее
запутанные возможности 80386, включая
   p Полное описание таблицы дискрипторов и их содержимого.
   p Встроенную поддержку многозадачности и переключение задач.
   p Полное об`яснение работы с прерываниями и	исключительными
ситуациями.
   p  Расширенные  возможности	отладки,  встроенные  в  каждый
процессор 80386.
   Эти особенности дополняют  картину  архитектуры  процессора.
Более глубокий взгляд на таблицы дескрипторов  и  их  содержимое
раскрывает встроенные возможности многозадачной  работы.  Глава,
посвященная исключительным ситуациям  и  прерываниям,  является,
в- основном, информацией для понимания всех операций  процессора
80386. Наконец,  особенности  отладки  для  16	и  32  -  битных
программ, как в реальном, так и  в  защищенном	режиме	являются
предметом интереса для всех программистов.
			   ГЛАВА 14.
	     Таблицы дескрипторов и их содержимое.
	       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Эта	глава  содержит  полное  описание  таблиц  дескрипторов
процессора  80386  и  их  содержимого.	Глава  8  дала	 вводную
информацию  по	 дескрипторам,	 переключателям    и	таблицам
дескрипторов простой защищенной 32 - битной системы. Были  также
рассмотреныи некоторые другие типы дескрипторов,  переключателей
и  таблиц  дескрипторов.  Эта  глава  резюмирует  и  всесторонне
описывает   назначение	 и   формат    всех    дескрипторов    и
переключателей.
	      Назначение дескрипторов сегментов.
		 ДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Дескрипторы сегментов  для  команд  и  данных  описывают,  в
компактной форме,воспринимаемой процессором 80386, исключительно
сегменты, существующие в памяти - т.е.	code  и  data  сегменты.
Сегменты code и data  задаются	различными  типами  дескрипторов
т.к.  только  code  сегмент  является  исполняемым,  а	с  целью
обеспечеия  надлежащей защиты  системы,  для  исполняемого  кода
требуется другой набор атрибутов, нежели для данных.
   Предусмотренные дескрипторы сегментов состояния задачи (TSS)
позволяют умножать TSS-ы. Эта особенность  позволяет  процессору
80386 поддерживать многозадачность.  Активная  в  данный  момент
задача индицируется селектором	в  регистре  задач  (TR)  и  TSS
дескрипторе, описываемым  соответствующим  значением  селектора.
Это будет описано ниже в главе 15.
   Таким  же  образом,	 предусмотренные   дескрипторы	 таблиц
локальных  дескрипторов  (LDT)	позволяют  умножать  LDT-ы.  Это
позволяет каждой задаче в многозадачной архитектуре 80386  иметь
свое  личное  локальное  адресное   пространство.   Активное   в
настоящий момент локальное  адресное  пространство,  указываемое
селектором в LDT регистре (LDTR),а  LDT  дескриптор  указывается
соответствующим значением селектора.
			    - 140 -
		  Назначение переключателей.
		   ДДДДДДДДДДДДДДДДДДДДДД
   Переключатели  обеспечивают	только	передачу  управления  в
адресном пространстве, как к  определенному  сегменту  code  или
определенной задаче.
   Вызывающие переключатели, отладочные (trap) переключатели, и
переключатели прерываний описывают точку входа в  сегмент  code;
переключатели задач указывают задачу. Указывая переключатель как
операнд результата выполнения инструкции,  управление  будет  на
некоторое    время    передаваться    принимающему     операнду,
описываемому переключателем. Необходимо отдать	должное  функции
перенаправления, т.к. часто существует	необходимость  создавать
множественные точки входа, соответствующие данному сегменту  или
данной задаче.
   Переключатели, расположенные в IDT позволяют описывать точки
входа как через механизм аппаратных прерываний процессора, так и
через инструкции программных  прерываний  INTn,  INTO,	BOUND  и
исключительные ситуации. Для этих целей отладочный переключатель
(trap  gate)  и  переключатель	 прерываний   (interrupt   gate)
указывают на code сегмент внутри текущей задачи, используя GDT и
текущую  LDT.  Переключатель  задач  (task  gate)  указывает  на
сегмент  состояния  задачи  и  требует	 от   процессора   80386
выполнения  автоматического  переключения  задач  для  получения
доступа к задаче-приемнику (см. главу 15).
	     Типы и форматы дескриптора сегментов.
	      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Дескрипторы сегментов - специальные 8-байтовые типы	данных,
необходимые для защищенного режима. Они описывают базовый адрес,
размер и атрибуты сегментов. Существуют четыре типа дескрипторов
сегментов  дескрипторы	 code	сегментов,   дескрипторы   data
сегментов, дескрипторы сегментов состояния задач  и  дескрипторы
таблиц	 локальных   дескрипторов.   Описание	 каждого    типа
дескрипторов будет приведено ниже.
   Все дескрипторы имеют определенное сходство друг  с	другом.
Внутренний формат  всех  дескрипторов  включает  базовый  адрес,
значение предела, а также другую информацию об атрибутах.
   Сами сегменты как 16-битные, так  и	32-битные  используются
для code сегментов, data сегментов и сегментов состояния  задач.
Дескрипторы code сегментов содержат бит умолчания  D  (Default),
указывающий на то является данный сегмент  16-битным  (D=0)  или
32-битным  (D=1)  сегментом.  Когда  D=0  целое  старшее   слово
дескриптора должно быть 0, в соответствии с определением формата
для 16-битного дескриптора. Дескрипторы code  и  data  сегментов
имеют B (Big) бит, который может быть установлен  для  индикации
величины размера сегмента; 32-битный  дескриптор  данных  обычно
имеет B=1, индицируя поддержку размеров сегментов  вплоть  до  4
гигабайт. Дескрипторы для сегментов  состояния	задач  различают
32- битные TSS от 16- битных TSS.
   Принимая в расчет различные типы сегментов, 16- битные и 32-
битные размеры, существуют семь форматов дескрипторов
   32- битные сегменты code
   16- битные сегменты code
   32- битные сегменты data
   16- битные сегменты data
   32- битные сегменты состояния задачи
   16- битные сегменты состояния задачи
   Таблицы локальных дескрипторов
   Дескриптор имеет следующие поля
   1. Базовый	адрес	сегмента   -   32-   битное   значение,
определяющее  базовый  адрес  сегмента	 в   линейном	адресном
пространстве.
			    - 141 -
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і		і  D   A предел і		і		і 4
ісег.базы 31..24іG 1 0 V	іP DPL 1 1 C R Aісег.базы 23..16і
і		і      L 19...16і		і		і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і сегмент базы 15.....0 	ісегментный ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 а) 32-битный кодовый сегментный дескриптор.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і		і  D		і		і		і 4
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0іP DPL 1 1 C R Aісег.базы 23..16і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і сегмент базы 15.....0 	ісегментный ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 в) 16-битный кодовый сегментный дескриптор.
  Рис.14.1 Дескриптор для 32-битного и 16-битного сегмента кода.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і		і  B   A предел і		і		і 4
ісег.базы 31..24іG 1 0 V	іP DPL 1 0 E W Aісег.базы 23..16і
і		і      L 19...16і		і		і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і сегмент базы 15.....0 	ісегментный ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 а) 32-битный  сегментный дескриптор данных.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і		і  B		і		і		і 4
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0іP DPL 1 0 L W Aісег.базы 23..16і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і сегмент базы 15.....0 	ісегментный ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 в) 16-битный сегментный дескриптор данных.
Рис.14.2 Дескриптор для 32-битного и 16-битного сегмента данных.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і		і      A предел і		і		і 4
ісег.базы 31..24іG 0 0 V	іP DPL 0 1 0 В 1ісег.базы 23..16і
і		і      L 19...16і		і		і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    TSS  базы 15.....0 	і  TSS	    ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 а) 32-битный дескриптор сегмента состояния задачи.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0іP DPL 0 0 0 B 1іTSS базы 23..16і
 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і     TSS базы 15.....0 	і      TSS  ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 в) 16-битный дескриптор сегмента состояния задачи.
  Рис.14.3 Дескриптор для 32-битного и 16-битного сегмента
состояния задачи.
    2. Граница	сегмента  -  20-   битное   поле,   определяющее
максимальное смещение (offset) сегмента. Эта граница может иметь
либо  байтовую	 либо	страничную   гранулярность   (4096-byte-
granular). О бите гранулярности см. ниже.
			    - 142 -
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і		і      A предел і		і		і 4
іLDT базы 31..24іG 0 0 V	іP DPL 0 1 0 1 0іLDT базы 23..16і
і		і      L 19...16і		і		і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    LDT  базы 15.....0 	і  LDT	    ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
  Рис.14.4 Дескриптор для LDT (локальная дескрипторная таблица).
   3. G   (Granularity)   показывает   гранулярность	границы
сегмента.  (G=0)-  байтовая  гранулярность,  (G=1)-   страничная
гранулярность. Если гранулярность  байтовая,  то  граница  может
быть определена с точностью до байта, т.к.  поле  представляющее
биты 19..10 разрешает максимально возможное смещение вплоть до 1
мегабайта. В случае страничной гранулярности граница может  быть
определена с точностью до  страницы,  т.к.  поле  представляющее
биты  31..12  разрешает  максимально  возможное  смещение  до  4
гигабайт.
   4. D (Derfault) указывает является  ли  сегмент  32-  битным
(D=1) или 16 битным (D=0). Если D=1 формат дескриптора для  code
и data сегментов будет таким,как показано на рис. 8.2 и рис. 8.3
соответственно. В случае D=0  формат  дескриптора  соответствует
используемому  процессором  80286  в   защищенном   режиме   для
16-битных сегментов, как сказано в главе 14. По  умолчанию,  32-
битные коды операций используют  32-  битные  размеры  данных  в
операндах и 32- битные адреса. По  умолчанию,  16-  битные  коды
операций используют 16- битные размеры данных в операндах и  16-
битные	  адреса.    (Совместимо    с	  защищенным	 режимом
80286).
   5. E  (Expansion  Direction),  только  для  data   сегментов
указывает где содержится сегмент в  диапазоне  адресов	от  базы
сегмента  вверх  до  его  границы  включительно  (E=0),  или  от
максимального смещения (offset) вниз до границы  не  включая  ее
(E=1). Большинство сегментов данных содержат 0 в этом  бите  для
"расширения  вверх".  Сегмент   данных,   который   поддерживает
динамически расширяемый стек, должен быть  установлен  в  1  для
"расширения вниз". Стек данных наращивается вниз  в  направлении
младших адресов.
   6. B (Big) Только для сегментов  данных.  Влияет  только  на
сегменты, расширяемые вниз. B показывает  максимальное	смещение
(offset) сегмента. Максимальное смещение  (offset)  расширяемого
вниз сегмента данных индицируется как FFFFFFFFh  (B=1)	или  как
0000FFFFh (B=0). B  не	влияет	на  расширяемые  вверх	сегменты
данных.
   7. Право  доступа.  Показывает  доступные  формы  доступа  к
сегментам, включая требования  уровня  привилегий  и  защиты  от
записи или чтения. Если использование операнда	внутри	сегмента
не совместимо с допустимыми  формами  доступа,	процессор  80386
генерирует  исключительную  ситуацию  общей  защиты   (13)   или
исключительную ситуацию потери стека  (12)  в  случае  если  это
произошло с сегментом stack.
   7а. P (Present) показывает присутствует сегмент в физической
памяти	(P=1)  или  отсутствует  (P=0).   Этот	 бит   позволяет
об`являть   много   больших   сегментов,   только    часть    из
которых  является  полностью  или  частично  присутствующими   в
физической памяти  одновременно.  Страничная  система  позволяет
любому сегменту быть загруженным в  базис  страницы.  Даже  если
P=1, сегменту не обязательно  присутствовать  полностью.  Многие
страницы   виртуально	присутствующего   сегмента    могут    в
действительности находиться на диске.
   7b. DPL  (Descriptor  Privilege  Level)  показывает	уровень
привилегий сегмента в виде номера от 0 до 3 в следующем порядке
			    - 143 -
  Поле DPL   Описание
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   00	     Уровень 0	      наиболее	привилегированный
				     (супервизор, ядро)
   01	     Уровень 1
   10	     Уровень 2
   11	     Уровень 3	      наименее привилегированный
				       (пользователь)
   Уровень привилегий DPL  текущего  сегмента  code  показывает
текущий  уровень  привилегии  (CPL)  операции.	Например,   если
процессор  исполняет  сегмент  code,  имеющий  DPL  0,	 то   он
исполняется с  CPL  0,	на  наиболее  привилегированном  уровне,
уровне супервизора.
   7с. A (Accessed)  показывает  может	быть  доступен	сегмент
(A=1) или нет (A=0). Системы, использующие межсегментные  обмены
могут  использовать  этот  бит	для  определения   использования
сегмента. Типичные простейшие системы  обмениваются  страницами,
ане  сегментами,  и  для  таких  систем  этот	бит   не   будет
представлять интереса.
   7d. R (Readable), для  сегментов  code  только.  Показывает,
является ли сегмент читаемым (R=1) или нет (R=0). Сегменты  code
являются  всегда  исполняемыми.  Аттрибут  R  может   обеспечить
дополнительную безопасность  страшным  программным  обеспечением
читать из сегмента code используя префикс смены сегмента CS (см.
рис   3.1).   Это    может    предотвратить    "пиратство"    по
отношению к обьектному коду, находящемуся в памяти.
   7e. C (Conforming), только  для  сегментов  code.  Указывает
происходили ли изменения в CPL когда сегмент был вызван с уровня
более низкой привилегии  (C=0)	или  нет  (C=1).  Если	C=1,  то
сегмент code считается конформным сегментом, т.к.  значение  CPL
не изменялось когда  вызывался	этот  сегмент.	Конформные  code
сегменты являются,  возможно,  наиболее  абстрактной  концепцией
архитектуры защищенного режима. В простой 32- битной системе все
code сегменты являются регулярными, т.е. неконформными.
   7f. W (Writable), только для  сегментов  данных.  Показывает
разрешена запись в сегмент (W=1) или нет (W=0). Сегменты  данных
всегда	 читаемы.   Атрибут   W    обеспечивает    безопасность,
предотвращая  любые  изменения	 в   данных.   Эта   специальная
особенность  применяется,  например,  для  сегментов  содержащих
важную информацию о статусе системы или для  общедоступной  базы
данных. В простой защищенной 32- битной системе  сегмент  данных
является многоцелевым и кроме всего  прочего  содержит	стек;  в
очень простой системе он должен, таким образом,  быть  доступным
для записи.
		Типы переключателей и форматы.
		 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Переключатели -  это  специальные  восьмибайтовые  структуры
данных,   необходимые	в   защищенном	 режиме    в	качестве
перенаправляющих или векторных устройств. Существует четыре типа
переключателей. С каждым типом выполняются  несколько  различные
формы перенаправления. Эти четыре  типа  называются  вызывающие
переключатели  (call  gates),  отладочные  переключатели   (trap
gates),   переключатели   прерываний   (interrupt    gates)    и
переключатели задач (task gates). Предназначение каждого из них,
которое будет об`яснено ниже, в- основном ясно из названий.
   Общий  формат  всех	 типов	 переключателей   идентичен   и
в любом случае содержит селектор, указывающий или на дескриптор
code сегмента или на TSS дескриптор, значение  смещения  (offset
value), определяющее точку  входа  (исходное  значение	регистра
EIP) в выбранный сегмент и информацию об использовании. Заметим,
что переключатель задач содержит поле смещения	(offset  field),
			    - 144 -
которое не используется с тех пор как указанный TSS  не  получит
значение EIP.
   В   случаях	 вызывающих,   отладочных   переключателей    и
переключателей прерываний, делаются различия между  16-  битными
и  32-	битными  переключателями.  В  этих  случаях   два   типа
переключателей имеют различные поля атрибутов.
   Принимая во	внимание  различные  типы  переключателей,  16-
битные	и  32-	битные	 размеры,   существует	 семь	форматов
переключателей
   32- битные вызывающие переключатели
   16- битные вызывающие переключатели
   32- битные отладочные переключатели
   16- битные отладочные переключатели
   32- битные переключатели прерываний
   16- битные переключатели прерываний
   Переключатели задач.
31				15		7		0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і  смещение 31...16		іР DPL 0 1 1 0 0і0 0 0		і 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іселектор к дескр.код.сегменту	і смещение 15...0		і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
а) Вызывающий переключатель в дескриптор 32-битного кодового сегм
ента.
31				15		7		0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0іР DPL 0 0 1 0 0і0 0 0		і 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іселектор к дескр.код.сегменту	і смещение 15...0		і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
в) Вызывающий переключатель в дескриптор 16-битного кодового сегм
ента.
  Рис.14.5    32-битные и 16-битные вызывающие переключатели.
31				15		7		0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і  смещение 31...16		іР DPL 0 1 1 1 1і0 0 0		і 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іселектор к дескр.код.сегменту	і смещение 15...0		і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
а) Отладочный переключатель в дескриптор 32-битного кодового сегм
ента.
31				15		7		0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0іР DPL 0 0 1 1 1і0 0 0		і 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іселектор к дескр.код.сегменту	і смещение 15...0		і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
в) Отладочный переключатель в дескриптор 16-битного кодового сегм
ента.
  Рис.14.6   32-битные и 16-битные отладочные переключатели.
31				15		7		0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і  смещение 31...16		іР DPL 0 1 1 1 0і0 0 0		і 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іселектор к дескр.код.сегменту	і смещение 15...0		і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
а) Переключатель прерываний в дескриптор 32-битного кодового сегм
ента.
31				15		7		0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0іР DPL 0 0 1 1 0і0 0 0		і 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іселектор к дескр.код.сегменту	і смещение 15...0		і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
в) Переключатель прерываний в дескриптор 16-битного кодового сегм
ента.
  Рис.14.7    32-битные и 16-битные переключатели прерываний.
			    - 145 -
31				15		7		0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0іР DPL 0 1 1 1 1і		і 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іселектор к дескр.код.сегменту	і				і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
    Переключатель задач в 32-битный или 16-битный дескриптор
    сегмента состояния задачи
  Рис.14.8  Переключатели задач для 32-битных и 16-битных TSS.
   Содержимое  полей  вызывающего  переключателя,   отладочного
переключателя и переключателя прерываний следующее
   1. Селектор принимающего code сегмента указывает на сегмент,
содержащий принимающую программу. Этот селектор должен указывать
на code сегмент.
   2. Смещение (offset) точки входа в code  сегмент  определяет
точку входа в принимающую программу.
   3. Право доступа - несколько бит,  показывающих  разрешенные
формы  доступа	к  переключателю,  включая   требования   уровня
привилегий. Если использование	переключателя  не  совместимо  с
требованиями,  то  процессор  80386  генерирует   исключительную
ситуацию общей защиты (13) или стековую исключительную	ситуацию
(12), если отсутствует stack сегмент.
   3a. P   (Present-присутствие),   показывает	 доступен    ли
переключатель  для  использования  (P=1)  или  нет  (P=0).   Для
успешного переключения переключатель должен присутствовать.
   3b. DPL (Descriptor	Privilege  Level  -  дескриптор  уровня
привилегий)   показывает   уровень   привилегий   переключателя.
Аппаратное  прерывание	может  осуществляться  через  отладочный
переключатель или переключатель прерываний, если он помечен  как
присутствующий,   независимо   от   DPL    переключателя.    DPL
используется  только  для  инструкций	CALL   для   вызывающего
переключателя и для  программных  прерываний  (инструкции  INTn,
INTO,  BOUND   и   исключительные   ситуации)	для   отладочных
переключателей или  переключателей  прерываний.  DPL  показывает
уровень привилегий преключателя  числом  от  0	до  3  следующим
образом
  Поле DPL   Описание
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   00	     Уровень 0	      наиболее привилегированный
				      (супервизор, ядро)
   01	     Уровень 1
   10	     Уровень 2
   11	     Уровень 3	      наименее привилегированный
				       (пользователь)
   Для	 инструкции   CALL,   программного   прерывания,    или
исключительной ситуации, инструкция, использующая  переключатель
должна иметь CPL меньший, чем DPL переключателя. Например,  если
процессор исполняет code сегмент с DPL=3 (т.е. на уровне текущей
привилегии  3),  то  инструкция  CALL  в   этом   случае   может
использовать  только  вызывающие  переключатели   с   DPL=3,   и
программные  прерывания  могут	использовать  только  отладочные
переключатели и переключатели прерываний  с  DPL=3.  Любое  иное
значение DPL  (т.е.  2,1,  или	0)  переключателя  укажет  более
высокий  уровень  привилегий   и   успешного   переключения   не
произойдет. В этом  случае  будет  сгенерирована  исключительная
ситуация общей защиты (13).
   Содержимое полей переключателя задач следующее
   1. Селектор принимающего сегмента состояния задачи указывает
на сегмент состояния задачи  содержащий  принимающую  программу.
Этот селектор  должен  указывать  на  сегмент  состояния  задачи
			    - 146 -
(либо 32- либо 16- битный TSS). Переключатель задач не	содержит
поля смещения (offset), с того	времени  как  TSS  сам	содержит
значение EIP для последующего использования.
   2. Право доступа - несколько бит,  показывающих  разрешенные
формы  доступа	к  переключателю,  включая   требования   уровня
привилегий. Если использование	переключателя  не  совместимо  с
требованиями,  то  процессор  80386  генерирует   исключительную
ситуацию общей защиты (13) или стековую исключительную	ситуацию
(12), если отсутствует stack сегмент. Если сам сегмент состояния
задачи некорректен, процессор генерирует исключительную ситуацию
10.
   2a. P   (Present-присутствие),   показывает	 доступен    ли
переключатель  для  использования  (P=1)  или  нет  (P=0).   Для
успешного переключения переключатель должен присутствовать.
   2b. DPL (Descriptor	Privilege  Level  -  дескриптор  уровня
привилегий)   показывает   уровень   привилегий   переключателя.
Аппаратное  прерывание	может  осуществляться  через  отладочный
переключатель или переключатель прерываний, если он помечен  как
присутствующий,   независимо   от   DPL    переключателя.    DPL
используется только для программных прерываний (инструкции INTn,
INTO, BOUND и исключительные ситуации)	DPL  показывает  уровень
привилегий преключателя числом от 0 до 3 следующим образом
  Поле DPL   Описание
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   00	     Уровень 0	      наиболее привилегированный
				      (супервизор, ядро)
   01	     Уровень 1
   10	     Уровень 2
   11	     Уровень 3	      наименее привилегированный
				       (пользователь)
   Для программного прерывания,  или  исключительной  ситуации,
инструкция, использующая прерывание, должна иметь  CPL	меньший,
чем DPL переключателя. Например, если процессор  исполняет  code
сегмент с DPL=3  (т.е.	на  уровне  текущей  привилегии  3),  то
программное прерывание в этом случае может  использовать  только
переключатели задач с  DPL=3,  и  программные  прерывания  могут
использовать только  отладочные  переключатели	и  переключатели
прерываний с DPL=3. Любое иное значение DPL (т.е.  2,1,  или  0)
укажет более высокий уровень привилегий и успешного переключения
в задачу  не  произойдет.  В  этом  случае  будет  сгенерирована
исключительная ситуация общей защиты (13).
		     Таблицы дескрипторов.
		      ДДДДДДДДДДДДДДДДДДДД
   Таблицы дескрипторов (descriptor tables) - это расположенные
в памяти матрицы, содержащие в качестве элемента дескриптор  или
переключатель. Процессор  80386  поддерживает  три  типа  таблиц
дескрипторов  таблица  глобальных  дескрипторов  (GDT),  таблица
локальных дескрипторов (LDT),  таблица	дескрипторов  прерываний
(IDT).
   Две из  этих  таблиц,  GDT  и  LDT  содержат  дескрипторы  и
переключатели, описывающие адресное пространство; они описывают,
например, существующие	сегменты  и  задачи.  На  дескрипторы  и
переключатели, расположенные в этих таблицах, можно ссылаться  с
использованием селекторов.  Напомним,  что  GDT  устанавливалась
простой 32-битной защищенной системой. LDT не использовались для
простой системы, т.к. они  целиком  связаны  с	многозадачностью
процессора 80386 и служат  для	обеспечения  локальным	адресным
пространством индивидуальной задачи, как описано в главе 15.
   Третья таблица,  IDT,  содержит  только  переключатели;  они
			    - 147 -
служат для перенаправления исключительных ситуаций и  прерываний
на соответствующие им программы  обслуживания.	Переключатели  в
этой таблице указывают на номера прерываний от 0 до 255.
   Данное большое число дескрипторов, переключателей, таблиц  и
размещение каждого из них должно  быть	выполнено  исключительно
аккуратно. Для этого существует таблица 14.1, которая резюмирует
разрешаемое содержимое каждой таблицы дескрипторов.
   Как GDT, так и LDT могут содержать дескрипторы code	и  data
сегментов  и  могут  содержать	вызывающие   переключатели   или
переключатели задач. Тем не менее  в  то  время  какLDT  создана
только для обеспечения локального адресного пространства  задач,
GDT является только таблицей, позволяющей содержать  специальные
дескрипторы для сегментов состояния  задач  и  таблиц  локальных
дескрипторов. IDT может содержать только переключатели для целей
перенаправления   исключительных    ситуаций	и    прерываний.
Переключателями,   которые   она   может   содержать,	являются
переключатели прерываний, задач, отладочные переключатели, но не
вызывающие переключатели.
    Таблица 14.1. Разрешенное содержимое таблиц дескрипторов.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
	  GDT		       LDT		     IDT
  (Таблица глобальных  (Таблица локальных  (Таблица дескрипторов
     дескрипторов)	  дескрипторов) 	прерываний)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 Дес- Дескрипторы Code	 Дескрипторы Code
крип- сегмента (32и16)	 сегмента (32и16)
торы  Дескрипторы Data	 Дескрипторы Data
      сегмента (32и16)	 сегмента (32и16)
      Дескрипторы Code	 Дескрипторы Code
      сегмента (32и16)	 сегмента (32и16)
      Дескрипторы сег-
      мента  состояния
      задач (32и16бит)
      Дескриптор  таб-
      лицы   локальных
      дескрипторов
Пере- Вызывающий  пере-  Вызывающий  пере-
клю - ключатель в 32- и  ключатель в 32- и
чате- 16-  битные  Code  16-  битные  Code
ли    сегменты		 сегменты
      Переключ. задач	 Переключ. задач     Переключ. задач
					     Переключатель задач
					     в 32- и  16- битные
					     Code сегменты
					     Переключ.прерываний
					     в 32- и  16- битные
					     Code сегменты
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Системные регистры, содержащие таблицу дескрипторов.
    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   В  области  памяти,	 как   известно,   содержится	таблица
дескрипторов, в то  время  как	один  из  регистров  защищенного
режима	 процессора   80386,   показанный   в	 таблице    14.2
устанавливается на базовый  адрес  и  границу,	описываемую  как
область памяти.
			    - 148 -
		   Инициализация GDTR и IDTR.
		    ДДДДДДДДДДДДДДДДДДДДДДДДД
   GDTR и IDTR являются регистрами только  защищенного	режима,
загружаемые  линейными	адресами.  Таким  образом  эти	регистры
служат	в  качестве  привязки  структуры  таблицы   дескрипторов
защищенного режима.
    Таблица 14.2 Системные регистры для таблиц дескрипторов.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Системный
 регистр		     Функция
  80386
  GDTR		    Размещает и ограничивает GDT
  LDTR		    Размещает и ограничивает LDT
  IDTR		    Размещает и ограничивает IDT
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   GDTR  и  IDTR  инициализируются  сходным  образом.  Линейный
базовый  адрес	и  граница  записываются  в  каждый  регистр   с
использованием	LGDT  и  LIDT  инструкций  соответственно.   Эти
инструкции описывают  16-битное  значение  границы,  позволяющее
иметь размер таблицы вплоть до 64  Кбайт,  и  32-битный  базобый
адрес,	разрешающий  располагать  базу	в  любом  месте   внутри
линейного адресного пространства.
			4 Гбайта линейного адресного пространства
			31	24 23	  16 15      8 7	0
	      FFFFFFFFh ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДї
GDT может содержать	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
следующее:		ГДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДґ
-переключатели прерываний
-переключатели ловушек	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
-переключатели задач ЪДДЕцдескр. N Nч8141   і	      і 	і
		     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     і	ідескр.N-1і	    і	      і 	і
   Линейный адрес:   і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
 база+ограничитель   і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     і	ідескриптор 1	    і	      і 	і
Линейный адрес:база  і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     і	ідескриптор 0	    і	      і 	і
		     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
	    ЪДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДц і
	    і	     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ 00000000h
	    і	     і	АДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДЩ
	    і	     і	 4 Гбайта линейного адресного пространства
	    і	     АДДДДДДДДДДДДДДДДДДї
47	    і		     16 15	і	     0
ГДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДЕДДДДДДДДБДДДДДДДДДДДДґ
і			       і    16-битный	     і
іGDT 32-битный линейный адрес  іGDТ  ограничитель    і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ
 GDTR системный регистр (в 80386)
    Рис.14.9 GDTR регистр,размещающий GDT в линейном адресном
	     пространстве.
			    - 149 -
			4 Гбайта линейного адресного пространства
			31	24 23	  16 15      8 7	0
	      FFFFFFFFh ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДї
IDT может содержать	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
следующее:		ГДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДґ
-переключатели прерываний
-переключатели ловущек
-переключатели задач	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     ЪДДЕцперекл.N Nч255			і
		     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     і	 перек.N-1і				і
   Линейный адрес:   і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
 база+ограничитель   і	ГДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДґ
		     і	 перекл.1
Линейный адрес:база  і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     і	 перекл.0
		     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
	    ЪДДДДДДДДЕДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДц і
	    і	     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ 00000000h
	    і	     і	АДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДЩ
	    і	     і	 4 Гбайта линейного адресного пространства
	    і	     АДДДДДДДДДДДДДДДДДДї
47	    і		     16 15	і	     0
ГДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДЕДДДДДДДДБДДДДДДДДДДДДї
і			       і    16-битный	     і
іIDT  32-битный линейный адрес іIDТ  ограничитель    і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ
 IDTR системный регистр (в 80386)
    Рис.14.10 IDTR регистр,размещающий IDT в линейном адресном
	      пространстве.
15	      0   31			  0 15	       0
ГДДДДДДДДДДДДДї   ГДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДД
ДДДї
і	      і   і			    16-битный	  Атрибуты  і
і  LDTR       ГДДці32-битный линейный адрес ограничитель GDP CPL 
CRAі
АДДДДДДДДДДДДДЩ   АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДДЩ
    Рис.14.11 Регистр дескриптора кэш связанный с регистром LDTR.
		      Инициализация LDTR.
		       ДДДДДДДДДДДДДДДДДД
   LDTR иницициализируется путем записи  значения  селектора  в
регистр  с  использованием  инструкции	LLDT.  Селектор   должен
указывать на LDT дескриптор такой,  как  показано  на  рис.14.4,
который содержит необходимый базовый адрес  и  границу.  Регистр
кэш  дескриптора,  соответствующий   регистру	LDTR   сохраняет
внутреннюю копию полей LDT дескриптора как показано  на  рисунке
14.11.	Использованием	инструкции   LLDT   для   загрузки   LDT
дескриптора, LDT может быть  бомещен  в  любом	месте  линейного
адресного пространства и может достигать 64 Кбайт, как	показано
на рис.14.12.
   LDT дескриптор содержится в GDT. Таким  образом,  необходимо
создать  образ	GDT   и   инициализировать   GDTR   сначала.   С
установленной GDT  инструкция  LLDT  может  быть  выполнена  для
загрузки LDTR посредством размещения LDT.
			    - 150 -
       Использование переключателей для перенаправления.
	ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Перенаправление посредством вызывающих переключателей.
   Вызывающие переключатели могут быть помещены только в GDT  и
LDT. Перенаправление через вызывающий переключатель (call  gate)
выполняется с любой межсегментной инструкцией CALL (код операции
9Ah), которая описывает вызывающий переключатель как принимающий
операнд. Селектор  вызывающего	переключателя  используется  как
принимающий операнд  инструкции.  Такая  инструкция  CALL  может
передать управление либо  в  другой  сегмент  code  с  таким  же
текущим уровнем привилегий, либо в другой code сегмент	с  более
высоким   уровнем   привилегий.   Таким   образом,    вызывающий
переключатель	может	расширить   возможности    межсегментной
инструкции CALL для доступа к сегментам на более высоком  уровне
привилегий.
   Инструкции CALL всегда оставляют адрес следующей  инструкции
в стеке, таким образом, чтобы инструкция  RET  могла  продолжить
исполнение основной программы. Эта  концепция  остается  в  силе
даже если инструкция CALL указывает вызывающий переключатель.
   Когда вызывающий переключатель передает управление  сегменту
на текущем уровне привилегий, CS и EIP	сохраняются  в	стек  на
текущем  уровне.   Когда   вызывающий	переключатель	передает
управление на уровень более высокой  привилегии,  то  как  адрес
стека, так и адрес инструкции сохраняются в стек на  принимающем
(с большей привилегией) уровне, как показано на рис. 14.13.
			      ДДДДДДДДДДДДДДДДДї
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і				і	       щ	      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і				іSS селектор для стека более  і
і0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0і   низкого уровня.	      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і
і	   ESP для стека более низкого уровня.		      і і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і
і				іСS селектор для кодов более  і і
і0 0*0 0 0 0 0 0 0 0 0 0 0 0 0 0і   низкого уровня.	      і і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і
і	   EIP для кодов более низкого уровня.		      і щ
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
					       ш
			     ДДДДДДДДДДДДДДДДДДЩ
    Рис.14.13	32-битный стек верхнего уровня после исполнения
	      инструкции CALL с нижнего уровня через вызывающий
	      переключатель.
   Перенаправление через вызывающий переключатель с  параметром
		  самокопирования (Autocopy).
   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Предположим, что вызывающая	программа   помещает   значения
параметров  в  свой   стек   перед   исполнением   межсегментной
инструкции CALL, указывающей на вызывающий  переключатель.  Если
управляющий переключатель передает управление на  более  высокий
уровень, то параметры не находятся в стеке вызванной  программы.
Вызванной программе может  оказаться  затруднительным  прочитать
параметры из стека низшего уровня. Наиболее приемлемым	решением
			    - 151 -
является  активизирование  опциона   параметра	 самокопирования
(parameter autocopy) с каждым вызывающим переключателем.
   Вызывающий переключатель, как показывает рис.14.5,  включает
поле  счетчика	слов  (word  count  field),  которое   принимает
значения от  0	до  31.  Счетчик  слов,  n,  тридцатидвухбитного
вызывающего  переключателя  указывает  процессору  80386,   если
переход  из  привилегии  в   привилегию   происходит   благодаря
перенаправлению вызывающего переключателя, копировать n  двойных
слов из стека низшего уровня в стек  более  высокого  уровня.  С
этого времени вызванная программа находит соответствующее  число
параметров в своем стеке. Рис.14.14 иллюстрирует самокопирование
параметров из стека низкого  уровня  в	принимающий  стек  более
высокого уровня.
   В конце исполнения вызванной программы она должна отработать
инструкцию RETn, где n,число байт, которые должны  быть  удалены
из  стека. Оно должно соответствовать числу байт,  скопированных
вызывающим переключателем. Указанное  число  байт  удаляется  из
стека низшего уровня, когда появляется команда RET. Стек высшего
уровня предполагается пустым  после  возврата  (RET)  на  низшем
уровне. Таким образом, после возврата, исходное состояние SS:ESP
сохраняется в TSS, определяя верхушку стека верхнего уровня  для
следующего раза, когда потребуется стек.
   Возможность	параметра  самокопирования  не	работает,  если
счетчик слов равен 0. Запишите нули в поле счетчика  слов,  если
параметр самокопирования не требуется с каким-	либо  вызывающим
переключателем.
   Перенаправление через отладочные переключатели (trap  gates)
   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
	 и переключатели прерываний (interrupt gates)
	 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Отладочные переключатели и  переключатели  прерываний  могут
быть помещены только  в  IDT.  Перенаправление	с  помощью  этих
переключателей может быть выполнено с помощью  любой  инструкции
программного   прерывания   (INTn,INTO,BOUND),	  исключительной
ситуации или с помощью	аппаратных  прерываний.  Перенаправление
для прерывания или исключительной ситуации  n  происходит  через
переключатель в численной позиции  n  IDT.  Такой  переключатель
ведет в другой code сегмент либо на текущем  уровне  привилегий,
либо на более высоком. Таким  образом  отладочный  переключатель
или переключатель прерываний  расширяет  возможности  инструкций
программных прерываний для доступа к сегментам с большим уровнем
привилегий.
   Отладочный переключатель и переключатель прерываний имеют те
же самые стековые эффекты, что и вызывающий переключатель. Когда
вызывающий переключатель передает управление  на  уровень  более
высокой привилегии, то как адрес стека, так и  адрес  инструкции
сохраняются  в	стек  на  принимающем  (с  большей  привилегией)
уровне,  как  показано	на  рис.  14.15.   Однако,   возможность
использования параметра самокопирования не обеспечивается.
	   Перенаправление через переключатели задач.
	    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Переключатели задач могут располагаться  в  GDT,LDT,  или  в
IDT. В случае GDT или LDT, переключатель задач может быть указан
межсегментной инструкцией CALL. В случае  размещения  в  IDT  он
может	указываться   инструкцией    программного    прерывания,
исключительной ситуацией или аппаратным прерыванием.
   Таким же способом как описано выше,	где  бы  ни  указывался
переключатель  задач,  он  заставляет  процессор   автоматически
выполнить переключение задач (см. главу 15).
			    - 152 -
    ДДДДДДДДДДДї	  ДДДДДДДДДДДДДДї
	       і			і
ГДДДДДДДДДЕДДДДЕДДДДґ	 ГДДДДДДДДДЕДДДДЕДДДДґ
і	  і    щ    і	 і	   і	щ    і
ГДДДДДДДДДЕДДДДДДДДДґ	 ГДДДДДДДДДЕДДДДДДДДДґ
і   Параметр 1	    і	 і0 0...0 0іSS селек.і
і		    і	 і	    для стекаі
ГДДДДДДДДДЕДДДДДДДДДґ	 ГДДДДДДДДДЕДДДДДДДДДґ
і		    і	 іЕSP для стека болееі
і   Параметр 2	    і	 інизкого   уровня   і
ГДДДДДДДДДЕДДДДДДДДДґ	 ГДДДДДДДДДЕДДДДДДДДДґ
і   Параметр 3	    і	 і    Параметр 1     і
ГДДДДДДДДДЕДДДДДДДДДґ	 ГДДДДДДДДДЕДДДДДДДДДґ
і   Параметр 4	    і	 і    Параметр 2     і
ГДДДДДДДДДЕДДДДДДДДДґ	 ГДДДДДДДДДЕДДДДДДДДДґ
і   Параметр 5	    і	 і    Параметр 3     і
ГДДДДДДДДДЕДДДДДДДДДґ	 ГДДДДДДДДДЕДДДДДДДДДґ
і   Параметр 6	    і	 і    Параметр 4     і
АДДДДДДДДДДДДДДДДДДДЩ	 ГДДДДДДДДДЕДДДДДДДДДґ
		ш	 і    Параметр 5     і
		і	 ГДДДДДДДДДЕДДДДДДДДДґ
      ДДДДДДДДДДЩ	 і    Параметр 6     і
			 ГДДДДДДДДДЕДДДДДДДДДґ
			 і	    СS селек.і
			 і0 0...0 0ідля кодові
			 ГДДДДДДДДДЕДДДДДДДДДґ
			 іЕIP для кодов болееі
			 інизкого   уровня   і
			 АДДДДДДДДДБДДДДДДДДДЩ
					ш
			 ДДДДДДДДДДДДДДДЩ
    Рис.14.14  32-битный стек нижнего и верхнего уровней после
исполнения инструкции САLL с нижнего уровня через вызывающий
переключатель с параметром самокопирования.
			    ДДДДДДДДДДДДДДДДДДДї
31			      16 15	       і	      0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і				і	       щ	      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і				іSS селектор для стека более  і
і0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0і   низкого уровня.	      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і	   ESP для стека более низкого уровня.		      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і				іСS селектор для кодов более  і
і0 0*0 0 0 0 0 0 0 0 0 0 0 0 0 0і   низкого уровня.	      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і	   EIP для кодов более низкого уровня.		      і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
					       ш
			     ДДДДДДДДДДДДДДДДДДЩ
  Рис.14.13    32-битный стек верхнего уровня после программного
или аппаратного прерывания на нижнем уровне через отладочный
переключатель или переключатель прерываний.
			    - 153 -
			 ГЛАВА 15
			Многозадачность
			 ДДДДДДДДДДДДДДД
    Эта  глава	содержит  описание  возможностей   многозадачной
работы процессора,  которые  включают  способность  обслуживания
одновременно  нескольких  задач  и  переключения  между  ними  с
использованием обычных инструкций, таких, как  переходы,  вызовы
подпрограмм, прерывания и возвраты из них.  В  процессоре  80386
каждая	из  задач  имеет  свой	блок  состояния  задачи  и  свое
виртуальное адресное пространство.
    Хотя в архитектуре	процессора  однозначно	определено,  что
составляет задачу, это слово часто  используется  в  значительно
более общем смысле. В компьютерной терминологии  слово	"задача"
часто ассоциируется  со  словами  "работа"  или  "пользователь".
Такое определение может соответствовать определению  задачи  для
процессора  80386.  В  понимании  80386  задача  -  это   вполне
определенная единица, тесно связанная с архитектурой процессора.
Каждая задача процессора 80386 имеет свое адесное пространство и
блок состояния задачи.
    Система 80386 присваивает или не присваивает каждой "работе"
или "пользователю" реальную задачу  процессора  взависимости  от
необходимости  выделения   отдельного	виртуального   адресного
пространства и блока статуса задачи. Если разделение необходимо,
то  архитектура  80386	поддерживает   его   с	 помощью   своих
многозадачных возможностью. Если не все задачи требуют	реальной
индивидуальности, то распределение ресурсов может взять на  себя
операционная система.
    Даже если не присваивать каждой программе отдельную  задачу,
типичная система состоит из нескольких задач всвязи с тенденцией
повышения  надежности  ситстемы   по   сравнению   однозадачной.
Например,  программы   обслуживания   исключительных   ситуаций,
сообщающие о серьезных	неполадках  системы,  должны  составлять
отдельную задачу.
	   Виртуальное адресное пространство задачи.
	    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Полный  виртуальный  адрес	включает  селектор  сегмента   и
смещение. В защищенном режиме селектор (рис.15.1)  содержит  бит
TI   (индикатор   таблицы),   определяющем   где   располагается
дескриптор - в	GDT  (ТI=0)  или  в  активной  в  данный  момент
(связанной с выполняющейся  задачей) LDТ  (ТI=1).
    Возможность доступа к GDТ и к своей  LDТ  позволяет   каждой
задаче обращаться к глобальным об`ектам (сегменты,задачи,и  др.)
виртуального  адресного  пространства  и  к   своему   адресному
пространству. Выбор между  таблицами  осуществляется  с  помощью
бита ТI селектора.
15		7		 0
ГДВДВДВДВДВДВДВДЕДВДВДВДВДВДДВДДДґ
і і і і і INDEX і і і і і іTIіRPLі
АДБДБДБДБДБДБДБДБДБДБДБДБДБВДБДВДЩ
	 INDEX		   і   і
	   і		   і   АДДцRPL (запрашиваемый
 ЪДДДДДДДДДЩ		   і   уровень привилегии):
 АцИндекс выбирает	   і00-не влияет на возможности доступа
      один из 8192	   і01-доступ не выше первого уровня
  дескрипторов или	   і10-доступ не выше второго уровня
   записей таблицы	   і11-доступ не выше третьего уровня
			   і
			   АДДцИндикатор таблицы
			       0-дескриптор в GDT
			       1-дескриптор в LDT
			Рис.15.1 Селектор в защищенном режиме.
			    - 154 -
			 Состояние задачи
			 ДДДДДДДДДДДДДДДД
    В системе 80386 каждая задача имеет сегмент состояния  задачи
- область памяти, содержащая состояние регистра задачи	и  другую
информацию. Без сегмента состояния задачи задача  не  существует,
так как не определено адресное пространство и ее состояние.  ТSS,
в фиксированном формате, содержит  состояние  регистра	задачи	и
другую информацию, такую как начальные значения указателей  стека
для уровней привилегии 2, 1,  0,  значение  для  LDТR  и  таблицу
разрешенного ввода/вывода.
    32-разрядная  ТSS,	как  показано  на  рис.  15.2,	 содержит
не только  32-битное  расширение  всех	восьми	регистров  общего
назначения, но и два новых сегмента данных FS  и  GS.  Она  также
включает  указатель  на   массив   бит	 -   карту   разрешенного
ввода/вывода. Каждая ТSS имеет бит  Т,	служащий  для  отладочных
целей - он позволяет генерировать трэп сразу при входе	в  задачу
(см. гл. 17 для более подробного описания  встроенных  отладочных
средств процессора 80386).
    Для сравнения, на  рис.  8.11  приведена  структура  ТSS  при
минимальном  использовании  ее	возможностей.  В  случае  простой
системы, не использующей многозадачный режим, ТSS  содержит  лищь
начальное значение указателя стека нулевого уровня привилегии,	а
остальные поля заполнены нулями.
    На рис.  15.3  показана  16-битная	ТSS,  совместимая  с  ТSS
процессора 80286. Она содержит только набор 16-битных регистров и
в ней отсутствует таблица разрешенного ввода/вывода.
			 Дескриптор ТSS
			  ДДДДДДДДДДДДДД
    Новая ТSS вводится путем записи дескриптора  в  GDТ.  Форматы
таких дескрипторов показаны на рис. 15.4.
    Подробное описание полей дескрипторов приведены в  главе  14.
Поля дескриптора  ТSS  во  многом  аналогичны  полям  дескриптора
кодового сегмента, за исключением одного бита:
 В (busy), показывает занята ли в данный момент задача (1  -  да,
0 - нет). В простых системах с защитой бит В должен  всегда  быть
установлен  в  1.  Более  полное  описание  функций  этого   бита
приведено на стр. 186-187.
    Дескрипторы  ТSS  могут  располагаться  только  в	GDТ.   Их
количество однозначно определяет количество задач в  системе:  по
одному дескриптору на задачу.
			 Ловушки задач
			  ДДДДДДДДДДДДД
    Они могут быть помещены в любую из	таблиц	дескрипторов:GDТ,
LDТ, или IDТ. Ловушка содержит селектор дескриптора ТSS в  GDТ	и
поэтому используется в качестве  перенацеливающего  механизма  на
пути к задаче.
    Ловушка  задачи  имеет  только  один  формат,  показанный  на
рис. 15.5. Она может относится и к 16-, и к  32-битной	ТSS,  так
как ловушка взаимодействует лишь с дескриптором.  Ловушка  задачи
не содержит  смещения,	как  ловушки  16-  и  32-битных  вызовов.
Смещение для нее определяется начальным значением ЕIР,	как  и	в
самой ТSS, поэтому необходимость в смещении отпадает.
			    - 155 -
						ГДДДДДДДДДДДДДДД*
						 1 1 1 1 1 1 1 1
ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДї
і65535**********і***************і***************і**********65504і
і65503**********і***************і***************і**********65472і
і65471**********і***************і***************і**********65440і
і65439**********і***************і***************і**********65408і
;				;				;
і127		і		і		і	      96і
і95		і		і		і	      64і
і63		і		і		і	      32і
і31		і		і		і	       0ічД*
;				;				;  і
;		*ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
;		і		;				;
ісмещение 0-15			і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і100
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і	selektor LDY		і96
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і	selektor GS		і92
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і	selektor FS		і88
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і	selektor DS		і84
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і	selektor SS		і80
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і	selektor CS		і76
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і	selektor ES		і72
і			       EDI				і68
і			       ESI				і64
і			       ESY				і60
і			       ESP				і56
і			       EBX				і52
і			       EDX				і48
і			       ECX				і44
і			       EAX				і40
і			     EFLAGS				і36
і			       EIP				і32
і			       CR3				і28
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і    SS-для уровня=2		і24
і			   ESP-для уровня=2			і20
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і    SS-для уровня=1		і16
і			   ESP-для уровня=1			і12
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і    SS-для уровня=0		і8
і			   ESP-для уровня=0			і4
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і				і0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
  Рис.15.2  32-битный сегмент состояния задачи.
		   Переход от задачи к задаче
		    ДДДДДДДДДДДДДДДДДДДДДДДДДД
    Одной  из  наиболее  мощных   возможностей	 80386	 является
возможность  перехода  от  задачи  к  задаче  с  помощью  обычных
инструкций. Такой переход обычно  называют  переключением  задач.
80386  позволяет  переключать	задачи	 с   помощью   инструкций
межсегментной	передачи   управления:	 межсегментный	 переход,
межсегментный вызов, инструкции прерываний INТ 3, INТ n,  INТО	и
ВОUND, IRЕТ. Сами инструкции  ничем  не  отличаются  от  обычных.
Переключение задач  происходит	если  указать  селектор  ТSS  или
ловушки задачи в поле операнда-приемника инструкции.
			    - 156 -
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і	  selektor-для LDTR	і	 selektor-для DS	і40
і	  selektor-для SS	і	 selektor-для CS	і36
і	  selektor-для ES	і		DI		і32
і		SI		і		SP		і28
і		SP		і		BI		і24
і		DX		і		CI		і20
і		AX		і	       FLAGS		і16
і		IP		і	 SS-для уровня=2	і12
і	  SP-для уровня=2	і	 SS-для уровня=1	і8
і	  SP-для уровня=1	і	 SS-для уровня=0	і4
і	  SP-для уровня=0	і				і0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 Рис.15.3. 16-битный сегмент состояния задачи.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і		і      A предел і		і		і 4
ісег.базы 31..24іG 0 0 V	іP DPL 0 1 0 В 1ісег.базы 23..16і
і		і      L 19...16і		і		і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    TSS  базы 15.....0 	і  TSS	    ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 а) 32-битный дескриптор сегмента состояния задачи.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0іP DPL 0 0 0 B 1іTSS базы 23..16і
 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і     TSS базы 15.....0 	і      TSS  ограничитель 15...0 і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 в) 16-битный дескриптор сегмента состояния задачи.
  Рис.15.4. Дескриптор для 32-битного и 16-битного сегмента
состояния задачи.
31	      24 23	      16 15	       8 7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0іP DPL 0 1 1 1 1іTSS базы 23..16і
 4
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іСелектор дескриптора сегмента состояния задачи 		і 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис.15.5. Состояние для 32-битного и 16-битного ТSS.
    Задачи,участвующие	в  переключении  называются  уходящая	и
приходящая. ТSS текущей задачи	указан	в  регистре  задачи  (ТR)
80386. ТSS приходящей задачи указан  в	инструкции,  инициирующей
переключение задач.
    Процессор записывает состояние регистров  уходящей	задачи	в
текущей ТSS, указанную в регистре ТR, а новое состояние регистров
считывает из ТSS приходящей задачи, указанной в инструкции.
     Записывамая информация 32-битной ТSS уходящей задачи:
  Восемь 32-битных регистров общ. назначения
  Шесть сегментных регистров
  32-битный регистр флагов
     Записывамая информация 16-битной ТSS уходящей задачи:
  Восемь 16-битных регистров общ. назначения
  Четыре сегментных регистра
  16-битный регистр флагов
			    - 157 -
     Считываемая информация 32-битной ТSS приходящей задачи:
  Восемь 32-битных регистров общ. назначения
  Шесть сегментных регистров
  32-битный регистр флагов
  Содержимое LDТR для создания LDТ (свое адресное пространство)
  СR3,	для  создания  страничного  директория	(свои  страничные
						   таблицы)
  Т-бит, проверка необходимости отладочного прерывания
     Считываемая информация 16-битной ТSS приходящей задачи:
  Восемь 16-битных регистров общ. назначения
  Четыре сегментных регистра
  16-битный регистр флагов
  Содержимое LDТR для создания LDТ (свое адресное пространство)
    Приходящая задача использует новые значения для LDТR  и  СR3,
то есть каждая задача может использовать свою  LDТ  и  директорий
таблиц страниц.  Однако,  предполагается,  что	задача	не  будет
менять	эти  значения,	поэтому  изменения  не	записываются   по
окончанию задачи.
      Передача управления через сегменты состояния задачи
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Переключение  задач  через	ТSS  является  наиболее   простым
способом  переключения,  так  как  селектор  в	 таблице   указан
непосредственно.  Однако  программа,  производящая  переключение,
должна иметь соответствующий уровень  привилегии  для  доступа	к
сегменту состояния задачи.
	    Передача управления через ловушки задачи
	     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Результат переключения с помощью ловушек  такой  же,как  и	в
предыдущем  случае.  Передача	управления   производится   путем
указания селектора  ловушки  задачи,  который,	в  свою  очередь,
содержит селектор ТSS. Такой косвенный метод переключения требует
дополнительно около  15  тактов,  но  архитектурные  преимущества
этого метода делают его предпочтительным. Среди этих  преимуществ
возможность использования большого DРL и переключения из задачи с
низким уровнем приоритета. Кроме того в отличие от ТSS ,  ловушки
могут располагаться не только в GDТ.  Размещение  ловушки  в  IDТ
позволяет  прерываниям	и  исключительным  ситуациям  производить
переключение задач. Если ловушка размещена в LDТ, то  переключать
задачи	будут  только  использующие  его  программы.   Ограничить
использование ТSS  в  GDТ,доступной  всем  задачам,  можно  путем
задания очень малого  размера  DРL,  обычно  0,  так  что  только
программы нулевого упровня привилегии смогут обращаться к нему.
			 Вложенные задачи
			 ДДДДДДДДДДДДДДДД
    В каждый момент времени активизирована только одна	задача	и
задачи, вызванные ей. Активные задачи отмечаются битом В в каждом
из дескрипторов ТSS. Таблица 15.1 иллюстрирует изменение  бита	В
при переключении задач.
    Межзадачный  вызов	и   инструкции	 программных   прерываний
поддерживаются наличием поля  обратной	связи  в  ТSS.	При  этом
селектор вызвавшей задачи  записывается  в  поле  обратной  связи
ТSS вызванной задачи.
			    - 158 -
						 Таблица 15.1
	     Изменение бита активности задачи
================================================================
Инструкция, исп.       Влияние на бит В      Влияние на бит В
для перекл. задач      уходящей задачи	     приходящей задачи
================================================================
Межсегментный	       Сброс в 0. Переход    Устанавливается в 1.
переход 	       не приводит к вло-    Приходящая задача
		       женности задач,	     всегда активна.
		       поэтому уходящая
		       задача становится
		       неактивной
Межсегментный	       Остается в 1. Вызов   Устанавливается в 1.
вызов		       приводит к вложен-    Приходящая задача
		       ности задач. Уходя-   всегда активна.
		       щая задача остается
		       активной и ждет
		       инструкции IRЕТ.
Программные прерыва-   Также, как и для      Также, как и для
ния (INТ3,INТ n,       вызова		     вызова
INТО, ВОUNDS) и
аппаратные прерывания
Инструкция IRЕТ        Сбрасывается в 0.     Остается в 1.
		       Инструкция означает   Вызвавшая задача
		       окончание работы      была и остается
		       задачи и возврат в    активной.
		       вызвавшую задачу.
================================================================
						Таблица 15.2
    Взаимодействие поля обратной связи ТSS и бита NТ ЕFLАG
=================================================================
Инструкция,   Влияние на    Влияние на поле	   Влияние на бит
производящая  поле обр.св.  обр. связи при-	   NТ рег.  ЕFLАG
переключение  уход. задачи  ходящей задачи
=================================================================
Межсегментный Не влияет     Уст. на нулевой сек-   Сбрасывается в
переход 		    тор. Задача не вызы-   0. Задача не
			    валась - возвращать-   вложена
			    ся некуда
Межсегментный Не влияет     Уст. по селектору ТSS  Устанавливает-
вызов			    вызвавшей задачи. Это  ся в 1. Прихо-
			    позволяет организовать дящая задача
			    вложенность задач и    является вло-
			    возможность возврата.  женной
Аппаратные и  Не влияет     Также, как и для вы-   Устанавливает-
программные		    зова		   ся в 1. Прихо-
прерывания					   дящая задача
						   является вло-
						   женной
Инструкция    Не влияет     Не влияет. Если при-   Уст. по флаго-
IRЕТ			    ходящая задача вложен- вому регистру
			    ная, существующее со-  в ТSS приходя
			    ответствие сохраняется щей задачи
=================================================================
			    - 159 -
    Инструкция	IRЕТ  производит  возврат  в  вызвавшую   задачу.
Возврат производится  в  случае  установленного  флага	вложенной
задачи (NТ) регистра ЕFLАG по  информации  поля  обратной  связи.
Отметим, что инструкция работает нормально  в  случае,	когда  NТ
равен 0. Состояние бита может быть изменено только  программой	с
уровнем привилегии 0 (см. табл. 15.2).
			 Г Л А В А  16
			 ДДДДДДДДДДДДД
    В этой главе описывается, как 80386 обрабатывает прерывания и
исключительные ситуации в защищенном режиме и режиме виртуального
8086.
    В этой главе также описываются  входы  прерывания  и  таблица
дескрипторов прерываний (IDT), векторный механизм защищенного ре-
жима   (PROTECTED).  Обзор  этих  элементов  подобен  обзору  для
действительного режима (REAL) в гл.6.
    Описан каждый тип исключительных  ситуаций.  Эта  глава  дает
всестороннее описание каждого типа исключительных ситуаций, сверх
описания  в  гл.  6.  Для каждой исключительной ситуации описание
включает его причины в защищенном режиме, ограниченный ряд причин
в действительом режиме или режиме  виртуального  8086,	и  важные
связи  между исключительными ситуациями и всеми другими аспектами
архитектуры 80386. Понимание этих связей  позволяет  программисту
написать подпрограммы, которые могут производить обработку исклю-
чительных ситуаций при условии наихудшего случая.
    Следует  отметить,	что ответы 80386 на прерывания и исключи-
тельные ситуации в защищенном режиме в большинстве случаев те  же
самые,	что  и	в  действительном режиме. Поэтому полезно возвра-
титься к гл. 6. Отличия защищенного  режима  заключаются  в  нес-
кольких дополнительных типах исключительных ситуаций, которые об-
наруживаются в защищенном режиме, и для обработки которых таблица
IDT  защищенного режима правильнее, чем таблицы векторов действи-
тельного режима.
	      Прерывания и исключительные ситуации
	       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Как прерывания, так и исключительные ситуации приостанавлива-
ют текущую операцию 80386 и переключают ее на выполнение обслужи-
вающих подпрограмм для обработки  прерываний  или  исключительных
ситуаций.  Различие между прерываниями и исключительными ситуаци-
ями заключается в различие начальных точек. Прерывания начинаются
с внешнего события, поступающего с указанных выводов 80386, тогда
как исключительные ситуации начинаются с  условия  или	проблемы,
обнаруженной внутри 80386.
    80386  отвечает на прерывание и исключительные ситуации в за-
щиженном режиме или решение виртуального 8086 идентично. В  любом
случае,  80386 обрабатывает события в защищенном режиме (заверше-
ние режима виртуального 8086 при получении синала прерывания  или
исключительной	ситуации  описано  в  гл.12). В дальнейшем в этой
книге описания прерываний и исключительных ситуаций в  защищенном
режиме будут также применимы к режиму виртуального 8086 за исклю-
чением специально упомянутых случаев.
	Обнаружение прерываний и исключительных ситуаций
	ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Как  и  в  действительном режиме, прерывания и исключительные
ситуации распознаются в зоне границы между командами,  после  за-
вершения выполнения одной команды, но перед началом следующей ко-
манды.	Это  упрощает работу программиста, особено когда он имеет
дело с исключительной ситуацией, т.к. программист  не  вникает	в
нюансы	внутренних  регистров 80386 и стадий конвейера. 80386 вы-
полняет все требуемые операции	по  обслуживанию  и  обрабатывает
			    - 160 -
прерывание или исключительную ситуацию точно на границе команды.
    На	одной и той же границе команды могут одновременно возник-
нуть несколько прерываний и исключительных ситуаций.  Одновремен-
ные события обсуждаются в конце этой главы (стр.	      ).
			   Прерывания
			    ДДДДДДДДДД
    Прерывания	поддерживаются аппаратным механизмом, позволяющим
80386 иметь дело с внешней средой, которая обычно  включает  раз-
личные внешние события, происходящие с неопределенными интервала-
ми.  О	появлении  таких событий может быть анализировано 80386 с
одного из двух контактов: INTR (вход маскируемого прерывания) или
NMI (вход немаскируемого прерывания). Эти  два	входных  контакта
80386  определены  для	приема	сигналов прерывания. Контакт INTR
указывает активное прерывание, когда он находится в состоянии вы-
сокого уровня. Этот сигнал является программно маскируемым,  пре-
рывание разрешено, когда EFLAG IF бит установлен в 1 и запрещено,
когда EFLAG IF сброшен в 0.
    Контакт NMI указывает на активное прерывание восходящим фрон-
том, и не требуется, чтобы высокий уровень оставался на этом кон-
такте в течение некоторого длительного периода NMI не маскируется
программно,  оно  всегда  разрешено. NMI обычно резервируется для
наиболее критических прерываний, в условиях, когда прерывание не-
избежно, таких как сбои питания или некорректируемые отказы памя-
ти.
		      Аппаратура прерываний
		      ДДДДДДДДДДДДДДДДДДДДД
    Внутри систем 80386 много периферийных устройств,  таких  как
диски,	таймеры,  принтеры  и другие, требующие прерываний. Такие
прерывания обычно направляются на  вход  INTR  80386.  Т.к.  есть
только	один  вход  INTR, прерывания из многих устройств проходят
через логику, формирующую один сигнал  INTR,  разделяющий  многие
устройства.  Чтобы  быстро достигнуть ответа на прерывание, жела-
тельно немедленно идентифицировать источник прерывания.
    Когда активизируется INTR, немедленная идентификация выполня-
ется через специальный цикл, в течение которого 80386 читает ком-
бинацию с младшего байта шины данных. Такая комбинация (в  диапа-
зоне от 00 до FF) называется комбинацией вектора и обеспечивается
чипом  контроллера прерываний (8259 А или эквивалентом). Комбина-
ция прерывания указывает 80386 на конкретное устройство, располо-
женное в памяти, переключатель, через который 80386 выбирает пер-
вую команду подпрограммы обработки прерываний.
    Когда активизируется NMI,	     специальный цикл не выполня-
ется, и вектор не считывается. Вектор не  считывается,	поскольку
NMI  автоматически  ассоциируется  с вектором прерывания 02 Н. Во
время такого прерывания вектор 02h определяется для  обслуживания
как  вектор критического немаскируемого прерывания; при NMI 80386
передает управление подпрограмме обработки прерывания по  вектору
02 Н.
		 Таблица дескрипторов прерывания
		 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Все  прерывания  векторизованы  через  массив переключателей,
расположенных в памяти, IDT. Эта таблица начинается  с	линейного
адреса, указывающео регистр таблицы дескрипторов прерывания. Таб-
лица состоит из 256 переключателей, индексированных как 0 "перек-
лючатель  - 255" переключатель, с соответствующей причине возмож-
ной величиной вектора прерывания. Важно: аппаратный вектор преры-
вания должен иметь номер в диапазоне от 32 до 255. Векторы преры-
вания от 0 до 31 зарезервированы для  указанных  Intel	категорий
исключительных	ситуаций.  Прерывание 32, следовательно, перенап-
равляется с использованием переключателя 32, прерывание 33 -  че-
			    - 161 -
рез переключатель 33, 34 - через переключатель 34 и т.д., до пре-
рывания 255.
 Таблица дескрипторов прерывания приводится на рис.16.1
    Замечание: архитектура персонального компьютера IBM  нарушает
вышеописанные  указания, т.е. аппаратные прерывания не используют
номера векторов от 0 до 31. Основная система ввода/вывода РС ини-
циализирует контроллер прерываний 8259 А с использованием  векто-
ров  8-15  для аппаратных прерываний. Потенциально это может при-
вести к конфликтным  использованиям  различных	номеров  векторов
прерывания.
    IDT  может	содержать переключатели прерывания, переключатели
ловушек и переключатели задач. Переключатели прерываний и ловушек
передают управление сегменту кода внутри текущей задачи,  отличие
состоит  в  том, что переключатели прерываний вызывают сброс IF в
0, в то время как переключатели ловушек не влияют на TF. Сошлемся
на гл.8 для использования дальнейшей информации об этих типах пе-
реключателей в IDT. Переключатели задач передают управление в со-
вершенно другую задачу, как указано переключателем, и  выполнение
начинается  в CS: местоположение EIP указывается TSS задачи. Сош-
лемся на гл. 15 для дальнейшего обзора пересылок через переключа-
тели задачи.
			4 Гбайта линейного адресного пространства
			31	24 23	  16 15      8 7	0
	      FFFFFFFFh ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
IDT может содержать	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
следующее:		ГДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДґ
-переключатели прерываний					і
-переключатели ловущек						і
-переключатели задач	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     *ДДґцперекл.N Nч255			і
		     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     і	іперек.N-1і				і
   Линейный адрес:   і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
 база+ограничитель   і	ГДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДґ
		     і	іперекл.1				і
Линейный адрес:база  і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
		     і	іперекл.0				і
		     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
	    ЪДДДДДДДДЕДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДц і
	    і	     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ
	    і	     і	ГДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДґ 00000000h
	    і	     і	АДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДЩ
	    і	     і	 4 Гбайта линейного адресного пространства
	    і	     АДДДДДДДДДДДДДДДДДДї
47	    і		     16 15	і	     0
ГДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДЕДДДДДДДДБДДДДДДДДДДДДї
і    32-битный линейный адрес  і    16-битный	     і
іIDT   (база)		       іIDТ		     і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ
 IDTR системный регистр (в 80386)
    Рис.16.1 Таблица дескрипторов прерывания защищенного режима.
			    - 162 -
	Привилегии переключателя для вектора прерывания
	ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Когда в аппаратуре происходит прерывание, DPL упомянутого пе-
реключателя не имеет значения. DPL переключателя не контролирует-
ся во время аппаратных прерываний; прерывания всегда имеют доступ
к переключателю для передачи управления  корректирующей  подпрог-
рамме прерывания или задаче.
    Заметим,  что  это	принуждает к использованию переключателей
прерывания и  переключателей  ловушек,	однако:  если  происходит
ссылка на переключатель прерывания или переключатель ловушек, DPL
целевого сегмента программы должно быть меньше или равно CPL, так
что  инструкция IRET может быть использована в конце подпрограммы
возврата управления в прерванную программу (Если происходит ссыл-
ка на переключатель  задач,  то  привилегированный  уровень  кода
обслуживания не принуждает CPL, когда происходит прерывание, т.к.
нет никаких отношений между привилегированным уровнем в различных
задачах).
		     Исключительные ситуации
		     ДДДДДДДДДДДДДДДДДДДДДДД
    Исключительная  ситуация - событие, препятствующее завершению
следующей команды. Это	состояние  обнаруживается  внутри  80386.
Т.к.  исключительная  ситуация	препятствует завершению следующей
команды, это проблематичное состояние. Вдобавок это событие может
обслуживаться подпрограммой обработки исключительных ситуаций.
    Каждому типу исключительных ситуаций  присваивается  номер	в
диапазоне от 0 до 31, этот диапазон резервируется Intel для прис-
воения исключительным ситуациям. 80386 признает 15 типов исключи-
тельных ситуаций, каждому из которых присвоен определенный номер.
Оставшиеся номера не используются, но они резервируются для прис-
воения в будущих процессорах Intel.
    Несколько  типов исключительных ситуаций обнаруживается 80386
в защищенном режиме. Исключительные ситуации могут возникать  при
проверке  на уровне сегмента, страничном контроле или по разнооб-
разным причинам, таким как несуществующий ход операции или  отка-
зочная	исключительная	ситуация. Таблица 16. 1  иллюстрирует все
15 типов исключительных ситуаций, суммируя все случаи каждого ти-
па.
    Для сравнения, таблица 16. 1  также показывает точный  список
исключительных	ситуаций, обнаруживаемых в действительном режиме.
В таблице представлены точные данные, некоторый  весьма  странный
код  действительного  режима  вызывает	необходимость активизации
исключительной ситуации 8,9,12 и 13 в действительном режиме.  Ре-
альный	  список    исключительных   ситуаций	включает   только
0,1,2,3,4,5,6,7 и 16.
    Возникновение   нескольких	 типов	 исключительных  ситуаций
действительного ожидания,  если  система  использует  особенности
виртуальной памяти, работает в мультизадачном режиме или эмулиру-
ет сопроцессор. Например, в системах виртуальной памяти от раза к
разу происходит отказ страницы. Если система работает в мультиза-
дачном	режиме	или эмулирует 80287 или 80387 сопроцессоры, может
иметь место ситуация  недоступности  сопроцессора  (ситуация  71,
когда  код  операции  сопроцессора  близок к тому, который должен
быть выполнен.
		Ситуации ошибок и ситуации ловушек
		ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Любая исключительная ситуация может быть атрибутом определен-
ной  команды.  В  зависимости от типа ситуации, однако, она может
сигнализировать непосредственно перед или после ответственной ко-
манды. Когда сигнализация  происходит  перед  командой,  ситуация
квалифицируется  как  ошибка; когда сигнализация происходит после
команды, ситуация квалифицируется как ловушка.
			    - 163 -
    Большинство исключительных ситуаций, особенно те, которые яв-
ляются причиной событий, препятствующих выполнению команды,  сиг-
нализируют  как  ошибки,  перед выполнением команды. Только ситу-
ации, сигнализирующие как ловушки, после  команды,  известны  как
отладочные исключительные ситуации	   (одношаговый флаг TF и
точка  прерывания  по  адресу  данных), а также ситуации являются
причиной переключения задач, где возникает проблема благодаря то-
му, что следующая задача и переключаемая задача уже имеют место.
						     Таблица 16.1
	  Вектор исключительной ситуации, присваиваемый
		      в защищенном режиме
НННННННСННННСННННННННСНННННННННННННННННННСНННННННННННСННННННННННН
       іНо- і  Имя   і			 іТакже обна-іТакже обна-і
       імер і(и тип) і			 іруживается іруживается і
       іси- і	     і	   Описание	 ів действи- і		 і
       ітуа-і	     і			 ітельном ре-і	8086/88  і
       іции і	     і			 і   жиме    і		 і
ДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДД
    1  і 2  і	3    і	      4 	 і     5     і	   6	 і
ДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДД
Ситуа- і 0  іОшибка  іПопытка деления на і    Да     іДа, однако 
ции,   і    іделения і0, осуществленная  і	     і8086 CS=IP і
обна-  і    і(ошиб-  іпри DIV или IDIV	 і	     іуказывает  і
ружи-  і    іка)     ікомандах		 і	     іна команду і
ваемые і    і	     і			 і	     іпосле DIV  і
8086/88і    і	     і			 і	     іили IDIV	 і
       і 1  іОдноша- іЕсли TF флаг в FLAGі    Да     іДа, но 8086
       і    іговая   іустановлен в 1, этаі	     іимеет местоі
       і    іработа  іситуация имеет мес-і	     ітолько TF  і
       і    і(лову-  іто  после следующейі	     іфлаг. Он неі
       і    ішка)    ікоманды. Отладочныеі	     іимеет отла-і
       і    іТочка   ірегистры	могут оп-і	     ідочных ре- і
       і    іпреры-  іределить	место ос-і	     ігистров	 і
       і    івания,  ітанова,  что  такжеі	     і		 і
       і    іопре-   іявляется	 причинойі	     і		 і
       і    іделяе-  іситуации 1.	 і	     і		 і
       і    імая от- іВыполняется   одно-і    Да     і	 Да	 і
       і    іладоч-  ібайтная команда ос-і	     і		 і
       і    іными    ітанова (cch).  Про-і	     і		 і
       і    ірегист- іцессор  инициализи-і	     і		 і
       і    ірами    ірует ситуацию 3	 і	     і		 і
       і    і(ошибка і			 і	     і		 і
       і    іили ло- і			 і	     і		 і
       і    івушка)  і			 і	     і		 і
       і 4  іTNTO    іЕсли флаг перепол- і    Да     і	 Да	 і
       і    і(ло-    інения   установлен і	     і		 і
       і    івушка)  і(OF),    процессор і	     і		 і
       і    і	     іинициализирует си- і	     і		 і
       і    і	     ітуацию 4		 і	     і		 і
       і 5  іBOUND   іЕсли обнаружено	 і    Да     і	 Да	 і
       і    і(ловуш- інарушение границ,  і	     і		 і
       і    іка)     іпроцессор инициа-  і	     і		 і
       і    і	     ілизирует ситуацию  і	     і		 і
       і    і	     і5 		 і	     і		 і
       і    і	     і	    - 164 -	 і	     і		 і
ДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДД
    1  і 2  і	3    і	      4 	 і     5     і	   6	 і
ДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДД
Ситуа- і 6  іНедопус-іНедопустимый КОП	 і    Да     іНет, 8086  і
ции,   і    ітимый   іслужит причиной то-і	     іобращается і
также  і    ікод опе-іго, что 80386 ини- і	     іс недопус- і
обнару-і    ірации   іциализирует ситуа- і	     ітимым КОП  і
живае- і    і(ошибка)іцию 6		 і	     ікак с NOP  і
мые в  і    і	     і			 і	     і(пустой	 і
дейст- і    і	     і			 і	     іоперацией) і
витель-і    і	     і			 і	     і		 і
ном ре-і    і	     і			 і	     і		 і
жиме.  і    і	     і			 і	     і		 і
80286/ і 7  іСопро-  іКОП сопроцессора,  іДа, если   іНет, чтобы 
80386  і    іцессор  ікогда сопроцессор  іEM флаг в  іэмулировать
       і    інедосту-іне присутствует,	 іCRO сбро-  ісопроцессорі
       і    іпен     іслужит причиной	 ішен в 0    ів системах і
       і    і(ошибка)іинициализации про- і	     і8086 коман-і
       і    і	     іцессором ситуации  і	     іды INTn	 і
       і    і	     і7. Эмуляция команд і	     ідолжны бытьі
       і    і	     ісопроцессора разре-і	     ізаменены к і
       і    і	     ішена,если флаг EM  і	     іОП сопро-  і
       і    і	     ів CR0 сброшен в 0  і	     іцессора	 і
       і    і	     і			 і	     іINTn иници-і
       і    і	     і			 і	     іализирует  і
       і    і	     і			 і	     іобработку  і
       і    і	     і			 і	     іситуации n і
       і 8  іДвойная іПока осуществляетсяіДа, но не- і	 Нет	 і
       і    іошибка  іпопытка доступа к  іобходимо   і		 і
       і    і(ошибка)іподпрограмме обра- інетипичное і		 і
       і    і	     іботки прерывания	 іиспользова-і		 і
       і    і	     іили исключительной іние командыі		 і
       і    і	     іситуации, обнаружи-іLIDT для   і		 і
       і    і	     івается исключитель-ісокращения і		 і
       і    і	     іная ситуацию	 іпредела    і		 і
       і    і	     і			 ітаблицы    і		 і
       і    і	     і			 іпрерываний і		 і
       і 9  іНаруше- іОперанд для арифме-іДа, но     іНет, 8086  
       і    іние гра-ітического сопроцес-ітолько еслиіпозволяет  
       і    іницы    ісора частично вне  іматобеспе- іоперациям  
       і    іоперан- іграницы (конечной) ічение "за- іпереходить 
       і    ідом со- ісегмента		 івертывает" ів начало   і
       і    іпроцес- і			 іоперанд во-ісегмента	 і
       і    ісора    і			 ікруг грани-і		 і
       і    і(ошибка)і			 іцы 64 К    і		 і
       і 12 іИсключи-іОперанд в сегменте іДа, но     іНет, 8086  
       і    ітельная істека (SS) весь илиітолько еслиіпозволяет  
       і    іситуацияічастично вне грани-іматобеспе- іоперандам  
       і    ісегментаіцы сегмента, или	 ічение "за- іпереходить і
       і    істека   істек не присутству-івертывает" ів начало   
       і    і(ошибка)іет, или неправиль- іоперанд во-ісегмента	 і
       і    і	     іный уровень приви- ікруг грани-і		 і
       і    і	     ілегий, или нет сег-іцы 64 К    і		 і
       і    і	     імента данных, или  і	     і		 і
       і    і	     інекоторые другие	 і	     і		 і
       і    і	     іпричины, перечис-  і	     і		 і
       і    і	     іленные подробно	 і	     і		 і
       і    і	     івместе с ситуацией і	     і		 і
       і    і	     і12		 і	     і		 і
       і    і	     і	    - 165 -	 і	     і		 і
ДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДД
    1  і 2  і	3    і	      4 	 і     5     і	   6	 і
ДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДД
Ситуа- і 13 іСитуацияіОперанд в CS, SS,  іДа, но     іНет, 8086  
ции,   і    іобщей   іDS, ES, FS, GS	 ітолько,еслиіразрешает  і
также  і    ізащиты  івесь или частично  іматобеспе- іоперации	 і
обнару-і    ів CS,SS,інаходится за грани-ічение "за- іперемещать-
живае- і    іDS, ES, іцей сегмента, или  івертывает" іся в начало
мые в  і    іFS или  ісегмент не сущест- іоперанд во-ісегмента	 і
80286/ і    іGS      івует, или непра-	 ікруг грани-і		 і
80386  і    і(ошибка)івильный уровень	 іцы 64 К    і		 і
дейст- і    і	     іпривилегий, или в  і	     і		 і
витель-і    і	     ісегменте нет данныхі	     і		 і
ном ре-і    і	     іили некоторые дру- і	     і		 і
жиме   і    і	     ігие причины, пере- і	     і		 і
       і    і	     ічисленные подробно і	     і		 і
       і    і	     івместе с описанием і	     і		 і
       і    і	     іситуации 13	 і	     і		 і
       і 16 іОшибка віВход ERROR # 80386 іДа, если   іНет, об	 і
       і    івычисле-ібыл активирован	 івход ERROR іошибках	|і
       і    іниях со-і(вероятно сопроцес-і# 80386 ак-ісопроцессор
       і    іпроцес- ісором)		 ітивирован  і8087 сигна-і
       і    ісора    і			 івыходом    ілизирует	 і
       і    і(ошибка)і			 іERROR #    і8086 через і
       і    і	     і			 і80387      іпрерывания і
       і    і	     і			 і	     і(обычно	 і
       і    і	     і			 і	     ічерез 8259Аі
       і    і	     і			 і	     іно в архи- і
       і    і	     і			 і	     ітектурах	 і
       і    і	     і			 і	     іперсональ- і
       і    і	     і			 і	     іных компью-і
       і    і	     і			 і	     ітеров черезі
       і    і	     і			 і	     івход NMI)  і
Ситуа- і 10 іОшибка ві80386 обнаруживает іНет, здесь іНет, здесь 
ции,   і    ісегментеіошибку в содержимоміневозможно іневозможно 
обнару-і    ізадачи/ іTSS, когда выполня-іавтоматиче-іавтоматиче-
живае- і    ісоедине-іет переключение за-іское пере- іское пере- 
мые    і    іния     ідач. Если в TSS	 іключение   іключение	 і
только і    і(ошибка іуходящей задачи	 ізадач      ізадач	 і
в защи-і    іили не- іошибка, эта ситуа- і	     і		 і
щенном і    іпредви- іция квалифицируетсяі	     і		 і
режиме і    іденная  ікак ошибка. Если в і	     і		 і
       і    іситуа-  іTSS приходящей за- і	     і		 і
       і    іция)    ідачи ошибка, эта	 і	     і		 і
       і    і	     іситуация квалифици-і	     і		 і
       і    і	     іруется как ловушка і	     і		 і
       і 14 іОтказ   іВключена страничнаяіНет, невоз-іНет, в 8086
       і    істраницыіадресация, и необ- іможен в    інет	 і
       і    і(оишбка)іходимая страница неідействи-   і		 і
       і    і	     ісуществует, или не-ітельном ре-і		 і
       і    і	     іправильные привиле-іжиме	     і		 і
       і    і	     ігии, или неправиль-і	     і		 і
       і    і	     іные правила выборкиі	     і		 і
НННННННПННННПННННННННПНННННННННННННННННННПНННННННННННПННННННННННН
			    - 166 -
	     Распознавание исключительных ситуаций
	     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Когда  команда  вызывает  исключительную  ситуацию,  ситуация
всегда распознается. Нет метода маскирования исключительных ситу-
аций, и маскирование нежелательно.
    Хотя исключительные ситуации возбуждаются  и  распознаются	в
течение  выполнения команды, они возникают для пользователя и об-
рабатываются на границе команды, потому что состояние 80386 всег-
да сохраняется, как если бы оно было перед командой. Таким  обра-
зом,  для  ситуаций  ошибки,  где  ситуация  возникает	перед от-
ветственной командой, CS: EIP указывает  команде  (включая  байты
префиксов),  что  является  причиной исключительной ситуации. Это
идеальный случай для подпрограмм обслуживания,	которые  пытаются
скорректировать  ситуацию,  т.к.  возможно  возобновить программу
только выполнением команды IRET как последней команды подпрограм-
мы обслуживания исключительной ситуации.
		 Возможность перезапускаемости
		 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Ошибочные команды 80386 или сопроцессора  вполне  могут  быть
перезапущены  для  всех типов исключительных ситуаций, кроме слу-
чая, когда нарушается граница операнда сопроцессора (ситуация  3)
и,  при определенных условиях, в ситуации ошибки в сегменте зада-
чи/состояния (ситуация 10). При правильно построенной ОС этих не-
явных случаев можно легко избежать, что дает  возможность  полной
перезапускаемости. Состояние, необходимое для того, чтобы служить
причиной  нарушения границы операнда сопроцессора, также неявно и
неудобно, так что ОС может  легко  предотвратить  его  появление.
Подробно  см. в гл.16. Ситуация ошибки в сегменте задачи - состо-
яния не допускает повторного запуска, если он служит причиной то-
го, что полностью не существует TSS для целевой задачи при перек-
лючении задач ОС может предодотвратить это состояние, не допуская
пересечения попадания на границу страниц фиксированной порции лю-
бого  TSS  (фиксированная  часть  -  часть, на которую происходит
ссылки во время переключения задач). Подробнее см. гл.16.  Состо-
яние полного несуществования TSS, конечно, перезапускаемо.
    Т.о. аппаратура 80386 превышает требования к возможностям пе-
резапускаемости в используемых ОС.
	    Коды ошибок для исключительных ситуаций
	    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    В защищенном режиме типы исключительных ситуаций, которые от-
носятся к определенному сегменту или переключателю, являются при-
чиной  кода ошибки, который будет записан в стек подпрограммы об-
работки  исключительных  ситуаций  или задачей. Следует отметить,
что в действительном режиме никакие типы исключительных  ситуаций
не  записывают в стек код ошибки, даже не типы, которые вырабаты-
вают код ошибки в защищенном режиме. Никакие прерывания не  выра-
батывают код ошибки.
    Код ошибки, записываемый в стек в защищенном режиме, является
32-битной величиной, когда программа обработки исключительных си-
туаций	находится в 32-битном сегменте кода, и является 16-битной
величиной, когда программа обработки исключительных ситуаций  на-
ходится  в  16-битном сегменте кода.Ожидается, конечно, что почти
все новое программное обеспечение  защищенного режима будет охва-
тывать 32-битный код. В любом случае только 16	бит  кода  ошибки
несут  существенную информацию. Для всех типов исключительных си-
туаций, кроме ситуации двойной ошибки (ситуации) и ситуации отка-
за страницы (ситуации 14), рис. 16.2  иллюстрирует  форматы  кода
ошибки.  Там также показано, как в коде ошибки записаны только 16
неопределенных бит, когда этот код записывается в 32-битный стек.
Существуют также примеры, когда код ошибки, записываемый в  стек,
только 0, UUUU0000h (см. подробное описание набора команд, прило-
жение В).
			    - 167 -
    32-битный формат кода ошибки
31		23		15		7		0
ЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕ
і і і і і і і і і і і і і і і і і			  іTі іEі
і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і	      ИНДЕКС	  і іXіXі
і і і і і і і і і і і і і і і і і			  іIі іTі
АДБДБДБДБДБДБДБДБДБДБДБДБДБДБДБДБДДДДДДДДДДДДДДДДДДДДДДДДДБДБДБДЩ
  16-битный формат кода ошибки
15		7		0
ГДДДДДДДДДДДДДДДЕДДДДДДДДДВДВДВДґ
і			  іTі іEі
і	      ИНДЕКС	  і іXіXі
і			  іIі іTі
АДДДДДДДДДДДДДДДДДДДДДДДДДБВБВБВЩ
			   і і і   внешний бит
			   і і АДц 0-выполняемая программа является
			   і і	     причиной исключительной
			   і і	     ситуации.
			   і і	   1-происходит аппаратное
			   і і	     (т.е. внешнее)прерывание
			   і і	     и попытка вызова подпрограммы
			   і і	     его обслуживания служит
			   і і	     причиной исключительной ситуации
			   і і	   бит IDТ
			   і АДДДц 0-дескриптор или переключатель в
			   і	     GDТ или LDТ служит причиной
0:бит кода ошибки	   і	     исключительной ситуации,и его
  неопределен.		   і	     бит индикатора таблицы и индекс
			   і	     даются в ТI и области индекса в
			   і	     коде ошибки.
			   і	   1-переключатель в IDТ служит при-
			   і	     чиной исключительной ситуации,и
			   і	     количество переключателей (0-255)
			   і	     дается в области индекса в коде
			   і	     ошибки.
			   і	   индикатор таблицы (имеет значение
			   і	   только, когда IDТ=0)
			   АДДДДДц 0-на индекс ссылается дескриптор
				     или переключатель в GDТ.
				   1-на индекс ссылается дескриптор
				     или переключатель в IDТ.
    Рис.16.2 32-битный и 16-битный общий формат кода ошибки.
	  Формат кода ошибки схож с форматом селектора. Он содер-
жит поле индекса и TI бит. Однако позиции младших значащих бит, а
не содержащая RPL, содержит I бит и EXT бит:
    1.	EXT  (внешний)	бит  устанавливается  в  1, если причиной
исключительной ситуации является событие, внешнее по отношению	к
программе.  Внешнее событие - прерывание, которое является причи-
ной исключительной ситуации (ошибки), когда 80386 пытается  пере-
дать  управление  подпрограмме обработки прерываний. Стоит только
выполниться первой команде драйвера,  последующие  исключительные
ситуации  являются  причиной того, что обрабатывающая программа -
конечно, внутренняя (вызываемая программными обеспечением) исклю-
чительная ситуация. EXT сброшен в  0,  если  выполняющееся  прог-
раммное обеспечение ответственно за исключительную ситуацию..
    2.	I  (IDT) бит устанавливается в 1, если на индексную часть
кода ошибки ссылается переключатель в IDT. Это происходит в  слу-
чае,  если переключатель в IDT ответственен за исключительную си-
туацию (например, если ссылающийся переключатель отмечен как  не-
существующий (Р=0) или переключателя нет вообще). Бит I сбрасыва-
ется  в  0, если на индексную часть кода ошибки ссылается элемент
данных в CDT или LDT.
			    - 168 -
    3. TI (индикатор таблицы) бит  имеет  значение  только  когда
I=0,  указывая,  что на  индексную часть ссылается GDT или LDT. В
этом случае с TI указывает,  что  на  индекс  ссылается  или  GDT
(TI=0), или LDT (TI=1), точно также, как TI определен в селекторе
режима защиты. Все вышеописанное применимо ко всем исключительным
ситуациям,  кроме  двойной  ошибки (ситуации 8) и ошибки страницы
(ситуация 14). Во время ситуации 8 код ошибки просто все нули.	В
случае	 отказа   страницы   код   ошибки,проиллюстрированный  на
рис.16.3, разработан для того, чтобы вызвать необходимую програм-
му  обработки страниц. См. рис. 16.3.
	   32-битный формат кода ошибки при отказе страницы
31		23		15		7		0
ЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕ
і і і і і і і і і і і і і і і і і			  іTі іEі
і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і	      ИНДЕКС	  і іXіXі
і і і і і і і і і і і і і і і і і			  іIі іTі
АДБДБДБДБДБДБДБДБДБДБДБДБДБДБДБДБДДДДДДДДДДДДДДДДДДДДДДДДДБДБДБДЩ
15		7		    0
ГДВДВДВДВДВДВДВДЕДВДВДВДВДВДДДВДДДВДґ
і0і0і0і0і0і0і0і0і0і0і0і0і0іU/SіW/RіPі
АДБДБДБДБДБДБДБДБДБДБДБДБДБДВДБДВДБВЩ
			    і	і  і   бит наличия
			    і	і  АДц 0-причина ошибки была в
			    і	і	 несуществовании страницы.
			    і	і      1-причина ошибки была в
			    і	і	 нарушении защиты границы
			    і	і	 страницы (точно причина
			    і	і	 указана в других битах).
			    і	і      бит зп/чт
			    і	АДДДДц 0-ошибка произошла во время
			    і		 чтения.
			    і	       1-ошибка произошла во время
			    і		 записи.
			    і	       бит пользователя/супервизор
			    АДДДДДДДДц 0-операция,служащая причиной
					 ошибки,происходила,когда
					 процессор функционировал
					 на уровне супервизора.
				       1-операция,служащая причиной
					 ошибки,происходила,когда
					 процессор функционировал
					 на пользовательском уровне.
    Рис.16.3 32-битный и 16-битный код ошибки при отказе страницы
		   Другая информация об ошибках
		   ДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Во время ситуации отказа страницы (ситуация 14), полезная ин-
формация об ошибках содержится в регистре CR2 80386, который  со-
держит	линейный  адрес, служащий причиной ошибки. Выставляя этот
адрес, программа обработки ситуации отказа  страницы  может  сос-
латься на элемент директории страницы, таблицы страницы.
    Во	время ситуации отладки (ситуация 1), регистр DR6  содер -
жит полезную информацию о причинах ситуации, как  описано  в  гл.
17.
			    - 169 -
						     Таблица 16.2
		 Коды ошибки режима защиты
НННННСННННННННННННННННННННННННННННННННСНННННННННННННННННННННННННН
Н»
Номері		 Ситуация	      іКод ошибки  в стеке  обра- є
     і				      іботчика исключает ситуацию є
     і				      і     в режиме защиты	  є
НННННШННННННННННННННННННННННННННННННННШНННННННННННННННННННННННННН
Н№
 0   іОшибка деления		      і 	 Нет		  є
 1   іСитуация отладки		      і 	 Нет		  є
 3   іКоманда останова		      і 	 Нет		  є
 4   іКоманда INTO, если переполнение і 			  є
 5   іКоманда BOUNP, если нарушение   і 	 Нет		  є
     іграниц			      і 			  є
 6   іНедопустимый код операции       і 	 Нет		  є
 7   іНедоступен сопроцессор	      і 	 Нет		  є
 8   іДвойная ошибка		      і Да, но код ошибки - все   є
     і				      і нули			  є
19   іПереполнение сегмента	      і Да, как на рис. 16.2	  є
     іоперанда сопроцессора	      і 			  є
10   іОшибка сегмента задачи/	      і Да, как на рис. 16.2	  є
     ісостояния 		      і 			  є
11   іСегмент, загруженный в CS,      і Да, как на рис. 16.2	  є
     іDS, ES или GS не присутст-      і 			  є
     івует			      і 			  є
12   іСегмент, загруженный в SS       і Да, как на рис. 16.2	  є
     іне присутствует или нару-       і 			  є
     ішение границы SS		      і 			  є
13   іНарушение общей защиты	      і Да, как на рис. 16.2	  є
14   іОтказ страницы - не присут-     і Нет, информация об	  є
     іствует или ошибка использо-     і ошибке находится в ре-	  
     івания			      і гистре CR2		  є
16   іОшибка арифметического	      і Нет, выполняется FNSTENV  є
     ісопроцессора		      і команда (команда сохра-   є
     і				      і нения состояния сопро-	  є
     і				      і цессора), чтобы получить  є
     і				      і указатель на неудачную	  є
     і				      і команду 		  є
НННННПННННННННННННННННННННННННННННННННПНННННННННННННННННННННННННН
Нј
Замечание: коды ошибки не вырабатываются в действительном режиме.


Яндекс цитирования