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



 

Часть 4

			    - 104 -
			   РАЗДЕЛ 9
		  Система страничной памяти.
		  ДДДДДДДДДДДДДДДДДДДДДДДДДД
     Исчерпывающая поддержка страничной памяти встроена в 80386.
 Наиболее известное достоинство такой организации -  это  полная
поддержка  страничной	виртуальной   памяти.	 Она   позволяет
программисту использовать больший об`ем оперативной памяти,  чем
физически реализованной в  системе.   Полный  перечень	полезных
возможностей, которые дает  страничный	диспетчер  памяти  (MMU)
включает:
     1) адресную защиту для простых защищенных систем, наподобие
тех, которые описаны в разделе 8.
     2)   страничную   виртуальную    память,	 предоставляющую
программисту большее  адресное	пространство,  чем  имеющееся  в
действительности в системной оперативуной памяти.
     3)  реализованную	на   кристалле	 стандартизацию   защиты
операционной  системы  и  программного	обеспечения  виртуальной
памяти.
     4) реализацию  на	кристалле,  снижающую  загрузку  шины  и
ликвидирующую межкристальные задержки распространения сигналов.
     5) реализацию на кристалле, имеющую малые затраты, так  как
используется  приблизительно  только  10%  площади   кремниевого
кристалла,   снижающая	 дополнительную   стоимость   страничной
виртуальной памяти практически до пренебрежимо малой величины.
     Система страничной памяти может быть включена при работе  в
защищенном   режиме.	Включение   или   отключение   механизма
страничной памяти выполняется  программно  и  только  из  уровня
привилегии 0.
		     Страничная структура.
		   ДДДДДДДДДДДДДДДДДДДДДДД
     Страничная   структура    разбивает    линейное	адресное
пространство на 1...048576 страниц по 4096 байт каждая. Рис. 9.1
иллюстрирует   концепцию   страничного	 пространства	 памяти.
Виртуальное адресное  пространство  показано  слева,  физическое
адресное пространство -  справа.   Единый  размер  всех  страниц
позволяет загружать любую требуемую виртуальную страницу в любую
физическую страницу.  Это является ключевой причиной  того,  что
страничная    организация    является,	  в    общем	 случае,
предпочтительным способом реализации виртуальной памяти.
     Как показано на рис. 9.1, пространство  виртуальной  памяти
обычно значительно больше, чем имеющееся пространство физической
памяти, что  является  результатом  физических	и  экономических
ограничений.  Поэтому, в  каждый  момент  времени  только  часть
страниц  виртуальной  памяти  размещена  в  физической	 памяти.
Страницы,  отсутствующие  в  физической  памяти,   как	 правило
хранятся в устройстве вторичной памяти, такой, как жесткий диск.
     Страничная  система  с  подкачкой	по  требованию	 (demand
paging),   как	 иногда   называют   страничную   память,   явно
подчеркивает  тот  факт,  что  пользовательская   программа   не
осведомлена    о    процессах,	  связанных    со     страничной
организацией.Термины paging и demand paging являются  синонимами
и означают, что программа  может  использовать	все  виртуальное
пространство  по  своему  усмотрению.	Архитектура   процессора
генерирует  прерывание	по  исключительной  ситуации  при  любой
попытке доступа к странице, которая отсутствует в  памяти.   Это
прерывание  позволяет	программе-супервизора	вмешаться,   при
необходимости, невидимо для программы пользователя, для загрузки
всех необходимых  страниц,  по	мере  того,  как  они  требуются
программе  пользователя.   Под	управлением  супервизора  старые
страницы из физической памяти сохраняются на диске до того,  как
новые страницы загружаются в нее.
			    - 105 -
      4-Гбайта линейного	    Физическое адресное
   адресного пространства		 пространство
   поделенного на страницы	   на страницы поделенное
       по 4096 каждая			 по 4096 каждая
FFFFFFFFh ГДДДДДДДДДДДДДґ    FFFFFFFFh ГДДДДДДДДДДДДДґ
	   4К страница			4К страница
	  ГДДДДДДДДДДДДДґ	       ГДДДДДДДДДДДДДґне реализованные
	   4К страница			4К страница
	  ГДДДДДДДДДДДДДґ	       ГДДДДДДДДДДДДДґ
		 .			      .
	  ГДДДДДДДДДДДДДґ	       ГДДДДДДДДДДДДДґ
	   4К страниц			4К страниц	 конец
	  ГДДДДДДДДДДДДДґ	       ГДДДДДДДДДДДДДґреализованной
	   4К страниц			4К страниц     физической
	  ГДДДДДДДДДДДДДґ	       ГДДДДДДДДДДДДДґ	 памяти
		 .			      .
	  ГДДДДДДДДДДДДДґ	       ГДДДДДДДДДДДДДґреализованные
	   4К страниц			4К страниц
	  ГДДДДДДДДДДДДДґ	       ГДДДДДДДДДДДДДґ
	   4К страниц			4К страниц
	  АДДДДДДДДДДДДДЩ00000000h     АДДДДДДДДДДДДДЩ00000000h
   Рис.9.1 Страничная виртуальная память и физическая память.
	  Включение/выключение страничной адресации.
	ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Разряд 31 регистра управления CR0 (см. рис. 9.2)  управляет
включением/выключением	страничной  адресации.	  Этот	 разряд,
называемый PG, включает страничную адресацию при установке в 1 и
отключает ее при установке в 0.
     В защищенном режиме инструкция управления	процессором  MOV
CR0,  используется  для  записи  в  CR0  (см.  табл.  3.9).
Поскольку эта  инструкция  может  быть	выполнена  в  защищенном
режиме, страничная адресация может быть включена  или  выключена
только в этом режиме. Страничная адресация остается включенной в
режиме "Виртуальный  8086"  (см.  раздел  12),  который  конечно
является предпочтительным, поскольку  это  позволяет  программам
работать в  режиме  "Виртуальный  8086",  как  часть  системы  с
виртуальной памятью.
	   Выравнивание границ страниц и сегментов.
	 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Границы страниц следуют  с  регулярным  интервалом  в  4096
байт. Границы сегментов полностью произвольны и зависят от  базы
и ограничения каждого сегмента.  Таким образом,  строго  говоря,
границы страниц и сегментов не зависят друг от друга и не должны
выравниваться между собой.  Сегменты определяются одним  набором
таблиц (GDT и LDT), в то время как страницы определяются  другим
набором:  таблицами  страниц.	Однако,  в   целях   оптимизации
производительности,  маленькие	сегменты  (4096  байт  и  менее)
следует выравнивать  так,  чтобы  каждый  располагался	в  одной
странице.  Это применимо, в частности, к таким малым  сегментам,
как  сегмент  состояния   задачи,   описанный	в   разделе   8.
Выравнивание в одной  странице	гарантирует,  что  при	загрузке
одной страницы загрузится весь сегмент.
31		23		15		7		0
ЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕ
іРі і і і і і і і і і і і і і і і і і і і і і і і і і іЕіТіЕіМіРі
іGі0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0і0іTіSіMіPіEі
СR0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
   Рис.9.2 Бит РG в регистре управления СR0.
			    - 106 -
       Сравнение уровня привилегии страниц и сегментов.
      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Уровни привилегии страниц называются  "пользовательский"  и
"супервизорский".  Уровни привилегии для  страниц  имеют  номера
0,1,2 и 3. Уровень 3 соответствует "пользовательскому", 0,1,2  -
супервизорскому.   Рис.  9.3  иллюстрирует  соотношение  уровней
привилегии страниц и сегментов.
    Рис.9.3  Соответствие сегментного и страничного уровня
	      DPL, указанный в		      интерпретируемый
	      дескрипторе сег-		   на страничном уров-
	      мента			   не
	      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Самый приви-	    0			     Супервизор
легированный
		    1			     Супервизор
Наименее при-	    2			     Супервизор
вилегированный	    3			     Пользователь
	      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
	    Процесс трансляции страничного адреса.
	  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Процесс страничной  трансляции  представляет  собой  замену
старших  20  разрядов	32-разрядного	линейного   адреса-номер
виртуальной страницы на 20-разрядную  величину-номер  физической
страницы.   Страничная	трансляция  является  последним   этапом
процесса вычисления адреса.  Этот этап иллюстрирован в	описании
обобщенного процесса адресации на рис. 4.2 и 7.2.
		      Таблицы трансляции.
		    ДДДДДДДДДДДДДДДДДДДДДДД
     Результат трансляции (то есть номер физической  трансляции)
определяется по таблицам  трансляции,  расположенным  в  памяти.
80386 автоматически читает таблицы трансляции, когда необходимо,
при трансляции виртуальных адресов операндов в память.
     Таблицы трансляции организованы в	двухуровневую  иерархию.
Таблицей  корневого  уровня  является  таблица	каталога  таблиц
страниц или, просто, каталог  таблиц  страниц,	содержащий  1024
элемента, каждый из которых указывает на таблицу нижнего  уровня
иерархии.  Таким образом, до 1024 таблиц страниц нижнего  уровня
поддерживается каталогом.
     В	 отличие   от	одной	линейной   таблицы   трансляции,
иерархическая  организация  позволяет  избежать   резервирования
большой непрерывной зоны линейных адресов для  хранения  таблицы
трансляции.   Иерархическая   организация   также   поддерживает
разбросанные  деревья	преобразования	 адресов,   где   только
несколько строк каталога таблиц  страниц  указывают  на  таблицы
страниц.  Иерархия позволяет присваивать атрибуты защиты строкам
каталога для 4М-байтной гранулярности или строкам таблиц страниц
для 4К-байтной (на одну страницу) гранулярности.
     Рис. 9.4 иллюстрирует эти таблицы. Регистр  управления  CR3
"заякоривает" табличную структуру,  поскольку  он  указывает  на
таблицу каталога таблиц страниц. Каждая строка таблицы	каталога
указывает  на  страницу,  содержащую  таблицу  страниц.  В  свою
очередь, каждая строка таблицы	страниц  указывает  на	страницу
физической памяти.
			    - 107 -
		Строка каталога таблиц страниц
	      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Каталог таблиц страниц содержит 1024 строки. Каждая  строка
указывает на таблицу страниц через ее физический базовый адрес и
другую информацию.
     Строка  каталога,	показанная  на	рис.  9.5.  определяется
следующим образом:
   1.  Поле  "адрес  таблицы  страниц"  определяет  старшие   20
разрядов физического базового адреса таблицы страниц.  Поскольку
таблица страниц  выровнена  по	границе  страницы  в  физической
памяти, т.е. по 4096-байтовой границе, ее  младшие  12	разрядов
базового адреса-нули.
						    1048576 страниц
						   физической памяти
						 (по 4096 байт каждая)
						       31	 0
						       ЪДДДДДДДДДґ
			     1024 таблиц страниц       ГДДДДДДДДДґ
			     (по 4096 байт каждая)     ГДДДДДДДДДґ
						       ГДДДДДДДДДґ
						 ЪДДДДці	 і
						 і     АДДДДДДДДДЩ
				   31	     0	 і     31	 0
				   ГДДДДДДДДДґ	 і     ГДДДДДДДДДґ
				   і	     ГДДДЩ     ГДДДДДДДДДґ
				   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
	 Каталог таблиц страниц    ГДДДДДДДДДґ	       ГДДДДДДДДДґ
	 (1024 строки)		   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
			     ЪДДДДці	     і	 ЪДДДДці	 і
	       (4096 байт)   і	   АДДДДДДДДДЩ	 і     АДДДДДДДДДЩ
	       31	 0   і	   31	     0	 і     31	 0
	       ГДДДДДДДДДґ   і	   ГДДДДДДДДДґ	 і     ГДДДДДДДДДґ
	       і	 ГДДДЩ	   і	     ГДДДЩ     ГДДДДДДДДДґ
	       ГДДДДДДДДДґ	   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
	       ГДДДДДДДДДґ	   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
	       ГДДДДДДДДДґ	   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
	       і	 ГДДДДДДї  і	     ГДДДДДї   ГДДДДДДДДДґ
	       ГДДДДДДДДДґ	і  ГДДДДДДДДДґ	   і   ГДДДДДДДДДґ
       ЪДДДДДДці	 ГДДДї	АДці	     і	   АДДці	 і
       і       АДДДДДДДДДЩ   і	   АДДДДДДДДДЩ	       АДДДДДДДДДЩ
       і		     і	   31	     0	       31	 0
       і		     і	   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
31     і      0 	     і	   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
ГДДДДДДБДДДДДДґ 	     і	   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
АДДДДДДДДДДДДДЩ 	     і	   ГДДДДДДДДДґ	       ГДДДДДДДДДґ
			     і	   і	     ГДДДДДДї  ГДДДДДДДДДґ
Регистр управления (СR3)     і	   ГДДДДДДДДДґ	    і  ГДДДДДДДДДґ
			     АДДДДці	     ГДДДї  АДці	 і
  внутри 80386. 		   АДДДДДДДДДЩ	 і     АДДДДДДДДДЩ
						 і     31	 0
						 і     ГДДДДДДДДДґ
						 і     ГДДДДДДДДДґ
						 і     ГДДДДДДДДДґ
						 і     ГДДДДДДДДДґ
						 АДДДДці	 і
						       АДДДДДДДДДЩ
	      Рис.9.4 Структура таблиц трансляции.
			    - 108 -
   2.	Поле   "для   использования   OC"   представляет   собой
совокупность  3-х   разрядов,	выделенных   под   использование
операционной системы. 80386 автоматически  никогда  не	изменяет
эти разряды. Примером использования этих разрядов может  служить
хранение информации о старении таблицы страниц. Если  этих  трех
разрядов  не  достаточно  для	хранения   всей   дополнительной
информации  о  таблицах  страниц,  операционная  система   может
создать отдельный  массив  в  памяти  для  хранения  необходимой
информации.
   3. Бит D ("грязная") указывает, была ли  осуществлена  запись
операнда в какую-либо  из  1024  страниц,  обслуживаемых  данной
строкой (D=1), или нет (D=0). Если D=1, то копия по крайней мере
одной из страниц, хранящихся на диске, устарела, и супервизорная
программа должна записать соответствующую (ие) страницу  (ы)  на
диск, прежде чем заменить ее (их) в памяти.
31			     11    9 8 7 6 5 4 3  2   1   0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДЕДЕДЕДЕДЕДЕДЕДДДЕДДДЕДДДґ
і АДРЕС ТАБЛИЦЫ СТРАНИЦ 31-12ідля OSі0і0іDіАі0і0іU/SіR/Wі P і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДБДБДБДБДБДБДБДДДБДДДБДДДЩ
    Строка каталога указывает на таблицу страниц и содержит
		   перечень ее атрибутов.
  Рис.9.5 Строка каталога таблицы страниц.
   4. Бит А ("был факт доступа") указывает, была ли осуществлена
операция чтение/запись по крайней мере в одну  из  1024  страниц
(А=1) или нет (А=0). Этот бит полезен, если операционная система
набирает статистику об использовании страниц.
   5.  Бит  U/S  ("пользователь/супервизор")  в   общем   случае
указывает статус защиты, присвоенный 1024 страницам, описываемым
соответствующей   таблицей   страниц.	 Полная    интерпретация
представлена в таблице 9.1.
   6. Бит R/W ("чтение/запись") в общем случае указывает  защиту
от записи для 1024 страниц, описываемых соответствующей таблицей
страниц.  Для  полной  интерпретации  этот   бит   должен   быть
рассмотрен совместно с битом U/S. См. таблицу 9.1.
   7. Бит Р  ("наличие")  указывает,  имеется  ли  в  физической
памяти соответствующая таблица страниц (Р=1) или нет (Р=0).
     Разряды, отмеченные  0,  должны  быть  инициализированы  во
время создания каталога таблиц страниц в памяти. Эти разряды  не
изменяются 80386 и зарезервированы для будущего применения.
		    Строка таблицы страниц
		  ДДДДДДДДДДДДДДДДДДДДДДДДДД
     Таблица  страниц  содержит  1024  строки.	 Каждая   строка
указывает на страницу памяти через ее  базовый	адрес  и  другую
информацию.
     Строка  таблицы  страниц,	представленная	на   рис.   9.6,
определена ниже. Заметим, что ее внешний вид и определение очень
схоже со строкой каталога таблиц страниц.
31			     11    9 8 7 6 5 4 3  2   1   0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДЕДЕДЕДЕДЕДЕДЕДДДЕДДДЕДДД*
і    АДРЕС СТРАНИЦЫ 31...12**ідля OSі0і0іDіАі0і0іU/SіR/Wі P і
*ДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДБДБДБДБДБДБДБДДДБДДДБДДДЩ
    Строка таблицы страниц указывает на страницу и содержит
		   перечень ее антрибутов.
		Рис.9.6 Строка таблицы страниц.
			    - 109 -
   1. Поле  "адрес  страницы"  определяет  старшие  20  разрядов
адреса физической  страницы.  Поскольку  страница  выровнена  по
страничной границе, т.е. по 4096-байтовой границе, ее младшие 12
разрядов базового адреса-нули.
   2.	Поле   "для   использования   ОС"   представляет   собой
совокупность  3-х   разрядов,	выделенных   для   использования
операционной системой. 80386 автоматически никогда  не	изменяет
эти разряды. Примером использования этих разрядов может  служить
хранение информации о старении страниц. Если этих трех	разрядов
не достаточно для  хранения  всей  дополнительной  информации  о
страницах, операционная система может создать отдельный массив в
памяти для хранения этой информации.
   3.  Бит  D  ("грязная")  указывает,  была   ли   осуществлена
какая-либо запись в страницу (D=1) или нет (D=0). Если	D=1,  то
копия  этой  страницы,	содержащаяся  на  диске,   устарела,   и
супервизорная программа должна записать эту страницу обратно  на
диск прежде, чем затереть ее в памяти.
   4. Бит А ("был факт доступа") указывает, была ли осуществлена
операция чтения или записи к какой-либо ячейке в странице (А=1)
или нет (А=0).	Этот  бит  полезен,  если  операционная  система
набирает статистику об использовании страниц.
   5.  Бит  U/S  ("пользователь/супервизор")  в   общем   случае
указывает   статус   защиты,   присвоенный   странице.	  Полная
интерпретация этого бита представлена в таблице 9.1.
   6. Бит R/W ("чтение/запись") в общем случае указывает  защиту
от записи в страницу. Для полной интерпретации этот  бит  должен
быть рассмотрен совместно с битом U/S. См. таблицу 9.1.
   7. Бит Р  ("наличие")  указывает,  имеется  ли  в  физической
памяти соответствующая страница (Р=1) или нет (Р=0).
     Разряды, отмеченные  0,  должны  быть  инициализированы  во
время  создания  таблицы  страниц  в  памяти.  Эти  позиции   не
изменяются 80386 и зарезервированы для будущего применения.
			Защита страниц
		     ДДДДДДДДДДДДДДДДДДД
     В	строке	каталога  таблиц  страниц  разряды  U/S  и   R/W
используются в качестве атрибутов защиты всех страниц в  таблице
страниц. Эти разряды в строке каталога таблицы страниц применимы
по отношению ко всем 1024 страницам,  описываемым  этой  строкой
каталога.
     В строке таблицы страниц разряды  U/S  и  R/W  обеспечивают
подобную защиту для страницы. Биты U/S и R/W  в  строке  таблицы
страниц применимы только по отношению  к  странице,  описываемой
этой строкой.
     Как показано на рис. 9.7, оба  уровня  таблиц  используются
при  страничной  трансляции.  Поэтому  защита,	применяемая   по
отношению   к	 данной    странице,	определяется	наиболее
ограничивающей комбинацией битов U/S и	R/W.  Понятие  "наиболее
ограничивающая	 комбинация"   означает   наименьшее    значение
супервизорного статуса и статуса  "исключительно  чтения",  т.е.
наименьшее  значение   комбинации   [U/S:R/W]	является   более
ограничивающей величиной, и поэтому именно оно и используется.
     Например, для страницы с комбинацией U/S:R/W ,равной  10  в
строке	каталога  таблицы  и  10  в  строке  таблицы,	наиболее
ограничивающее значение-01 в строке таблицы страниц.
     Наиболее ограничивающие значения  комбинаций,  используемых
при защите, показаны в таблице 9.1.
     Правила доступа  к  сегментам  также  применяются	ко  всем
обращениям  в  память.	В  конечном  итоге  используются   самые
ограничивающие правила, независимо  от	того,  являются  ли  они
правилами обращения к сегментам или к  страницам.  Заметим,  что
защита по принципу "исключительно  выполнение"  задается  только
правилами сегментного доступа.
			    - 110 -
31		 21		   11			    0
ГДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іИНДЕКС КАТАЛОГА і ИНДЕКС ТАБЛИЦЫ  і  СМЕЩЕНИЕ В СТРАНИЦЕ   і
і   ТАБЛИЦ	 і    СТРАНИЦ	   і	    *		    і
АДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ
     ЛИНЕЙНЫЙ АДРЕС
31    21	11     0
ГДДДДДЕДДДДДДДДДЕДДДДДДґ
АДДВДДБДДДДВДДДДБДДВДДДЩ			    Выбранная страница
   і	   і	   АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї в физической памяти
   і	   і					 щ	(4096 байт)
   і	   і					 x4
   і	   і					 щ
   і	   і					 +ДДї  ГДДДДДДДДДґ
   і	   і					 ш  АДці операнд і
   і	   і					 і     ГДДДДДДДДДґ
   і	   і					 і     ;    ;	 ;
   і	   АДДДДДДДДДДДДДДДДї			 і     ГДДДДДДДДДґ
   і			    щ	Выбранная таблицаі     ГДДДДДДДДДґ
   і			    x4	    страниц	 і     ГДДДДДДДДДґ
   і			    і (4096 байт каждая) і     ГДДДДДДДДДґ
   і			    і			 ГДДДДці	 і
   і			    і			 і     АДДДДДДДДДЩ
   і			    і			 і
   і			    щ	   ГДДДДДДДДДґ	 і
   і			       ЪДДці	     ГДДДЩ
   і			    +ДДЩ   ГДДДДДДДДДґ
   і			    ш	   ;	;    ;
   і			    і	   ГДДДДДДДДДґ
   і			    і	   ГДДДДДДДДДґ
   і			    і	   ГДДДДДДДДДґ
   щ		Каталог     ГДДДДДці	     і
   х4		страниц     і	   АДДДДДДДДДЩ
   і	     (4096 байт)    і
   і	       ГДДДДДДДДДґ  і
   і	 ЪДДДДці	 ГДДЩ
   і	 і     ГДДДДДДДДДґ
   щ	 і     ;	 ;
   +ДДДДДЩ     ГДДДДДДДДДґ
   ш	       ГДДДДДДДДДґ
   і	       ГДДДДДДДДДґ
   і	       ГДДДДДДДДДґ
   АДДДДВДДДДДці	 і
	і      АДДДДДДДДДЩ
	і
31	і	0
ГДДДДДДДБДДДДДДДґ
АДДДДДДДДДДДДДДДЩ
Якорь каталога страниц
Регистр управления СR3
  (внутренний 80386)
  Рис.9.7 Трансляция линейного адреса в физический.
     Правила доступа  к  сегментам  также  применяются	ко  всем
обращениям  в  память.	В  конечном  итоге  используются   самые
ограничивающие правила, независимо  от	того,  являются  ли  они
правилами обращения к сегментам или к  страницам.  Заметим,  что
защита по принципу "исключительно  выполнение"  задается  только
правилами сегментного доступа.
			    - 111 -
    Таблица 9.1   Защита, обеспечиваемая битами U/S и R/W.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
U/S	 R/W	  Разрешенный доступ	   Разрешенный доступ
		  из уровня пользова-	   из супервизорного
		  теля (CPL=3)		   уровня (DPL=2,1или 0)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 0	  0	    не разрешен 	     чтение и запись
 0	  1	    не разрешен 	     чтение и запись
 1	  0	    только чтение	     чтение и запись
 1	  1	    чтение и запись	     чтение и запись
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Например,	если  данные  размещены   в   сегменте	 данных,
отмеченном как только читаемый, а какая-либо страница  отмечена,
как читаемая/записываемая, доступ к данным допустим  только  для
чтения из-за более ограничивающих  правил  сегментного	доступа.
Второй пример:	если  создан  сегмент  программы  уровня  3,  но
содержащий   некоторые	 страницы,   помеченные   как	"уровень
супервизора", тогда при CPL=3 могут  быть  выполнены  только  те
страницы   программного   сегмента,   которые	 помечены    как
"пользовательский уровень". Этот второй пример очень типичен для
32-х  разрядной  простой  системы  с  защитой,	рассмотренной  в
разделе  8.  Использование  страничной	 адресации   в	 простой
защищенной системе описано на странице	   .
		 Процесс трансляции в деталях
	      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     В процессе страничной трансляции старшие 20  разрядов  32-х
разрядного линейного адреса заменяются 20 разрядами, полученными
из таблицы страницы. Таким образом, 80386 формирует  новый  32-х
разрядный адрес, используемый для обращения в физическую память.
     Фигура  9.7  показывает,	как   части   линейного   адреса
используются в качестве индекса в каждом уровне иерархии  таблиц
трансляции для трансляции линейного адреса в  физический  адрес.
Сначала старшие 10 разрядов используются в  качестве  индекса  к
каталогу таблиц страниц для обращения к  одной	из  1024  строк,
выбирая тем самым одну из таблиц страниц. Следующие 10	разрядов
используются в качестве индекса к выбранной таблице страниц  для
обращения  к  одной  из  1024  строк,	соответствующей   нужной
странице. 20-разрядный номер выбранной страницы  затем	заменяет
старшие  20   разрядов	 линейного   адреса.   Так   формируется
32-разрядный физический адрес.
     Заметим, что все страницы	виртуальной  памяти  и	страницы
физической памяти выровнены по 4096-байтовой границе.  Благодаря
этому соответствию, страничная	трансляция  не	воздействует  на
младшие 12 разрядов линейного адреса-смещения в странице.
    Использование страничной организации для защиты системы
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Страничная  организация  сама  придает   системе	свойство
защиты, благодаря тому, что строки  каталога  таблиц  страниц  и
строки таблиц страниц содержат информацию об уровне  привилегии
(бит U/S), и информацию о правилах использования (бит R/W).
     Любое обращение к памяти, выполняемое 80386, должно успешно
пройти контроль защиты на уровне сегментной адресации и контроль
защиты на уровне страничной адресации. Эти контрольные процедуры
проверяют, что CPL (см. стр.	    ) имеет  адекватный  уровень
привилегии для доступа к сегменту с данным DPL и  к  странице  с
данным уровнем U/S. Это также означает, что доступ  должен  быть
допустим в терминах правил доступа к сегментам и правил  доступа
к страницам.
			    - 112 -
     В контексте простой 32-разрядной системы, как в разделе  8,
система  страничной   памяти   может   быть   использована   для
ограничения доступа пользователя к  определенной  зоне	линейных
адресов. В особенности когда сегменты пользовательской программы
и данных пользователя занимают каждая по целому  4-гигабайтовому
линейному адресному пространству, система  страничной  адресации
может  ограничить  зону  адресов,  доступных  пользователю,   до
меньшей области. Пространство пользователя  может  быть  собрано
путем  пометки	различных  страниц,  как  страницы   супервизора
(U/S=0).
     Окончательные требования, пред`являемые к успешному доступу
к странице: бит Р ("наличие") в строке каталога таблиц страниц и
в строке таблицы  страницы  должен  быть  установлен  в  1,  что
означает состояние наличия. В системе,	использующей  страничную
организацию для защиты, а не для поддержки  виртуальной  памяти,
все разряды Р должны быть установлены в 1.
Использование  страничной  организации	памяти	для  виртуальной
			    памяти
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Механизм страничной  организации  80386  может  быть  легко
использован для обеспечения виртуальной памяти для программиста.
В системе с виртуальной памятью бит Р может быть как 0, так и 1,
но он  всегда  должен  точно  отображать  состояние  виртуальной
страницы:   "в   памяти"/"на   диске".   Операционная    система
ответственна за  точное  отслеживание  состояния  битов  Р.  Они
никогда  автоматически	 80386	 не   изменяются,   хотя   80386
автоматически ссылается на  соответствующий  бит  Р  при  каждом
обращении в память.
     Этот бит поддерживает страничную  виртуальную  память.  Для
каждого обращения в память проверяются биты Р в каталоге  таблиц
страниц и в таблице страниц. Если Р=1 в каталоге таблицы страниц
и в таблице страниц, страница в наличии, и сразу же производится
трансляция адреса в физический. Если любой  разряд  Р  равен  0,
обращение к памяти  не	делается.  Вместо  этого  обнаруживается
ошибка	страницы,  и  процессор  генерирует   прерывание   из-за
исключительной ситуации. Исключительная  ситуация  14  присвоена
условию   ошибки   страницы.   Построение    процессора    80386
гарантирует,   что   все    ошибки    страниц	 перезапускаемы;
следовательно, выполнение  программы,  вызвавшей  исключительную
ситуацию,  может  быть	возобновлено  после  того,  как   нужная
страница  будет  перенесена  в	физическую  память  в	таблицах
трансляции будет обновлен адрес физической страницы и правильное
значение бита Р.
 Требования к наличию страниц в системе с виртуальной памятью
  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Когда  механизм  страничной  адресации   используется   для
обеспечения  виртуальной   памяти,   большая   часть   линейного
адресного пространства отсутствует в физической памяти в  каждый
момент времени. Однако, некоторые программы и  структуры  данных
должны быть резидентны всегда, как описано в этом  разделе  и  в
таблице 9.2. Эти области никогда не должны выноситься на диск.
     В системе со  страничной  памятью	каталог  таблиц  страниц
всегда должен оставаться в памяти; это разумное требование,  так
как к нему, как к таблице первого уровня, обращаются всякий раз,
когда требуются таблицы страниц.
     Вся программа обслуживания исключительной ситуации  "ошибки
страниц" (прерывание по исключительной ситуации  14);  программа
обслуживания,	которая   переносит   необходимые   страницы   в
физическую память, должна сама постоянно находиться в памяти.  В
противном  случае  ни  одна  страница  успешно	не  сможет  быть
перенесена в физическую память без того, чтобы не вызвать другую
			    - 113 -
исключительную	 ситуацию   "ошибка    страницы".    Аналогичное
рассуждение  применимо	к  другим  структурам,	которые   должны
оставаться в памяти.
     Для  начального  вызова   программы   обслуживания   ошибки
страницы (программа обслуживания исключительной ситуации 14) IDT
и  GDT	должна	находиться  в	памяти,   поскольку   IDT   дает
переключатель указанной  исключительной  ситуации,  и  GDT  дает
дескрипторы  сегментов	программы  обслуживания  и  данных.  TSS
должен быть в наличии, поскольку он  дает  указатель  стека  для
стека уровня 0, используемого программой обслуживания. Сам  стек
уровня 0 должен, следовательно, быть в памяти. По той же причине
таблицы страниц, используемые при  трансляции  адреса  для  IDT,
GDT, TSS, стека уровня 0 и сегментов  программы  обслуживания  и
данных, должны оставаться в памяти. Одна таблица  страниц  может
легко обрабатывать адресное отображение для всех этих  структур.
Оставшиеся таблицы страниц могут не  оставаться  в  памяти;  они
могут быть отправлены на диск, и  бит  Р  в  соответствующих  им
строках в каталоге  таблиц  страниц  может  быть  сброшен  в  0,
указывая, что их нет в памяти.
     С точки зрения замедления реакции	на  прерывания,  однако,
крайне	желательно,  чтобы  в  памяти  оставались   коды   часто
используемых программ обслуживания прерываний.
     Исходя  из  соображения  общей  производительности,  крайне
желательно держать в физической  памяти  возможно  больше  часто
используемых других программ и данных.
Таблица 9.2
      Структуры, которые должны быть резидентны в памяти
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
    Структуры, которые должны			   Причина
    располагаться в памяти
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
1.  Каталог таблиц страниц		Каждое обращение к таб-
					лицам страничной транс-
					ляции требует использо-
					вания каталога.
2.  IDT 				Требуется для нормаль-
					ного вызова программ
					обработки ошибки стра-
					ницы.
3.  Таблица страниц для IDT		Та же, что и для п.2
4.  GDT 				     "-"
5.  Таблица страниц для GDT		     "-"
6.  TSS 				     "-"
7.  Таблица страниц для TSS		     "-"
8.  Стек уровня 0			     "-"
9.  Таблица страниц для сте-
    ка уровня 0 			     "-"
10. Код обработчика исключи-		Требуется для успешно-
    тельной ситуации "ошиб-             го выполнения програм-
    ка страницы".                       мы обслуживания ошибки
					страниц (исключительная
					ситуация 14).
11. Область данных для об-		Требуется для определе-
    работчика исключитель-		ния того, где страница
    ной ситуации "ошибка                хранится на диске
    страницы".
12. Таблицы страниц для 		Та же, что и для п.2
    сегментов данных и
    кода обработчика иск-
    лючительной ситуации
    "ошибка страницы".
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
			    - 114 -
     Заметим, что таблицы страниц, упомянутые в  пп.  3,5,7,9,12
могут быть одной и той же таблицей страниц.
	       Буфер ускорения трансляции (TLB)
		ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Для ускорения процесса трансляции	адреса	80386  имеет  на
кристалле быструю кэш-память, содержащую последние  (по  времени
использования)	результаты  трансляции	адреса.  Эта  кэш-память
называется буфером ускорения трансляции; этот термин заимствован
из архитектуры больших ЭВМ, в которых такие  кэш-памяти  впервые
были реализованы.
     TLB 80386	хранит	32  значения  оттранслированных  номеров
страниц, соответствующих 32-м  номерам	виртуальных  страниц.  В
любой момент времени, когда линейный адрес принадлежит одной  из
этих 32-х виртуальных страниц, TLB может немедленно  выдать  для
трансляции соответствующее значение номера физической  страницы.
Доступ в  TLB,	который  производится  при  каждом  обращении  в
память,  называется  просмотром  TLB.  Поскольку  просмотр   TLB
занимает только 1/2 периода тактового сигнала,	TLB  значительно
ускоряет процесс страничной трансляции. TLB  позволяет	избежать
частых обращений к резидентным таблицам страниц в  памяти.  Если
бы 80386 не имел TLB, он бы обращался к таблицам трансляции  при
каждом обращении в память.
     Вследствие   того,   что	он   содержит	 32    последних
оттранслированных значения, TLB выполняет немедленную трансляцию
приблизительно в 98-99% обращений в память. Это  не  неожиданный
показатель,  поскольку	32   страницы	покрывают   128   КБайт.
Большинство программ в каждый момент времени проявляют	свойство
локальности ссылок, означающее, что  они  выполняют  большинство
обращений в память в относительно узкой зоне виртуальных адресов
(обычно  суммарно  в  пределах	128  К).   Принцип   локальности
позволяет TLB работать эффективно.
     Однако, если  линейный  адрес  не	принадлежит  виртуальной
странице, отображаемой TLB, 80386 автоматически определяет номер
физической страницы путем обращения к каталогу таблиц страниц  и
к таблице страниц, размещенных в памяти, как  показано	на  рис.
9.8. Одновременно 80386 заменяет одну из  старых  строк  TLB  на
новую  информацию,  полученную	в  процессе   трасляции.   Таким
образом, содержимое TLB отражает результаты недавно  выполненной
страничной трансляции.
			Организация TLB
			 ДДДДДДДДДДДДДДД
     Тридцать две строки TLB организованы в четыре набора  по  8
строк в  каждой.  Эта  организация  из	четырех  наборов  обычно
называется	  4-канальной	     множественно-ассоциативной.
Ассоциативность  показывает,  что  кэшевые  наборы  работают   в
параллель или, другими словами,  одновременно.	Например,  когда
происходит просмотр TLB, каждый набор одновременно индексируется
тремя  младшими  разрядами  14,  13  и	12  номера   виртуальной
страницы.
    Каждый  элемент   набора,соответствующий   данному	 индексу,
одновременно сравнивается с  текущим  виртуальным  адресом.  Если
найдено совпадение в  одном  из  четырех  наборов,ТLВ  немедленно
выдает	номер  физической  страницы  из  того  набора,в   котором
обнаружено совпадение.Рис.9.7 иллюстрирует организацию в ТLВ.
    Это статическая  32-элементная  4-х  канальная  ассоциативная
организация обеспечивает хорошую вероятность  того,что	требуемая
трансляция будет найдена в ТLВ. Она обеспечивает,например, лучшую
производительность,чем 32-элементный  ТLВ,  состоящий  из  одного
набора (прямого отображения). С точки зрения затрат на реализацию
однако,четырех канальная ассоциативность требует больше  компонен
тов на кристалле,:раздельные схемы компараторов,как  показано  на
рис.9.7.
				   - 115 -
31				15 14	12 11		    0
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДЕДДДДДДДДДДДДДДДДДґ
і   НОМЕР ВИРТУАЛЬНОЙ СТРАНИЦЫ		  і   СМЕЩЕНИЕ	    і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДЕДДДДДДДДДВДДДДДДДЩ
ічДДДДДДДДДДДДДДДTLBДДДДДДДДДДДДДцічДTLBДці	    іна шину адреса
		 тег		    индекс	    АДДДДДДДДДДДДДДД
		 *і		      і 	       11...0
ЪДДДДДДДДДДДДДДДДДЩ		      і
і * ВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
і   і		32 строки,4-канальный множественно-ассоциативный буфер
і   і				   ускорения трансляции.
і   і
і   і		  набор 0
і * і ВЪ ЪДДДДДДДДїнабор 1 ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДї
і * і Ыі іЪДДДДДДДБїнабор 2іЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ДДБї
і * і Бі ііЪДДДДДДДБї......ііЪДДДДДДДДДДДДДДДДДДДДДДДДДВДВДВДДДВД
ДДВБї
і * і Оі ііі  ТЕГ   і......іііномер физической страницыіDіAіU/SіR
/WіPі
і * і Рі ііГДДДДДДДДґ......ііГДДДДДДДДДДДДДДДДДДДДДДДДДЕДЕДЕДДДЕД
ДДЕДґ
і * і  і ііі**ТЕГ***і......іііномер физической страницыіDіAіU/SіR
/WіPі
і * і 1і ііГДДДДДДДДґ......ііГДДДДДДДДДДДДДДДДДДДДДДДДДЕДЕДЕДДДЕД
ДДЕДґ
і * АДці ііі**ТЕГ***і......іііномер физической страницыіDіAіU/SіR
/WіPі
і *   Иі ііГДДДДДДДДґ......ііГДДДДДДДДДДДДДДДДДДДДДДДДДЕДЕДЕДДДЕД
ДДЕДґ
і *   Зі ііі**ТЕГ***і......іііномер физической страницыіDіAіU/SіR
/WіPі
і *    і АґГДДДДДДДДґ......ііГДДДДДДДДДДДДДДДДДДДДДДДДДЕДЕДЕДДДЕД
ДДЕДґ
і *   8і  Аґ**ТЕГ***і......іііномер физической страницыіDіAіU/SіR
/WіPі
і *    А   АДДДВДДДДЩ......АіГДДДДДДДДДДДДДДДДДДДДДДДДДЕДЕДЕДДДЕД
ДДЕДґ
і************ш і     .......Аґномер физической страницыіDіAіU/SіR
/WіPі
ГДДДДДДДДДДДДЩ*і     ........АДДДДДДДДДДДДДДВДДДДВДДДДДБДБДБДДДБД
ДДБДЩ
і*ЗАМЕНА ТЕГА**і	  обновление номера ш	 і
і(при промахе)*і*******    ДДДДДДДДДДДДДДДДДЩ	 ік шине адреса 31.
.12
і *   *ЪДДДДДДДЕДДДДДДДї  физической страницы	 АДДДДДДДДДДДДДДДДД
ДДД
і *   *іЪДДДДДДщДДДДДДДБї   (при промахе)	    (при совпадении)
і *    АґЪДДДДДДДДДДДДДДБї
АДДДДДДДціКОМПАРАТОР ТЕГАГДДДсовпадениеДДДДДДДДДДцк логике управл
ения
	 АДДДДДДДДДДДДДДДЩ				ТLВ
       4 компаратора(один набор)
   Рис.9.8 Организация ТLB 80386.
-----------------------------------------------------------------
----
			   - 116 -
			  ГЛАВА 10.
       Оперативная информация  по  командам  для  защищенного
			  режима.
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   В этой главе обсуждаются команды 80386 процессора, которые
используются в защищенном режиме. Все команды 80386 имеются в
наличии в защищенном режиме.
   В защищенном режиме 80386-й может  обрабатывать  32-битные
кодовые  сегменты  (  по  умолчанию,  бит D в  код-сегментном
дескрипторе равен 1 ) или 16-битные кодовые сегменты ( D=0 ).
Использование 32-битных кодовых сегментов позволяет полностью
использовать 80386-й; 16-битные кодовые сегменты дают  полную
совместимость с работой 80286-го в защищенном режиме.
   Имеются размеры операндов 8 бит, 16 бит,  32  бита.	Когда
80386-й обрабатывает 32-битные кодовые сегменты, по умолчанию
используется 32-битный способ адресации, как описано в	главе
7. Когда  он  обрабатывает  16-битные  кодовые	сегменты,  по
умолчанию  используется  16-битный  способ   адресации,   как
описано  в  главе  4.  Когда  выполняется  16-битный  кодовый
сегмент, тем не менее, имееется несколько новых  черт  80386.
Так, строго говоря, 16-битный защищенный режим	80386  -  это
режим работы с большими возможностями, чем  защищенный	режим
80286. Имеются отладочные регистры 80386, и программы отладки
могут	 использовать	 их	для	особой	   отладочной
производительности.  Также  имеются   регистры	 постраничных
тестов и контрольные регистры,	используемые  при  подготовке
введения защищенного режима. Два новых сегментных регистра FS
и  GS  позволяют  повысить  эффективность  программ.  Имеются
команды работы с битами и команды двойного сдвига.
		       Наличие команд.
			ДДДДДДДДДДДДДД
   Как замечено,  все  команды	80386  имеются	в  защищенном
режиме. По сравнению с защищенным режимом  80286  имеются  12
новых команд. Новая совершенная  сдвиговая  форма Jcc команды
(команды условного  перехода)
и  совершенно  стандартная  форма  IMUL-команды   (команды
знакового умножения)  имеются  в  защищенном  режиме  80386.
Таблица 10.1 перечисляет дополнения в 80386  по  сравнению  с
80286 и другими  модификациями.  Эти  дополнительные  команды
позволяют   новые   программы	80386-го   выполнять	более
эффективно, чем программы 8086 или 80286.
   Заметим, что определенные команды защищенного режима могут
также быть выполнены в реальном режиме. Эти команды позволяют
инициализировать систему для работы в защищенном режиме,  как
показано в главе 11. Как только защищенный режим  установлен,
многие	из  этих  команд  могут  быть  выполнены  только   на
привелегированном нулевом  уровне,  самом  привелегированном,
из-за их значительной роли в системном программировании.
		  Дополнительные возможности.
		  ДДДДДДДДДДДДДДДДДДДДДДДДДД
   Все	дополнения,  перечисленные  на	рис.3.1,  имеются   в
защищенном режиме.
			   - 117 -
					    Таблица 10.1
		 Дополнения к командам по сравнению с 8086.
 _______________________________________ ____________________
і ДополнеДі Дополне-і Дополне-і Дополне-і
іния в ре-іния в ре-іния в за-іния в за-і      Описание
і альном  і альном  іщищенном іщищенном і
і режиме  і режиме  і режиме  і режиме	і
і 80286   і 80386   і 80286   і 80386	і
і_________і_________і_________і_________і____________________
і	  і	    і	      і 	іКоманды для основного
і	  і	    і	      і 	і использования
і	  і	    і	      і 	і
іBOUND	  іBOUND    іBOUND    іBOUND	іОсуществление контро-
і	  і	    і	      і 	іля границ массива
іENTER	  іENTER    іENTER    іENTER	іСоздание кадра стека
іIMUL#	  іIMUL#    іIMUL#    іIMUL#	іПрямое знаковое умно-
і   і   і   і 	іжение
іINS	  іINS	    іINS      іINS	іКоманда ввода строки
іLEAVE	  іLEAVE    іLEAVE    іLEAVE	іУдаление кадра стека
іOUTS	  іOUTS     іOUTS     іOUTS	іКоманда вывода строки
іPOPA	  іPOPA     іPOPA     іPOPA	іВыталкивание (из стека)
і	  і	    і	      і 	івсех основных регистров
іPUSHA	  іPUSHA    іPUSHA    іPUSHA	іПроталкивание (в стек)
і	  і	    і	      і 	івсех основных регистров
іPUSH#	  іPUSH#    іPUSH#    іPUSH#	іПроталкивание (в стек)
і   і   і   і 	ізначений непосредствен-
і	  і	    і	      і 	іно получаемых данных
іREP   INSіREP INS  іREP INS  іREP INS	іВвод повторяемой строки
іREP OUTS іREP OUTS іREP OUTS іREP OUTS іВывод повторяемой строки
іshift/ro-іshift/roДіshift/ro-іshift/ro-іСдвиг..циклический сдвиг
іtate by  іtate by  іtate by  іtate by	інепосредственным счетом
іcount	  іcount    іcount    іcount	і
і	  іBT	    і	      іBT	іТест бита
і	  іBTC	    і	      іBTC	іТест бита и дополнение
і	  іBTR	    і	      іBTR	іТест бита и сброс
і	  іBTS	    і	      іBTS	іТест бита и установка
і	  іIMUL     і	      іIMUL	іОсновной регистр знако-
і	  і genera- і	      і genera- івого умножения
і	  і lized   і	      і lized	і
і	  іMOV CRn  і	      іMOV CRn	іПеремещение в/из
і	  і	    і	      і 	іуправляющих регистров
і	  іMOV DRn  і	      іMOV DRn	іПеремещение в/из отла-
і	  і	    і	      і 	ідочных регистров
і	  іMOV TRn  і	      іMOV TRn	іПеремещение в/из регис-
і	  і	    і	      і 	ітров постраничных тестов
і	  іJcc full і	      іJcc full іУсловный-полный сдвиг
і	  і display і	      і display і   перехода
і	  іScc	    і	      іScc	іУстановка бита условно
і	  іSHLD     і	      іSHLD	іДвойной сдвиг влево
і	  іSHRD     і	      іSHRD	іДвойной сдвиг вправо
і	  і	    і	      і 	і
і	  і	    і	      і 	і Команды защищенного
і	  і	    і	      і 	і     режима
і    *	  і    *    і	      і 	і
іCLTS	  іCLTS     і	      і 	іСтирание флага пере-
і    *	  і    *    і	      і 	іключения задач
іLGDT	  іLGDT     і	      і 	іЗагрузка регистра
і    *	  і    *    і	      і 	іGDTR
іSGDT	  іSGDT     іSGDT     іSGDT	іСохранение регистра
і	  і	    і	      і 	іGDTR
			   - 118 -
 _______________________________________ ____________________
і ДополнеДі Дополне-і Дополне-і Дополне-і
іния в ре-іния в ре-іния в за-іния в за-і      Описание
і альном  і альном  іщищенном іщищенном і
і режиме  і режиме  і режиме  і режиме	і
і 80286   і 80386   і 80286   і 80386	і
і_________і_________і_________і_________і____________________
і    *	  і    *    і	      і 	і
іLIDT	  іLIDT     і	      і 	іЗагрузка регистра
і    *	  і    *    і	      і 	іIDTR
іSIDT	  іSIDT     іSIDT     іSIDT	іСохранение регистра
і    *	  і    *    і	      і 	іIDTR
іLMSW	  іLMSW     і	      і 	іЗагрузка слова стату-
і    *	  і    *    і	      і 	іса устройства
іSMSW	  іSMSW     іSMSW     іSMSW	іСохранение слова ста-
і	  і	    і	      і 	ітуса устройства
і	  і	    іARPL     іARPL	іРегулирование привеле-
і	  і	    і	      і 	ігированного уровня за-
і	  і	    і	      і 	іпрашивающего устройства
і	  і	    іLAR      іLAR	іЗагрузка прав доступа
і	  і	    іLSL      іLSL	іЗагрузка границы сег-
і	  і	    і	      і 	імента
і	  і	    іVERR     іVERR	іВерификация для чтения
і	  і	    іVERW     іVERW	іВерификация для записи
і	  і	    і	      і 	і
і	  і	    і	      і 	іТолько  для  нулевого
і	  і	    і	      і 	іуровня  защищенного
і	  і	    і	      і 	і    режима
і	  і	    і	      і 	і
і	  і	    іCLTS     іCLTS	іСтирание флага пере-
і	  і	    і	      і 	іключения задач
і	  і	    іLIDT     іLIDT	іЗагрузка регистра IDTR
і	  і	    іLGDT     іLGDT	іЗагрузка регистра GDTR
і	  і	    іLMSW     іLMSW	іЗагрузка слова статуса
і	  і	    і	      і 	іустройства
і	  і	    іLLDT     іLLDT	іЗагрузка регистра LDTR
і	  і	    іLTR      іLTR	іЗагрузка регистра TR
і	  і	    і	      іMOV CRn, іЗагрузка контрольного
і	  і	    і	      і  	ірегистра n
і	  і	    і	      іMOV ,іСохранение контрольного
і	  і	    і	      і  CRn	ірегистра n
і	  і	    і	      іMOV TRn, іЗагрузка тестового ре-
і	  і	    і	      і  	ігистра n
і	  і	    і	      іMOV ,іСохранение тестового
і	  і	    і	      і  TRn	ірегистра n
і	  і	    і	      іMOV DRn, іЗагрузка отладочного
і	  і	    і	      і  	ірегистра n
і	  і	    і	      іMOV ,іСохранение отладочного
і	  і	    і	      і  DRn	ірегистра n
і_________і_________і_________і_________і_______________________
* Эти команды защищенного режима действительны только в реальном
  режиме,  чтобы  сделать  возможной  инициализацию  защищенного
  режима.
			   - 119 -
     Ограничения на размер сегмента в защищенном режиме.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   В защищенном режиме максимальный размер сегмента определяется
содержимым дескриптора. Кодовые сегменты и сегменты данных могут
быть как 16-битными сегментами, имеющими  максимальное	смещение
FFFFh байт, так и 32-битными сегментами,  имеющими  максимальное
смещение  FFFFFFFFh  байт.   Бит   D   сегментного   дескриптора
(устанавливаемый по умолчанию) определяет 16-битные это сегменты
(D=0) или  32-битные  (D=1).  Граница  сегмента  требует,  чтобы
эффективные адреса, сгенерированные в  защищенном  режиме,  были
меньше	или  равны  предельному  размеру  сегмента.   В   случае
многобайтных операндов, таким  образом,  требуется,  чтобы  весь
операнд  в  целом  был	смещен	меньше	или  равно  пределу.   В
защищенном режиме попытка доступа  к  операндам,  которые  лежат
целиком или частично за пределами сегмента, приводит к нарушению
и вызывает исключительную ситуацию. ( Нарушение границ	сегмента
дальше описывается в главе 16.)  Все  операнды,  таким	образом,
должны лежать внутри определенной границы сегмента.
			  ГЛАВА 11.
     ИНИЦИАЛИЗАЦИЯ ПРОСТЫХ ЗАЩИЩЕННЫх 32-БИТНЫХ СИСТЕМ.
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Эта глава  дает  ключевой  пример  инициализации  80386-го  в
32-битном     функционировании.      Системная	    конфигурация
устанавливается как простейшая защищенная система, как описано в
главе  8,  с   4-гигабайтной   областью   прямой   адресации   и
двухуровневой системой защиты.
			    Цели.
			    ДДДД
   С минимумом кодов и данных программа, представленная  в  этой
главе,	инициализирует	80386-й   для	работы	 как   32-битный
процессор. Таким образом, эта  программа  разрешает   защищенный
режим.	Используются  2   привилегированных   уровня:	наиболее
привилегированный - для  кода  и  данных  супервизора,	и  менее
привилегированный уровень -  для  кода	и  данных  пользователя.
Программа разрешает доступ ко всей 4-гигабайтной области  прямой
адресации.
			  Механизм.
			  ДДДДДДДД
   Программа  инициализирует   несколько   системных   регистров
80386-го, чтобы сделать возможным защищенный режим  и  доступ  к
необходимым  таблицам  дескрипторов  GDT  и  IDT.  Хотя   и   не
существует единой последовательности кодов, которая должна  быть
использована для инициализации 80386 в 32-битном режиме  работы,
важные пункты должны  быть  хорошо  поняты,  и	они  могут  быть
об`единены в некоторую	заданную  программу  инициализации.  Эти
пункты перечислены ниже.
1. Программа сконструирована так, чтобы  выполняться  немедленно
после восстановления  процессора.  Для	простоты  эта  процедура
должна	находиться  в  EPROM,  и  она  начинает  выполняться   с
исходного адреса. При перезагрузке 80386-й находится в	реальном
режиме, но база кодового сегмента  изначально  задана  FFFF0000h
(64К   от   вершины   4-гигабайтного	физического    адресного
пространства, величина, превосходящая  нормальное  1-мегабайтное
адресное пространство реального  режима.  IP  задан  FFF0h,  что
приводит   к   тому,   что   начальный	 адрес	 вызова    будет
FFFF0000h + FFF0h (адрес базы кодового сегмента + значение IP) =
FFFFFFF0h  в  физической  памяти.  Заметим,  что  базовые адреса
сегмента и IP, как они заданы,	допускают  самозагрузку  кода  в
EPROM, который помещается  на вершину  4-гигабайтной  физической
памяти. Смотри рис.11.1.
			   - 120 -
2. Первая команда в виде программы   -	JMP.  Т.к.  этот  пример
сделан так, чтобы постоянно находиться в самозагрузчике EPROM  в
вершине физического адресного пространства, эта JMP должна  быть
внутрисегментной JMP (код операции Е9h,  прямой  переход  внутрь
кодового   сегмента),	чтобы	избежать   перезагрузки   адреса
код-сегментной базы.
3. Во время работы программы  системные  регистры  GDTR  и  IDTR
80386-го  загружаются  значениями,  которые  указывают	на   две
таблицы дескрипторов, рассмотренные в главе 8, GDT и IDT. Образы
структур GDT и IDT также включены в самозагрузчик в  EPROM  (см.
рис.11.2). Важно: все дескрипторы кодов и данных в  EPROM-образе
GDT должны иметь набор	битов  доступа.  Дескриптор  TSS  должен
иметь  набор  битов  доступа  и  бит восстановления.  Замечание:
образы GDT  и  IDT  могут  быть  скопированы  в  RAM,  если  это
понадобится, позволяя изменять таблицы, также  как  и  системные
запуски.  Для  мультизадачной  системы	 таблицы   должны   быть
расположены  в	RAM   так,   чтобы   80386   мог   как	 следует
контролировать	занятые  биты	нескольких   дескрипторов   TSS,
существующих в такой системе.
4. Когда  таблицы  установлены,  как  показано	выше,  программа
разрешает  защищенный  режим  путем  загрузки  значений  в   CR0
(контрольный  регистр  0,  рис.2.7),  который  устанавливает  PE
(возможность защиты)бит (бит, обеспечивающий  защиту),	бит  31.
Сейчас	защищенный  режим  установлен,	и  это	 означает,   что
следующие загрузки селекторов в сегментный регистр  вызовут  то,
что 80386 будет  обращаться  к	GDT,  считывать  дескриптор  для
сегмента  и  сохранять	информацию  дескриптора  во   внутреннем
дескрипторном КЭШ-регистре (рис.8.6). Загрузки селекторов  могут
быть выполнены с помощью команды MOV или, для регистра CS, через
интерсегментные команды JMP, CALL, INTn, RET или IRET.
5.  Программа  продолжает  инициализировать  КЭШ  80386-го   для
каждого сегментного регистра.  Программа  смещает  селектор  для
сегмента данных супервизора  (селектор	=  0018h)  в  сегментные
регистры SS, DS, ES, FS, и GS. Значение селектора таково, что он
ссылается   на	 дескриптор   для   сегмента	данных	  уровня
супервизора(уровня 0). Этим действием программа делает доступным
большой сегмент данных супервизора. Как определено  дескриптором
сегмента данных в GDT, сегмент данных - 32-битный сегмент, т.к.
     бит дескриптора D=1. Дескриптор сегмента данных, который
появляется,  как  показано   на   рис.8.3,   приводится   как
дескриптор CDT 3 на рис.11.2. Этот дескриптор сегмента данных
показывает базовый адрес 00000000h  и  границу	максимального
размера FFFFFFFFh. Сегмент данных супервизора, таким образом,
охватывает всю 4-гигабайтную область прямой адресации. Регис-
тры SS, DS, ES,  FS,  и  GS  все  описывают  тот  же  сегмент
максимального размера.
6. Остается загрузить один  последний  сегментный  регистр  -
регистр CS. Это завершается не	командой  MOV  (MOV  в	CS  -
недопустимый код операции), а командой JMP. Т.к. команда  JMP
должна загрузить новое значение селектора  в  CS,  необходимо
выполнить  интерсегментную  JMP  (код  операции  EAh,  прямой
интерсегментный   переход).   Интерсегментная	команда   JMP
определяет селектор кодового сегмента супервизора (селектор =
0010h)	и  смещение  внутри  этого  принимающего  сегмента  (
смещение = линейный адрес команды, следующей за JMP). Кодовый
сегмент, как описывается  дескриптором	кодового  сегмента  в
GDT,  есть  32-битный  сегмент	(D=1).	 Дескриптор  кодового
сегмента,  приведенный	как  дескриптор  GDT_2	на  рис.11.2,
показывает базовый адрес 00000000h  и  границу	максимального
размера FFFFFFFFh. Сегмент кода супервизора,  таким  образом,
охватывает всю 4-гигабайтную область прямой адресации.
			   - 121 -
   Интерсегментная команда JMP	будет  использовать  значение
селектора, который  обращается	к  дескриптору	для  кодового
сегмента   уровня   супервизора   (уровня   0).   Она	будет
использовать смещение, которое определяет адресат  информации
относительно  вновь  загруженного   сегментного   кода.   Как
описано, база этого  кодового  сегмента  -  00000000h,	таким
образом определение смещения n приводит к адресу  n  адресата
информации внутри 4-гигабайтной области прямой адресации.
7.  На	адресате  информации  JMP-команды  желательно	иметь
команду, которая инициализирует стек супервизора. Перемещение
начального значения в регистр ESP - это все, что требуется.
   Т.к. базовый адрес всех сегментов определен как 00000000h,
и  границы  определены	как   FFFFFFFFh,   эта	 конфигурация
устанавливается   так,	 что   сегментные    регистры	 мало
используются   когда   процедура   инициализации   закончена.
4-гигабайтная линейная область	делается  доступной  кодам  и
данным.
8. Команда LTR инициализирует регистр задачи, указывающий  ей
на TSS для этой (и только этой) задачи. TSS  требуется,  т.к.
система     допускает	   пользователь/суперпользовательскую
архитектуру.  Когда   обрабатывающийся	 код   находится   на
пользовательском уровне, TSS  сохраняет  начальный  указатель
стека супервизора.
   Процедура 32-битной инициализации супервизора и данных.
    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Программа, изображенная  на	рис.11.1  -  коды  и  данные,
используемые для инициализации 80386-го в  32-битном  режиме.
Программа реализует все шаги, описанные на страницах	    .
Необходимые структуры данных - рис.11.2 включает образ GDT  с
нулевым дескриптором, 4-сегментных дескриптора, упомянутые на
стр.	   , и дескриптор TSS , упомянутый  на	стр.	. Для
удобства значения селектора для дескрипторов GDT перечислены:
    вход GDT  значение селектора	элемент
      0 	  0000h 	   Нулевой дескриптор
      1 	  0008h 	   Сегмент состояния задачи
      2 	  0010h 	   Сегмент кода супервизора
      3 	  0018h 	   Сегмент данных супервизора
      4 	  0020h 	   Сегмент кода пользователя
      5 	  0028h 	   Сегмент данных пользователя
   Последняя  необходимая  структура  данных  -   образ   IDT,
как рассмотрено на стр.    .Он	показан  на  рис.11.2.	Каждый
вход IDT - вентиль, а не селектор, и к нему обращаются по  его
позиционному номеру в IDT. Например, команда INTn будет давать
направление через вентиль n в IDT.
   Этот код и данные разрешают 80386-му защищенный режим. Т.к.
сегментный дескриптор супервизора и сегментный дескриптор кода
пользователя имеют D=1, 32-битный размер операнда и  32-битный
размер адреса - по умолчанию.
			   - 122 -
ASSUME	 CS:INITIAL,DS:TABLEDATA
INITIAL  SEGMENT  PUBLIC   AT  0F00h
	 ORG	  FFF0h
	 ASSUME   CS:INITIAL,DS:NOTHING,ES:NOTHING
RES_ADR: JMP	  BODY
	 ORG	  0D000h
BODY:	 LGDT	  GDT_PTR
	 LIDT	  IDT_PTR
	 MOV	  EAX,CR0
	 OR	  EAX,00000001h
	 MOV	  CR0,EAX
	 MOV	  AX,0018h
	 MOV	  SS,AX
	 MOV	  DS,AX
	 MOV	  ES,AX
	 MOV	  FS,AX
	 MOV	  GS,AX
	 JMP	  DEST_0FFSET,DEST_SEL
DEST:	 MOV	  ESP,00400000h
	 LTR	  SIMPLE_TSS_SEL
YOUR_SUPERVISOR:   .....
		   .....
		   .....
INITIAL  ENDS
	  Рис.11.1 32-битный защищенный супервизор
INITIAL  SEGMENT  PUBLIC   AT  0F000h
	 ORG	  0BFF0h
GDT_PTR: DW	  002Fh
	 DW	  C000h
	 DW	  0FFFFh
IDT_PTR: DW	  07FFh
	 DW	  C030h
	 DW	  0FFFFh
	 ORG	  0C000h
GDT:
GDT_0:
	 DD	  00000000b
	 DD	  00000000b
GDT_1:
	 DW	  0067h
	 DW	  8000h
	 DB	  0FFh
	 DB	  10001011b
	 DB	  00000000b
	 DB	  0FFh
GDT_2:
	 DW	  0FFFFh
	 DW	  0000h
	 DB	  0FFh
	 DB	  10011011b
	 DB	  10001111b
	 DB	  0FFh
GDT_3:
	 DW	  0FFFFh
	 DW	  0000h
	 DB	  0FFh
	 DB	  10010011b
	 DB	  10001111b
	 DB	  0FFh
			   - 123 -
GDT_4:
	 DW	  0FFFFh
	 DW	  0000h
	 DB	  0FFh
	 DB	  11111011b
	 DB	  10001111b
	 DB	  0FFh
GDT_5:
	 DW	  0FFFFh
	 DW	  0000h
	 DB	  0FFh
	 DB	  11110011b
	 DB	  10001111b
	 DB	  0FFh
GDT_END:
IDT:
IDT_0:
	 DW	  XXXXh
	 DW	  0010h
	 DB	  00h
	 DB	  11101111h
	 DW	  XXXXh
IDT_32:
	 DW	  XXXXh
	 DW	  0010h
	 DB	  00h
	 DB	  11100101h
	 DW	  XXXXh
IDT_33:
	 DW	  XXXXh
	 DW	  0010h
	 DB	  00h
	 DB	  11100101h
	 DW	  XXXXh
IDT_END:
INITIAL  ENDS
			  Рис.11.2
TABLEDATASEGMENT
TSS:
	 DD	  00000000h
	 DD	  00400000h
	 DW	  0000h
	 DW	  0018h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DD	  00000000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
			   - 124 -
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0000h
	 DW	  0FFFFh
TSS_END:
TABLEDATAENDS
			  Рис.11.3
       32-битный код и данные пользователя.
       ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Чтобы быть использованным,  код  пользователя  записывается
как код, соответствующий задаче или применению.
     Начальная	диспетчеризация  программы   пользовательского
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
			     уровня.
		       ДДДДДДДДДДДДДДДДДДДД
   Когда    код    супервизора	  используется	  для	 того,
чтобы диспетчеризовать пользовательскую программу (т.е. начать
выполнение  программы  пользовательского   уровня),   контроль
должен быть перенесен командой RET или IRET, почти  также, как
обслуживающая процедура  завершается  командой	IRET.  Однако,
т.к.   код   пользователя   фактически	 вызывается   с уровня
супервизора, код супервизора должен создавать  кадр  стека  на
этот стек.
   Требования кадра стека   перед  выполнением	RET  или  IRET
изображены на рис.11.4. Заметим,  что  показанный  кадр  стека
должен быть только кадром на стек супервизора, когда  RET  или
IRET выполняются. Это  требование  позволяет  установить  стек
супервизора, используя значения SS и ESP, содержащиеся	в  TSS
(см. рис.11.3).
	   Установка сегмента данных пользователя.
	   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   То, о чем особенно  нужно  упомянуть,  возникает  как  раз
перед  диспетчеризацией   супервизором	 кода	пользователя.
Необходимо, чтобы супервизор перемещал селектор для  сегмента
данных пользователя в каждый сегментный регистр DS, ES, FS, и
GS.  Значение  селектора  таково,  что	  он   обращается   к
дескриптору  для  сегмента  данных  пользовательского  уровня
(уровня 3). Этим действием программа делает доступным большой
сегмент данных	пользователя.  Как  описывается  дескриптором
сегмента данных в GDT, сегмент данных  -  32-битный  сегмент,
т.к. бит D дескриптора равен 1.  Дескриптор  сегмента  данных
появляется  как   показано   на   рис.8.3 и  приводится   как
дескриптор GDT_5 на рис.11.2. Этот дескриптор сегмента данных
указывает адрес  00000000h  и  предел  максимального  размера
FFFFFFFFh.  Сегмент  данных  пользователя,   таким   образом,
охватывает  всю  4-гигабайтную	область   прямой   адресации.
Регистры SS, DS, ES, FS и GS  все описывают  один  и  тот  же
сугмент максимального размера.
			   - 125 -
   Регистр  SS	загружается с селектором  в  сегмент   данных
пользователя  командами  RET  и   IRET,   используемыми   для
диспетчеризации программы пользователя. RET или IRET выделяют
переходы привилегированного уровня, т.к. они  выталкивают  из
кадра  стека  значение	CS   адресата	информации.   Адресат
информации CPL определяется в низших двух битах CS селектора.
При чтении значения адресата  информации  CPL,	отличного  от
настоящего значения CPL, 80386-й отмечает, что предполагается
переход с уровня на уровень.  Т.к.  для  адресата  информации
привилегированного уровня должен быть  использован  отдельный
стек, 80386, таким образом, продолжает работу до выталкивания
из  стека  информации,	а  именно   значения   ESP   адресата
информации и селектора SS адресата информации.
   Принимая во внимание вышеизложенное, пример кода  супервизора,
предназначенный для диспетчеризации  пользовательской  программы,
показан на  рис.11.5.  Пример  создает	кадр  стека  супервизора,
загружает  DS,	ES,  FS  и  GS	c  селектором  в  сегмент  данных
пользователя  и   выполняет   команду	IRET   чтобы   произвести
диспетчеризацию.  Заметим,  что  предположение	об  этом  подходе
позволяет  коду  пользователя  полностью  не  касаться	регистров
сегмента; сегмент данных пользователя доступен, начиная с момента
когда код пользователя начинает  выполнение.  Возможно,  конечно,
позволить коду пользователя загружать селектор	сегмента  данных,
но это грубый подход, т.к. он  требует,  чтобы	код  пользователя
"знал" необходимое точное значение селектора.
 Требуемый кадр стека на	  і Требуемый кадр стека на
 стек супервизора		  і стек супервизора
				  і
 Если диспетчеризация через	  і Если диспетчеризация через
 интерсегментную команду RET	  і команду IRET
				  і
     Начальный указатель стека	  і	Начальный указатель стека
     для стека супервизора  і	  і	для стека супервизора  і
Ъ___________________________і____їіЪ___________________________і_
___ї
і		 і	    щ	 ііі		    і	       щ    і
і		 і	    .	 ііі		    і	       .    і
і		 і		 ііі		    і		    і
і0000000000000000іСелектор для SSііі0000000000000000іСелектор для
 SSі
і		 ідля сегмента	 ііі		    ідля сегмента   і
і		 істека польз-ля ііі		    істека польз-ля і
і		 і		 ііі		    і		    і
іНачальн. ESP для стека польз-ля іііНачальн. ESP для стека польз-
ля і
і		 і		 ііі		    і		    і
і0000000000000000іСелектор для CSіііПользовательский образ в EFLA
G  і
і		 ідля сегмента	 ііі	 VM=0	    і  IOPL	    і
і		 ікода польз-ля  ііі		    і		    і
і		 і		 ііі		    і		    і
іНачальн. EIP для кода польз-ля  іііНачальн. EIP для кода польз-л
я  і
А		 Б		 ЩіА		    Б		    Щ
				  і
      Текущий указатель стека для і	 Текущий указатель стека для
      стека супервизора 	  і	 стека супервизора
Рис.11.4 Требования 32-битного кадра стека супервизора, предшеств
ую-
	 щие диспетчеризации пользовательской программы.
			   - 126 -
Когда код пользователя последовательно вызывает  программу  в
коде супервизора, программа супервизора должна протолкнуть по
стеку	значение  сегментного	регистра,    который	будет
использоваться,  и,  соответственно,  в  конце	обслуживающей
программы    вытолкнуть    начальные	значения    селектора
пользователя обратно в сегментные регистры перед  выполнением
команды IRET на пользовательском уровне.
	 PUSHF
	 SUB	  ESP,16
	 MOV	  [ESP+12],USER_STK_SEL
	 MOV	  [ESP+8], USER_STK_PTR
	 MOV	  [ESP+4], USER_CODE_SEL
	 MOV	  [ESP],   USER_INSTR_PTR
	 MOV	  ESP,EBP
	 MOV	  AX,USER_DATA_SEL
	 MOV	  DS,AX
	 MOV	  ES,AX
	 MOV	  FS,AX
	 MOV	  GS,AX
IRET
			  Рис.11.5
			  ЧАСТЬ 4
		   ВИРТУАЛЬНЫЙ РЕЖИМ 8086.
		   ДДДДДДДДДДДДДДДДДДДДДД
   Виртуальный	режим  8086  -	простой   механизм,   который
позволяет  программе  защищенного   режима   супервизора   на
привилегированном уровне 0 диспетчеризовать  программы	8086,
такие  как  программы  персональных   компьютеров   IBM,   на
пользовательском  уровне.  Виртуальный	режим	8086,	таким
образом,  позволяет  новым  80386  системам,   работающим   с
32-битным программным обеспечением, иметь  доступ  к  большой
базе   установленного	программного   обеспечения   PC.    С
виртуальным  режимом   8086  программное   обеспечение	 8086
выполняется  способом,	подчиняющимся  программе  супервизора
защищенного режима на привелегированном нулевом уровне.
   Просто из-за  его  пользы,  виртуальное  свойство  8086  -
хорошее  дополнение  к	многим	32-битным   80386   системам.
Приложение  G	дает   реальную,   тестируемую	 супервизором
программу, которая запускает PC-DOS в виртуальном режиме 8086
на любом персональном компьютере.
			ГЛАВА 12.
		ВИРТУАЛЬНЫЙ 8086 РЕЖИМ.
		ДДДДДДДДДДДДДДДДДДДДДД
   Предыдущая  глава   закончилась   обзором,	как   уровень
супервизора   80386    может	диспетчеризовать    программу
пользовательского уровня  32-битного  защищенного  режима.  В
зависимом режиме работы виртуальный  режим  80386  -  простой
механизм,     который	  позволет     уровню	  супервизора
диспетчеризовать программу 8086 на пользовательском уровне.
   Программы 8086, диспетчеризованные с  использованием  8086
виртуального режима могут быть с любым об`ектным  кодом.  Это
может  быть  просто  прикладная  программа  8086   или	 даже
операционная система 8086. Различие не	имеет значения,  т.к.
все коды, выполненные в виртуальном 8086 режиме, присваиваются
8086 кодам. Виртуальный 8086 режим полностью совместим с 8086
в том же смысле, в котором реальный режим 80386  совместим  с
8086.
			   - 127 -
	   Значение виртуального режима 8086.
	   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   После того,	как  отмечено  сходство  реального  режима  и
виртуального режима  8086,  следует  исследовать  отличие.  В
реальном режиме программа 8086, фактически, контролирует весь
80386,	  включая    разрешение/запрещение    прерываний    и
использование команд ввода/вывода. В виртуальном 8086  режиме
программа 8086 существенно обманывается в  "своих  мыслях"  о
том, что она контролирует все прерывания и ввод-вывод.
   Все	 виртуальные   программы    8086    выполняются    на
привилегированном  уровне  3.  Это  отличается	от  реального
режима, который неявно выполняяет (программы)  как  будто  на
привилегированном  уровне  0  (весь  ввод/вывод  допускается,
прерывания    могут    быть    разрешены/запрещены).	Менее
привилегированные  программы  виртуального  режима  позволяют
супервизору защищенного  режима  удерживать  высокий  уровень
контроля системы.
   Когда   виртуальная	 программа   8086   выполняется    на
привилегированном уровне  3,  большинство  команд  продолжает
работать верно, как и в  совместимом  реальном	режиме	8086.
Однако, команды, которые пытаются  находить  и	изменять  бит
флага прерываний или выполнять ввод/вывод вызывают  нарушение
основной  защиты   (13),   возвращая   управление   программе
супервизора. Супервизор определяет,  какая  команда  вызывает
нарушение   и	затем	соответственно	 эмулирует   команду.
Супервизор  окончательно  выполняет   команду	IRET,	чтобы
возобновить программу 8086, которая выполнялась в виртуальном
режиме 8086.  Работа  в  виртуальном  режиме  продолжается  с
высокой  скоростью  до	достижения   следующей	 ограниченной
команды.
	    8086 виртуальный режим диспетчеризации.
	    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Быстрое выполнение переключения задач, разговор о  котором
отложен до главы  15,  единственный  путь  диспетчеризации  в
виртуальном  режиме  8086  лежит  через   команду   IRET   на
привилегированном   уровне   0.   Техника    этого    подобна
диспетчеризации   программ    в    защищенном	 режиме    на
пользовательском уровне, как показано  на  рис.11.5.  Однако,
чтобы диспетчеризовать программу в виртуальном	режиме	8086,
программатор устанавливает VM бит в EFLAG-образ в стеке.  Бит
VM EFLAG-образа должен	быть  установлен  1.  Введенная  IRET
должна	 быть	 выполнена    в    защищенном	 режиме    на
привилегированном  уровне  0,  т.к.  только  на  этом  уровне
возможно, чтобы бит VM фактически  был	установлен  1  внутри
80386. На каждом менее привилегированном уровне  (1,  2,  3),
бит VM остается равным 0, даже если образ  в  EFLAG  в	стеке
содержит VM-образ 1. IRET должна  быть	в  32-битном  кодовом
сегменте (или в 16-битнном кодовом сегменте с префиксом  так,
что 32-битное значение загружается в EFLAG). VM-бит  занимает
17-й бит, внутри вышележащего слова в EFLAG.
   Т.к. команда IRET привилегированного уровня 0 читает  кадр
стека, если она установит, что	образ  в  EFLAG  имеет	VM=1,
80386 признает намерение  войти  в  виртуальный  8086  режим.
Таким образом, он  устанавливает,  что	соответствующий  кадр
стека подготовлен, как показано на рис.12.1.
   В кадре стека значения регистра таковы, что будут  вначале
использованы  программой,  диспетчеризованной  в  виртуальном
режиме 8086. Биты EIP и ESP выше 16-го должны быть  нулевыми,
что соответствует 16-битному виртуальному режиму работы 8086.
Значения селектора кадра стека для CS, SS, ES, DS,  FS	и  GS
читаются 80386-м, и адреса базовых сегментов генерирутся  как
			   - 128 -
умноженные на 16 значения  селектора,  что  является  обычным
использованием	  8086-м    значений	селекторов.    Адреса
базовых сегментов накапливаются в  регистре  дескриптора  КЕШ
80386-го.
80386-й затем автоматически  устанавливает  границы  сегмента
FFFFh для каждого виртуального сегмента 8086 в соответствии с
характеристиками 8086-го и имеет предел 64К в его  внутренних
регистрах дескрипторов КЭШ. 80386 также  устанавливает	права
доступа  в  соответствии  с  работой  8086  и  хранит  их  во
внутренних  регистрах  дескрипторов  КЭШ.  Всем   виртуальным
сегментам 8086 даны права доступа для  возможности  чтения  и
записи. Граница сегмента и  права  доступа  не	изменяются  в
течении виртуального режима 8086.
Детализация входа в виртуальный режим 8086 через команду IRET.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Когда образ в EFLAG в кадре стека устанавливается 1, команда
IRET уровня  0 вводит виртуальный режим 8086 следующими  шагами
(значение NT бита в образе EFLAG восстанавливается в  0,  чтобы
избежать переключения задачи):
 1. Чтение образа EFLAGS из стека, SS:[ESP+8], в регистр EFLAG.
Если  образ  EFLAGS  имеет   VM,   установленный   в   1,   это
устанавливает VM в режим 80386.
 2. Выталкивание  (из  стека)  указателей  команд  виртуального
режима	 8086	CS:EIP.   EIP	выталкивается	первым,   затем
выталкивается 32-битное слово, которое содержит CS в низших  16
битах. Если VM	равен  1,  загрузка  CS  будет	выполняться как
загрузка сегмента в режиме реального времени.
 3. Увеличение регистра ESP на 4, чтобы  обойти  образ	EFLAGS,
который был вытолкнут на шаге 1.
 4.  Если  VM  равен  1   -   загрузка	 сегментных   регистров
виртуального режима 8086 ES,  DS,  FS  и  GS  из  ячеек  стеков
SS:[ESP+8],    SS:[ESP+12],    SS[ESP+16]    и	   SS:[ESP+20],
соответственно,   где	используется   новое   значение    ESP,
сохраненное на 3-м шаге.
 5. Выталкивание указателя  стека  в  виртуальном  режиме  8086
SS:ESP из стека. ESP выталкивается первым, за  ним  следуют  32
бита, содержащие SS  в	низших	16  битах.  Т.к.  VM  равно  1,
загрузка SS, будет выполняться как загрузка сегмента  реального
режима.
 6. Начало (или возобновление) выполнения виртуальной программы
8086 как программы 3-го уровня.
	    Работа в виртуальном режиме 8086.
	    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   в виртуальном режиме 8086 размер операнда  данных  и  размер
адреса по умолчанию 16 бит, как в  реальном  режиме.  Некоторые
черты  80386,  имеющихся   в   реальном   режиме,   такие   как
дополнительные префиксы и дополнительные сегментные регистры FS
и GS, также имеются в виртуальном режиме 8086.
   Загрузка сегментрых регистров  выполняется  так  же,  как  в
реальном режиме: значение селектора умножается на  16  и  прямо
устанавливает базовый адрес сегмента, который 80386-й сохраняет
в его внутреннем регистре дескриптора КЭШ для  сегмента.  Также
как в реальном режиме на границы сегмента и  права  доступа  не
влияют загрузки сегментных  регистров:	они  остаются  FFFFh  и
имеется доступ для чтения и записи.
			   - 129 -
			   Требуемый кадр стека на стек
			   супервизора если диспетчеризация
			   программы происходит в виртуальном
			   8086 режиме (должна использоваться
			   команда IRET)
		     Начальный SS:ESP указатель
		  стека для стека супервизора (из TSS)
					      і
31	       16 15			      і 	 0
 _____________________________________________і___________
і		 і			      щ 	  і
і		 і			      . 	  і
і________________і________________________________________і
і0000000000000000іСелектор для GS для данных в виртуальномі
і		 і86 режиме				  і
і0000000000000000і "________"  FS  "____________________" і
і		 і					  і
і0000000000000000і "________"  DS  "____________________" і
і		 і					  і
і0000000000000000і "________"  ES  "____________________" і
і		 і					  і
і0000000000000000і "_______"  SS  для стека в виртуальном і
і		 і		      86 режиме 	  і
і     Начальн. EIP для стека в виртуальном 86 режиме	  і
і							  і
і     Начальный образ в EFLAG в виртуальном 86 режиме	  і
і							  і
і	  VM=1	 і  IOPL				  і
і		 і					  і
і0000000000000000і "_______"  CS  для кода в виртуальном  іі
і		 і		      86 режиме 	  іі
і							  іі
і     Начальн. EIP для кода в виртуальном 86 режиме	  іі
і_________________________________________________________іі
А							  Щщ
					    ш
     Текущий указатель стека для стека _____і	Более низкий
	      супервизора			адрес памяти
  Рис.12.1 Требования к кадру стека в  32-битном  супервизоре
до диспетчеризации программы в виртуальном режиме.
			   - 130 -
	Прерывание команды в виртуальном режиме 8086.
	 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   В зависимости от уровня во время виртуального  режима  8086,
установленного в битах 13 и 12 EFLAG-образа IRET  кадра  стека,
некоторые команды 8086 будут вызывать исключительную  ситуацию.
Т.к.  виртуальная  программа  8086  выполняется  как  программа
привилегированного уровня 3, значения IOPL 2, 1 или 0 оказывают
препядствующее	воздействие  на  некоторые  команды   во  время
виртуального режима 8086.
   Если IOPL - 2, 1 или 0, команды CLI, STI, PUSH, POPF и  INTn
вызывают исключительную ситуацию  общей  защиты (исключительная
ситуация 13), когда они появляются во время виртуального режима
8086. Если супервизор защищенного режима устанавливает одно  из
этих значений  IOPL,  виртуальной  программе  запрещена  прямая
визуализация и изменение флага прерываний.
   Таким  же  образом  команды	IN,  INS,  REP INS, OUT, OUTS и
REP OUTS могут вызывать исключительную	ситуацию  общей  защиты
(исключительная ситуация  13),если поразрядная карта разрешения
ввода/вывода   не   разрешает	ввод/вывод   по    специальному
включенному адресу ввода/вывода. Карта разрешения  ввода/вывода
допускает  очень   специфическое   управление	вводом/выводом,
позволющее контролировать ввод/вывод  на  port-by-port	основе.
Поразрядная карта,  как  произвольное  расширение   к	каждому
32-битному TSS, показана  на  рис.12.3.  Чтобы	подвести  итог,
заметим, что во время работы в виртуальном режиме 8086 IOPL  не
влиет на  возможность  выполнения команд  ввода/вывода.  Только
карта	 разрешения    ввода/вывода    управляет    разрешением
ввода/вывода во время виртуального режима 8086.
   Незадолго до  выполнения  переключения  задач,  исключительная
ситуация общей защиты должна быть создана вентелем прерывания или
вентелем системного прерывания, который указывает на сегмент кода
привилегированного уровня 0 (т.е. на уровень супервизора).  Когда
такая  исключительная	ситуация   возникает,	код   супервизора
эмулирует команду, достигающую	EIP  кадра  стека  после  команды
только	что  с`эмулированной,  и  выполняет  команду  IRET   для
возобновления виртуальной программы 8086.
   Конечно, команд защищенного	режима,  выполняяемых  только  на
привилегированном  уровне  0,  нет  в  виртуальном  режиме  8086.
Попытки выполнить эти команды приводят к исключительной  ситуации
общей защиты (исключительная ситуация 13). Однако,  на	практике,
существующие программы 8086 не пытаются выполнить такие  команды,
т.к.  их  коды	операций  и  регистры	защищенного   режима   не
реализованы в 8086.
		Выход из виртуального 8086 режима.
		ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   80386  выходит  из  виртуального  режима   8086   только   при
возникновении  исключительной  ситуации  (такой   как	ситуация,
вызванная чуствительной командой) или  прерыванием.  Эти  события
направляются через  вентиль  системного  прерывания  или  вентиль
прерывания в кодовый  сегмент  привилегированного  уровня  0  для
обслуживания.	Все   исключительные   ситуации   и    прерывания
направляются через IDT защищенного режима,  а  не  через  таблицу
прерываний 8086.
   Стек  привилегированного   уровня   0   после   прерывания	в
виртуальном режиме 8086 показан на рис.12.2, слева. Это, конечно,
то же самое, что и на рис.12.1, т.к. команда IRET используется	в
обоих случаях для диспетчеризации виртуальной программы 8086.
   Стек привилегированного уровня 0 после исключительной ситуации
во время виртуального режима 8086 также показан  на  рис.12.2.	В
зависимости  от  типа  исключительной  ситуации  в  стеке   может
появиться или не появиться ошибочный  код.  Каждый  данный  номер
			   - 131 -
исключительной ситуации ведет себя определенным образом;  или  он
всегда проталкивает (по  стеку)  ошибочный  код,  или  не  делает
этого,	как  показано  в  табл.12.1.  В  основном  исключительные
ситуации, относящиеся  к  специфическим  сегментам,  проталкивают
ошибочный код.	Исключительная	ситуация  отсутствия  страницы	в
оперативной  памяти  также  проталкивает  ошибочный  код.   Более
детальная информация об исключительных ситуациях  и  прерываниях,
включая точный формат кода ошибки, есть в главе 16.
      Детализация выхода через вентили прерывания и
	       системного прерывания.
      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Действие, производимое  80386-м  для  вентиля  прерывания  или
системного   прерывания,   когда   возникает	прерывание    или
исключительная ситуация во  время  работы  в  виртуальном  режиме
8086, описано детально ниже.
 1.  Сохранение  регистра  EFLAG   во	временный   регистр   для
проталкивания в стек супервизора позже. Сброс битов  VM  и  TF	в
ноль,  и  ,  если  прерывание/исключение  обслуживается  вентилем
прерывания, восстановление IF в ноль тоже.
 2. Вентиль прерывания или системного прерывания должен выполнять
переключение  с  уровня  3,  где   виртуальная	 программа   8086
выполняется,  на  уровень  0  так,  чтобы  команда   IRET   могла
передиспетчеризовать программу виртуального режима 8086  в  конце
обслуживающей программы. Процесс  вводит  переключатель  стека	в
стек нулевого уровня установленный в TSS  для  привилегированного
уровня 0 (см. рис.12.3). Загрузка SS и ESP регистров виртуального
режима 8086 во временный накопитель для  проталкивания	на  более
позднем  этапе.  Загрузка  сегментного	регистра  SS   уровня	0
выполняется как загрузка сегмента защищенного режима, т.к. бит VM
был восстановлен раньше.
Таблица 12.1 Краткое изложение кодов ошибок
		  исключительных ситуаций.
 _____________________________________________________________
і			    і		       і	      і
іИсключительная ситуация    іНомер (десятичн.) і Код ошибки   і
і___________________________і__________________і______________і
і			    і		       і	      і
іОшибка деления 	    і	     0	       і     No       і
іИсключительная  ситуация   і		       і	      і
і	   отладки	    і	     1	       і     No       і
іТочка прерывания	    і	     3	       і     No       і
іПереполнение		    і	     4	       і     No       і
іКонтроль границ	    і	     5	       і     No       і
іНеверный код операции	    і	     6	       і     No       і
іОтсутствие сопроцессора    і	     7	       і     No       і
іДвойная ошибка 	    і	     8	       і    Yes  *    і
іВыход за границы сегмента  і		       і	      і
і	   сопроцессора     і	     9	       і    Yes       і
іНеверный сегмент состояния і		       і	      і
і	   задачи	    і	    10	       і    Yes       і
іОтсутствие сегмента	    і	    11	       і    Yes       і
іИсключительное  состояние  і		       і	      і
і	    стека	    і	    12	       і    Yes       і
іИсключительное состояние   і		       і	      і
і  основной защиты	    і	    13	       і    Yes       і
іОшибка страницы	    і	    14	       і    Yes       і
і     /резерв/		    і	    15	       і    n/a       і
іЦифровая ошибка сопроцес-  і		       і	      і
і		    сора    і	    16	       і     No       і
і     /резерв/		    і	  17-31        і    n/a       і
і___________________________і__________________і______________і
    * Код ошибки всегда 0000000h
			   - 132 -
		 Начальный SS:ESP указатель
		  стека для стека супервизора (из TSS)
					      і
31	       16 15			      і 	 0
 _____________________________________________і___________
і		 і			      щ 	  і
і		 і			      . 	  і
і0000000000000000іСелектор для GS для данных в виртуальномі
і		 і86 режиме				  і
і0000000000000000і "________"  FS  "____________________" і
і		 і					  і
і0000000000000000і "________"  DS  "____________________" і
і		 і					  і
і0000000000000000і "________"  ES  "____________________" і
і		 і					  і
і0000000000000000і "_______"  SS  для стека в виртуальном і
і		 і		      86 режиме 	  і
і     Начальн. EIP для стека в виртуальном 86 режиме	  і
і							  і
і     Начальный образ в EFLAG в виртуальном 86 режиме	  і
і							  і
і	  VM=1	 і   IOPL				  і
і		 і					  і
і0000000000000000і "_______"  CS  для кода в виртуальном  і
і		 і		      86 режиме 	  і
і     Начальн. EIP для кода в виртуальном 86 режиме	  і
і_________________________________________________________і
А							  Щ
					    ш
					    і
     Текущий указатель стека для стека _____і
	      супервизора
     Прерывание или исключительная ситуация
     без кода ошибки
			   - 133 -
		  Начальный SS:ESP стек
		  Указатель для стека супервизора (из TSS)
					     і
31	       16 15			     і		 0
 ____________________________________________і____________
і		 і			     щ		  і
і		 і			     .		  і
і0000000000000000іСелектор для GS для данных в виртуальномі
і		 і86 режиме				  і
і0000000000000000і "________"  FS  "____________________" і
і		 і					  і
і0000000000000000і "________"  DS  "____________________" і
і		 і					  і
і0000000000000000і "________"  ES  "____________________" і
і		 і					  і
і0000000000000000і "_______"  SS  для стека в виртуальном і
і		 і		      86 режиме 	  і
і     Начальн. EIP для стека в виртуальном 86 режиме	  і
і							  і
і     Начальный образ в EFLAG в виртуальном 86 режиме	  і
і		 і					  і
і0000000000000000і "_______"  CS  для кода в виртуальном  і
і		 і		      86 режиме 	  і
і							  і
і     Начальн. EIP для кода в виртуальном 86 режиме	  і
і							  і
і		   Код ошибки				  і
і_________________________________________________________і
					    ш
					    і
     Текущий указатель стека для стека _____і
	      супервизора
     Исключительная ситуация с кодом ошибки
  Рис.12.2 Стек привилегированного уровня 0 после прерывания или
исключительной ситуации во время виртуального режима 8086.
 3. В стек на нулевом уровне проталкивание по порядку GS, FS,  DS
и ES. Каждый  из  этих	регистров  проталкивается  как	32-битная
величина, чтобы держать стек выровненным. Верхние 16  бит  каждой
величины равны	нулю.  Затем  загрузка	этих   четырех	регистров
нулевыми селекторами внутри,  чтобы  предотвратить  использование
старых значений программой нулевого уровня.
			      - 134 -
 4. Проталкивание регистра SS как 32-битн.  величины  с  верхними
битами равными 0. Проталкивание 32-битного регистра ESP.
 5.  Проталкивание  32-битного	регистра   EFLAGS,   cохраненного
вначале на 1-м шаге.
 6. Проталкивание регистра CS как 32-битн.  величины  с  верхними
битами равными 0. Проталкивание 32-битного регистра EIP.
 7. Загрузка новых CS и EIP из	вентиля  прерываний  или  вентиля
системных прерываний.  Загрузка  сегментного  регистра	CS  будет
выполняться как загрузка сегмента защищенного режима, т.к. бит VM
был восстановлен выше. Начало выполнения обслуживающей	программы
нулевого уровня в защищенном режиме.
   Поразрядная карта разрешения ввода /вывода в виртуальном
		     режиме 8086.
    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Команды ввода/вывода (IN, INS, REP INS, OUT, OUTS, REP и OUTS)
не чувствительны к IOPL в виртуальном режиме  8086.  Скорее,  эти
команды  становятся автоматически  чувствительными  к поразрядной
карте	разрешения  ввода/вывода,    необязательной    компоненте
32-битного   сегмента	состояния   задачи.   Карта    разрешения
ввода/вывода показана на рис.12.3 и 12.4.
   Как показывает рис.12.3, карта разрешения ввода/вывода  -  это
поразрядная карта, содержащаяся в  32-битном  сегменте	состояния
задачи. Размер карты и ее расположение в сегменте  TSS	различны.
Она  начинается  в  памяти  с  Bit_Map_Offset  в  TSS.	16-битное
значение Bit_Map_Offset 15.....0 устанавливается у  смещения  102
(десятичной.) в фиксированной части  TSS.  От  базового  смещения
(Bit_Map_Offset)  поразрядная	карта	разрешения   ввода/вывода
продолжается на 8 Кбайт или до границы TSS, до того, что меньше.
   Благодаря  использованию   указателя   базы	 побитной   карты
разрешения ввода/вывода, карта может  быть  расположена  в  любом
месте внутри TSS или может быть игнорирована полностью	указанием
смещения  Bit_Map_Offset  за  пределами   сегмента   TSS.   Из-за
регулирования предела TSS  для	усечения  побитной  карты  только
малая низшая часть 64 Кбайтной необходимой  области  ввода/вывода
имеет связанную побитную карту. Это устраняет блокирование 8К па-
мяти для того чтобы,при желании, был доступен более общий случай.
   Каждый бит в  побитной  карте  представляет	разрешение ввода/
вывода для однобайтового порта в области ввода/вывода, от 0-порта
до  порта   66535.   Если   бит   равен   0,   ввод/вывод   через
соответствующий однобайтовый порт может возникать в  вирттуальном
режиме 8086 без генерации иключительной ситуации. Если бит  равен
1 или если соответствующий бит находится  за  пределами  сегмента
TSS, попытка выполнить команду ввода/вывода приводит к	генерации
исключительной ситуации защиты (исключительная ситуация 13).
   Для порта ввода/вывода шириной  в  слово  оба  соответствующих
бита должны быть равны 0 для того,  чтобы  ввод/вывод  происходил
успешно; для порта ввода/вывода шириной в  двойное  слово  все	4
соответствующих  бита  должны  быть  равны  0,	чтобы  ввод/вывод
выполнялся успешно.
   Чтобы  корректно  реализовать  побитную   карту   ввода/вывода
требуется,  чтобы  байт  FFh  находился   за   последним   байтом
информации  карты  ввода/вывода.  Байт	FFh  должен  быть  внутри
границы сегмента TSS. Это требуется от байта FFh из-за того,  что
внутренний алгоритм 80386-го  считывает 2  байта  побитной  карты
ввода/вывода, когда бы ни происходило обращение к побитной карте.
   Рис.12.4 дает пример побитной карты	разрешения  ввода/вывода.
Т.к. нулевые биты, соответствующие портам байтового  ввода/вывода
там, где ввод/вывод разрешен, этот рисунок  показывает	доступные
порты 2-9,12,13,15,20-24,27,33,34,40,41,48,50,52,53,58-60,62,63 и
96-127.
			      - 135 -
						7		0
31			      16 15		ГДДДДДДДДДДДДДДДґ
						і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і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
96
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
92
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
88
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
84
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
80
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
76
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
72
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
68
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
64
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
60
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
56
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
52
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
48
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
44
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
40
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
36
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
32
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
28
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
24
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
20
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
16
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
12
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і*************SS=0**************і
і********************ESP=0**************************************і
і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і0 0 0 0 0 0 0 0і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
  Рис.12.3 32-битный ТSS для простой защищенной системы с полной
	   побитной картой разрешения ввода/вывода.
			      - 136 -
					  предел ТSS
					  ДДДДДДДДДДДДДДДї
							 і
						7	 щ	0
31			      16 15		ГДДДДДДДДДДДДДДДґ
						і1 1 1 1 1 1 1 1і 16
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
і0*0*0*0*0*0*0*0і0*0*0*0*0*0*0*0і0*0*0*0*0*0*0*0і0*0*0*0*0*0*0*0і
 12
і1*1*1*1*1*1*1*1і1*1*1*1*1*1*1*1і1*1*1*1*1*1*1*1і1*1*1*1*1*1*1*1і
 8
і0*0*1*0*0*0*1*1і1*1*0*0*1*0*1*0і1*1*1*1*1*1*0*0і1*1*1*1*1*0*0*1і
 4
і1*1*1*1*0*1*1*0і0*0*0*0*1*1*1*1і0*1*0*0*1*1*0*0і0*0*0*0*0*0*1*1і
 0
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
  Рис.12.4 Пример 16-байтной побитной карты разрешения ввода/выво
да.
			     ГЛАВА 13.
	    Пример виртуального режима 8086 для PC-DOS.
	     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
   Виртуальный	 режим	 8086	позволяет   любому    програмному
обеспечению 8086  выполняться  в  защищенном  режиме  80386.  Как
показывает таблица  13.1,  основные  практические  функции  могут
вытекать  из  виртуального  режима  8086,  и,  как  этот   пример
действительно демонстрирует, программное обеспечение PC-DOS может
быть выполнено в виртуальном режиме 8086  на  любом  персональном
компьютере с процессором 80386.  Пример,  диспетчеризованный  как
команда  в  PC-DOS,  пригоден  для   экспериментирования   любому
программисту,	имеющему   персональный   компьютер   с   80386-м
процессором.
 Таблица 13.1 Практические функции виртуального супервизора 8086.
_________________________________________________________________
1. Создание  сложной  среды  DOS  для  мультизадачной  и  фоновой
работы.
2.  Моделирование   совместимых   с   DOS   технических   средств
постраничной организации EMS и EEMS,  расширяющих  платы  памяти,
обеспечивающих совместимость с системами на 80386 процессорах без
дополнительного оборудования постраничонй организации.
3. Поддержка одновременно систем, не  сходных  с  8086,  например
PC-DOS и CP/M.
4. Поддержка операционной систем(ы) 8086 под защищенной 32-битной
операционной системой, например PC-DOS под UNIXом.
_________________________________________________________________
Этот	пример	   программного     обеспечения     -	  простая
программа-супервизор защищенного режима, запускаемая с клавиатуры
именем, как команда DOS. Другими словами, программа  _супервизор,
взятая в качестве примера, работает  как  обычное  применение  из
DOSа. Когда программа выполняется, она вызывает вход  80386-го	в
задачу защищенного режима на привилегированном уровне 0  и  затем
возвращает управление PC-DOS  в виртуальном режиме на уровне 3. С
точки зрения пользователя DOS,	рис.13.1,  DOS	продолжает  вести
себя  нориально,  обеспечивая  то,  что  виртуальный  режим  8086
позволяет программам  8086-го  функционировать	совместимо,  даже
если основной  компьютер  на  80386-м  находится  под  управленим
супервизорной программы защищенного режима  на	привелегированном
уровне 0.
			      - 137 -
   ЪДДДДДДДДДДДДї     ЪДДДДДДДДДДДДї	  ЪДДДДДДДДДДДДДї
   іc>		і     іc>vм_super  і	  іc>vм_super	і
   і		і     і 	   і	  іc>		і
   АДДДДДДДДДДДДЩ     АДДДДДДДДДДДДЩ	  АДДДДДДДДДДДДДЩ
1.Приглашение PC-DOS  2.Имя пользователя  3.Программа-супервизор
на персональном ком-  в виртуальной прог- завершается	во   2-й
пьютере, работающем   рамме супервизора   части.  Подсказка DOS
на 80386 процессоре.  8086.		  повторяется, но сейчас
					  80386 работоет в вирту-
					  альном режиме 8086. За-
					  мечания пользователя не
					  различаются.
Пример	 исследует   механизм	установки   защищенного   режима,
необходимой  до   начала   работы   защищенного   режима.   Когда
программа-супервизор начинает выполняться,    она  создает  общую
таблицу дескрипторов, таблицу дескрипторов прерываний  и  сегмент
состояния задачи, включающий поразрядную карту разрешения  ввода/
вывода, используемую  в  защищенном  режиме  80386.  Для  простой
программы-супервизора  побитная  карта	разрешения   ввода/вывода
заполняется единицами (1), разрешающими неограниченный ввод/вывод
на все порты. Когда эти необходимые структуры данных установлены,
супервизор разрешает защищенный режим.
   Условия защищенного режима, создаваемые примером супервизора -
задача.  Ее  основная  цель  состоит  в  возобновлении	DOSа  как
программы  виртуального   режима   8086.   Естественно,   память,
используемая для  вновь  созданных  GDT,  JDT  и  TSS  не  должна
перезаписываться,  когда  DOS  продолжает  работу,  поэтому   DOS
восстанавливается выполнением этим  супервизором  команды  RET	в
точке  входа  программы  прерывания   DOS   для   прерывания   39
("Terminate But Stay REsident in Memory")(Окончание с оставлением
резидента в памяти). Программа "Term. But St.  Res."  защищает
DOS  от  перераспределения  памяти,  где  хранится  супервизор
защищенного режима.
   Детали возврата в  программу  Term.	But  St.  Res."  очень
интересны.  При   непосредственной   подготовке   к   возврату
супервизор  делает  кадр  стека  на  стек  DOS,  как  если  бы
программа только  что  получила  сигнал  Term.	But  St.  Res.
прерывания 39  реального  режима.  Для	этой  цели  супервизор
помещает  кадр 6 байтов (FLAG, CS, и IP) в  стек  DOS.	Точные
значения не важны,  т.к.  такова  процедура  для  программного
прерывания. DOS  будет	регулировать  указатель  стека,  чтобы
освободить  6  байтов  в  области  стека.   Супервизор	 затем
фактически восстанавливает DOS, работая в  виртуальном	режиме
8086,  начиная	с  точки  входа  в  DOS  прерывания  39.   Для
максимальной   скорости   возврат   выполняется   просто   как
межуровневая  команда  RET;  не  нужна	отдельная  задача  для
виртуальной  программы	8086.  Чтобы  удобно   выполнить   эту
начальную команду RET в виртуальном  режиме  8086,  супервизор
помещает значения CS и IP для программы прерывания 39  в  кадр
стека на  стек	привилегированного  уровня  0,	инициализирует
образы стеков SS и SP для указания на стек DOS,  устанавливает
бит флага VM образа в EFLAG в стек и  выполняет  команду  RET,
чтобы  завершить  переход  с  уровня  на  уровень   и	начать
выполнение  виртуального  режима  8086.  DOS,  таким  образом,
восстанавливается с первой командой программы  Term.  But  St.
Res.,  и,  пока  DOS  может  различать,  программа  прерывания
вызывается в нормальном режиме командой INT 39	из  прикладной
программы в реальном режиме.
			      - 138 -
   С тех пор, как программа-супервизор вызвала	восстановление
DOS  (конечно,	в  виртуальном	режиме	8086),	 этот	пример
супервизора  выполняется  ,  например,	только	после	этого.
Характерно, что супервизор выполняется для  короткого  момента
времени,   когда   возникает   программное   или    аппаратное
прерывание,  но  он   выполняется   просто   для   направления
выполнения  к	DOS-   программе   для	 прерываний,   которое
появляется. Это выполняется в большинстве случаев тем же самым
образом как и при активизировании программы Term. But St. Res.
для начального запуска DOS в  виртуальном  8086  режиме.  Ясно
только, что FLAG, CS и IP  значения,  помещенные  в  стек  DOS
должны быть  точными,  так  как  DOS  будет  использовать  эти
величины при возврате из программы обработки прерываний.
	 Распечатка супервизором виртуального режима.
	  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Распечатка в приложении  G  -  полная,	полностью  проверенный
пример для разрешения защищенного режима и  запуска  программы
DOS,  в  виртуальном  8086  режиме   этот   код   может   быть
отранслирован с помощью ассемблера  8086,  так	как  некоторые
необходимые  коды  операции  защищенного  режима  должны  быть
определены, используя операторы DB.
		    Расширение вариантов.
		     ДДДДДДДДДДДДДДДДДДДД
Пример	 супервизора   устанавливает   "базовое   расположение
операции" в защищенном режиме, в которое могут быть  добавлены
дополнительные черты. Например,  таблицы  страниц  80386,  как
отмечено в п. 9, могут быть  созданы  и  впоследствии  сделаны
постранично доступными.
   На 80386  компьютерах  большое  практическое  использование
постраничных возможностей  80386-го  состоит  в  моделировании
аппаратуры   для   постраничного   разбиения,	встроенной   в
расширенные платы памяти (платы EMS и EEMS), доступные для PC,
основанных на 8086 и 80286.
   Аппаратура для  постраничного  разбиения,  содержащаяся  на
таких платах, управляется регистрами, адресующимися как  порты
ввода/вывода. При использовании поразрядной  карты  разрешения
ввода/вывода 80386 для	предотвращения	ввода/вывода  по  этим
адресам, попытка  ввода/вывода	в  контрольные	регистры  этих
полей  будет  приводить  к  Общей  ошибке  защиты  (ошибка  13
исключительной	 ситуации)   для   прерывания	программы   13
супервизора защищенного режима.
   Обслуживающая программа  в  супервизоре  может  эмулировать
функции  составления  EMS  или	 EEMS	карты	соответственно
регулировкой таблиц страниц 80386. Такая программа преобразует
требуюмую физическую память в  логические  адреса,  назнченные
расширенной картой памяти.  С  этим  подходом  приложения  DOS
могут  продолжать   использование   расширенной   памяти   без
необходимости внутренней аппаратуры постраничного разбиения.
   Обеспечение	нескольких  сред  виртуального	 8086	режима
становится   значительно    более    сложной	работой    для
супервизорного программного обеспечения, хотя это очень хорошо
поддерживается аппаратурой 80386-го. Ввод/вывод  и  прерывания
должны управляться супервизором, чтобы избежать конфликтов или
тупиковых ситуацийв множественном 8086 режиме.	Более  сложная
программа супервизора, особенно если она управляет виртуальным
множественным 8086 режимом, возможно может  производить  более
сложные действия, чем показано	на  примере  в	приложении  G,
который  просто  не  учитывает	прерывания.  Сложные  действия
обычно	служат	для   координации   доступа   к   перефирийным
устройствам, которые используются двумя или более независимыми
режимами 8086.


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