close

Вход

Забыли?

вход по аккаунту

?

ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, СИСТЕМЫ И СЕТИ

код для вставкиСкачать
Ф.В.ФИЛИППОВ
ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, СИСТЕМЫ И СЕТИ
УЧЕБНОЕ ПОСОБИЕ
Санкт - Петербург
2008
УДК 004(07)
Вычислительные машины, системы и сети: учебное пособие / сост. Ф. В. Филиппов - СПб.: Изд-во СЗТУ, 2008. - 197 с.
Рассматриваются принципы построения современных вычислительных машин (ВМ) и систем, архитектура составляющих компонент и система команд центральных и специализированных процессоров, язык ассемблера, особенности организации сетей различного назначения.
Специальность
220201.65 - Управление и информатика в технических системах
140211.65 - Электроснабжение Направления подготовки бакалавра 220200.62 - Автоматизация и управление Санкт - Петербург
Издательство СЗТУ
2008
Оглавление
Введение5
Раздел 1. Центральный процессор6
1.1. Архитектура центрального процессора6
1.2. Организация памяти и способы адресации11
1.3. Общая характеристика системы команд19
1.4. Команды пересылки данных19
1.5. Арифметические команды22
1.6. Сдвиги и логические команды24
1.7. Команды обработки строк данных25
1.8. Команды передачи управления28
1.9. Команды управления процессором32
Раздел 2. Арифметический процессор36
2.1. Архитектура арифметического процессора36
2.2. Программная модель арифметического процессора40
2.3. Система команд арифметического процессора46
Раздел 3. Эволюция характеристик ЦП56
3.1. Архитектура ЦП Pentium56
3.2. Программная модель ЦП Pentium60
3.3. Система команд ММХ-расширения62
3.4. Система команд SSE-расширения67
Раздел 4. Системные устройства ВМ76
4.1. Программируемый контроллер прерываний76
4.2. Программируемый контроллер ПДП80
4.3. Системный таймер85
4.4. Системные регистры88
Раздел 5. Защищенный режим работы ВМ92
5.1. Максимальный режим работы ЦП92
5.2. Дескрипторы и шлюзы97
Раздел 6. Язык ассемблера103
6.1. Программирование на языке ассемблера103
6.2. Директивы языка ассемблера ASM-86106
6.3. Использование регистров Pentium109
6.4. Директивы языка ассемблера ASM-89111
6.5. Модели программ, компиляция и отладка114
Раздел 7. Специфика вычислительных систем117
7.1. Мультипроцессорные системы117
7.2. Управление процессами122
7.3. Семафорные операции127
7.4. Разделение общих процедур130
7.5. Управление памятью132
Раздел 8. Специализированные процессоры и ВМ136
8.1. Процессор ввода-вывода136
8.2. Программная модель процессора ввода-вывода139
8.3. Система команд процессора ввода-вывода146
8.4. Процессор операционной системы154
Раздел 9. Назначение и топология сетей159
9.1. Особенности и назначение сетей различных типов159
9.2. Кодирование информации163
9.3. Назначение и структура пакетов165
9.4. Методы управления обменом168
9.5. Эталонные модели171
Раздел 10. Практическая реализация сетей177
10.1. Адресация в сетях177
10.2. Основные службы Internet179
10.3. Особенности web-дизайна181
10.4. Особенности и тенденции развития Internet184
Глоссарий ...........................................................................................187
Литература..........................................................................................197
Введение
В настоящее время вычислительные машины (ВМ) настолько широко используются во всех сферах человеческой деятельности, что знание в той или иной мере основ их строения и функционирования необходимо каждому образованному человеку. Применительно к специальности 220201.65 "Управление и информатика в технических системах" это знание должно быть весьма глубоким. Управление и информатика предполагает широкое использование различных вычислительных систем (ВС), построенных как на базе ВМ общего назначения, так и с использованием специализированных процессоров. Трудно также назвать область образования, науки, культуры или производства, где бы не использовались компьютерные сети. Тенденция повсеместного использования компьютерных сетевых технологий, существенное повышение скоростей передачи информации, применение беспроводных широкополосных каналов связи, позволяет говорить о том, что инженерам необходимо знания и навыки в применении на практике всех новых сетевых технологий.
Учебное пособие не претендует на полноту охвата всех аспектов, связанных с изучаемой дисциплиной. Задача, решаемая в нем, состоит в привлечении внимания к отдельным, основополагающим моментам связанным с архитектурой и программными моделями процессоров ВС и программируемых контроллеров. Изучении системы команд центральных и специализированных процессоров ВС, основ языка ассемблера и областей его применения. Отдельное внимание уделяется особенностям реализации компьютерных сетей различного назначения, а также тенденциям их развития и новым технологиям.
Благодаря огромным успехам мировой микроэлектронной технологии, все без исключения компоненты ВС претерпевают постоянные изменения. В этих условиях, знания фундаментальных основ, не претерпевающих изменений, а наоборот поддерживаемых фирмами изготовителями вычислительной техники будут всегда актуальными.
Ограниченный объем пособия не позволил достаточно подробно осветить все вопросы дисциплины "Вычислительные машины, системы и сети", поэтому для получения дополнительных сведений рекомендуется обратиться к соответствующим источникам, список которых включает 10 наименований. При работе над пособием автор неоднократно осуществлял заимствование из этих источников определений, примеров и методов изложения, без отдельных ссылок в тексте.
В заключение автор благодарит рецензентов и редакторов за внимательное прочтение рукописи и замечания, способствовавшие улучшению качества предлагаемого пособия.
Раздел 1. Центральный процессор
1.1. Архитектура центрального процессора
Существует много различных подходов к реализации структурной схемы (архитектуры) центрального процессора (ЦП). В нашей стране наибольшее распространение получила архитектура, предложенная американской фирмой Intel. Именно поэтому мы сосредоточим основное внимание на изучении процессоров, построенных по идеологии Intel и вычислительных машин, реализованных на базе этих процессоров фирмой IBM. Начнем с первого 16-разрядного процессора Intel 8086, разработанного еще в 1978 году и послужившего основой для разработки многих поколений ЦП, вплоть до Pentium 4.
При разработке Intel 8086 применены интересные архитектурные решения, к которым, в частности, относится разделение функций сопряжения с шиной и выполнения команд. В соответствии с этим структуру процессора (рис. 1.1, а) можно условно разделить на две части: блок сопряжения с шиной (БСШ) и исполнительный блок (ИБ). Блок сопряжения с шиной БСШ обеспечивает функции, связанные с выборкой операндов и кодов команд из памяти, запоминанием операндов, установлением очередности команд, а также формированием адресов операндов и команд. Исполнительный блок ИБ получает команды из очереди команд и указывает адрес операнда для БСШ. Операнды из памяти поступают через БСШ на обработку в ИБ, который выполняет предписанные операции и возвращает результаты в память через БСШ. Важно подчеркнуть, что эти блоки работают параллельно, причем БСШ обеспечивает извлечение кодов команд заблаговременно, в то время как ИБ выполняет текущую команду. Это повышает пропускную способность мультиплексированной шины адреса/данных ША/Д и увеличивает быстродействие ЦП.
Рассмотрим назначение и работу отдельных узлов микропроцессора Intel 8086. В нем имеется четырнадцать 16-разрядных регистров, которые по своему назначению можно разделить на три группы (рис. 1.1, б). Регистры АХ, ВХ, СХ, DX образуют группу регистров общего назначения (РОН). Эти регистры могут без ограничений участвовать в выполнении арифметических и логических операций. Некоторые другие операции, например операции над цепочками байтов и слов, предписывают регистрам данной группы специальное использование: АХ - аккумулятор, ВХ - база, СХ - счетчик, DX - данные. В отличие от регистров других групп РОН обладают свойством раздельной адресации старших и младших байтов. Поэтому РОН можно рассматривать как совокупность двух наборов 8-разрядных регистров: набора Н, содержащего АН, ВН, СН, DH, и набора L, содержащего AL, BL, CL, DL. Регистры всех других групп являются неделимыми и оперируют 16-разрядными словами, даже в случае использования только старшего или младшего байта.
Регистры SP, BP, SI и DI образуют группу указательных и индексных регистров, назначение которых заключается в том, что они содержат значения смещений, используемых для адресации в пределах текущего сегмента памяти. При этом регистры-указатели SP и ВР хранят смещения адреса в пределах текущего сегмента памяти, выделенного под стек, а индексные регистры SI и DI содержат смещения адреса в пределах текущего сегмента памяти, выделенного под данные. С этим связаны и обозначения регистров: SP - указатель стека, ВР - указатель базы, SI - индекс источника и DI - индекс места назначения. Регистры этой группы могут использоваться и как регистры общего назначения.
Регистры CS, DS, SS и ES, образующие группу сегментных регистров, играют важную роль во всех действиях ЦП, связанных с адресацией памяти. Обозначения регистров расшифровываются следующим образом: CS - кодовый или программный сегмент, DS - сегмент данных, SS - стековый сегмент и ES - дополнительный сегмент. Содержимое любого из этих регистров определяет текущий начальный адрес сегмента памяти, выделенного пользователем под информацию, соответствующую названию регистра.
Содержимое регистра CS определяет начальный адрес сегмента памяти, в котором располагается объектный код программы. Выборка очередной команды осуществляется относительно содержимого CS с использованием значения указателя команд IP. Содержимое регистра DS определяет начальный адрес текущего сегмента данных, так что обращение к данным в памяти ЦП осуществляет относительно содержимого DS. Для обращения к другим трем сегментам: дополнительному, стековому или программному - используется специальный указатель, который называется префиксом замены сегмента и располагается в соответствующих командах.
Содержимое регистра SS определяет текущий сегмент, выделенный для организации стека. Все обращения к памяти, при которых для вычисления адреса прямо или косвенно используются регистры ВР или SP, осуществляются относительно содержимого регистра SS. К таким обращениям относятся, например, все операции со стеком, включая и те, которые связаны с операциями вызова подпрограмм, прерываниями и операциями возврата. Обращения к данным, использующие регистр ВР (но не SP), могут производиться также и относительно одного из трех других сегментных регистров путем использования префикса замены сегмента.
Рис. 1.1. Архитектура центрального процессора Intel 8086 и его регистры.
Содержимое регистра ES определяет начальный адрес сегмента, рассматриваемого как дополнительный сегмент данных. В частности, обращения к данным в операциях с цепочками байтов или слов осуществляются относительно ES, а в качестве смещения берется содержимое DI.
Рис. 1.2. Регистр флагов
Кроме перечисленных регистров имеются два 16-разрядных регистра: IP - указатель команд и F - регистр флагов. В регистре IP формируется относительный (относительно CS) адрес команды, подлежащей исполнению. В регистре F (рис. 1.2) используются следующие девять разрядов: CF - перенос, PF - четность, AF - вспомогательный перенос, ZF - нулевой результат, SF - знак, TF - пошаговый режим, IF - разрешение прерывания, DF - направление, OF - переполнение. Неиспользованные разряды на рисунке заштрихованы.
Флаги AF, CF, PF, SF и ZF характеризуют признаки результата последней арифметической, логической или иной операции, влияющей на эти флаги. Установка флага производится в следующих случаях:
AF - при выполнении операции производится перенос "1" из младшей тетрады байта в старшую или осуществляется заем "1" из старшей тетрады;
CF - при переносе "1" из старшего бита байта (слова) или при заеме единицы в старший бит;
PF - если в представлении результата операции содержится четное число единиц;
SF - при получении "1" в старшем бите результата;
ZF - если в результате выполнения операции получено нулевое значение.
К этой группе флагов относится также флаг OF, который устанавливается при наличии переполнения в результате выполнения арифметических операций над числами со знаком.
Флаги DF, IF и TF используются для управления работой процессора. Флаг DF управляет направлением обработки данных в операциях с цепочками байтов или слов. При DF=1 цепочка обрабатывается снизу вверх, т. е. происходит автоматическое уменьшение (автодекремент) адреса текущего элемента цепочки. При DF=0 цепочка обрабатывается сверху вниз, т. е. происходит автоматическое увеличение (автоинкремент) адреса.
Флаг IF предназначается для разрешения или запрещения (маскирования) внешних прерываний. При IF = 0 внешние прерывания запрещены, т. е. процессор не реагирует на их запросы.
Флаг TF применяется для задания процессору пошагового режима, при котором процессор после выполнения каждой команды останавливается и ждет внешнего запуска. Пошаговый режим задается установкой флага TF= 1 и обычно необходим при отладке программ. Основные операции по обработке данных выполняются в арифметико-логическом устройстве (АЛУ), с которым связана схема коррекции результатов (СКР), используемая при работе с данными, представленными в двоично-десятичных кодах. Связь внутренних узлов ЦП с шиной ША/Д осуществляется через буфер шины БШ, состоящий из двунаправленных усилителей с тремя устойчивыми выходными состояниями.
Усовершенствование архитектуры Intel 8086 связано также с введением в структуру микропроцессора специального сумматора (СМ) для вычисления адресов памяти.
Как отмечалось выше, разрядность адресов микропроцессора равна 20. Однако для упрощения операций хранения и пересылки адресной информации процессор манипулирует 16-разрядными логическими адресами, к которым относятся начальные (базовые) адреса сегментов памяти и значения смещений в этих сегментах. Логические адреса используются для вычисления 20-разрядных физических (абсолютных) адресов с помощью следующей процедуры. Содержимое каждого сегментного регистра рассматривается как 16 старших разрядов А19-А4 начального адреса соответствующего сегмента. Младшие разряды A3-А0 этого адреса всегда полагаются равными нулю и поэтому не запоминаются в регистрах, а приписываются справа к старшим разрядам во время операции вычисления физических адресов. Эта операция выполняется сумматором адреса, расположенным в блоке БСШ, и состоит в сложении 20-разрядного начального адреса сегмента с 16-разрядным смещением, которое дополняется четырьмя старшими разрядами А19-А16, равными нулю, как показано на рис. 1.3. Сумматор адресов осуществляет, например, следующие вычисления: CS + IP - при выборке очередной команды, SS + SP - при обращении к стеку, DS + SI и ES + DI - при обработке строк, DS + EA- при обращении к запоминающему устройству с произвольной выборкой (ЕА - исполнительный адрес, формирование которого описано ниже).
Рис. 1.3. Вычисление физического 20-разрядного адреса
Поскольку младшие четыре разряда начального адреса любого сегмента должны быть равны нулю, значения начальных адресов сегментов выбираются кратными 16. Наибольшая емкость памяти, отводимой под один сегмент, определяется максимальным значением 16-разрядного смещения и составляет 64К байт. Рис 1.4. Пример размещения сегментов в памяти
В несложных системах с емкостью памяти не более 64К байт можно отказаться от сегментации памяти и установить все сегментные регистры в нулевое состояние. При этом 16-разрядный адрес смещения будет фактически абсолютным адресом. При использовании системы с большой емкостью памяти (до 1М байт включительно) начальные адреса сегментов задаются исходя из особенностей структуры программного обеспечения и данных, хранимых в памяти. На рис. 1.4 приведен пример размещения сегментов памяти.
1.2. Организация памяти и способы адресации
Важным моментом в изучении способов адресации является понятие логической и физической памяти. Как показано на рис. 1.5, память логически организуется в виде последовательности смежных байтов, которые образуют двухбайтовые слова, причем младшим байтам слов соответствуют меньшие значения адресов. Если многобайтовое слово записывается, как обычно, слева направо, то в память байты записываются в обратном порядке. Память с таким порядком размещения информации в словах называют памятью с "перевернутыми словами". В ВМ на базе Intel 8086 первые байты слов могут иметь как четные, так и нечетные адреса в памяти. Если слово начинается с четного адреса, обращение к нему произойдет в одном цикле, в то время как обращение к слову с нечетным адресом младшего байта займет два цикла. Поэтому для сокращения времени выполнения программ целесообразно располагать слова в памяти так, чтобы их младшие байты имели четные адреса.
a)
Рис. 1.5. Логическая (а) и физическая (б) организация памяти
В зависимости от типа команды операнд может представлять собой байт или слово и храниться в РОН или памяти. В большинстве команд для адресации операндов используется специальный байт, который называется постбайтом и размещается вслед за первым байтом, содержащим код операции. Рис. 1.6. Структура постбайта
Постбайт, структура которого представлена на рис. 1.6, указывает способ адресации одного или двух операндов и состоит из трех полей. Поля mod и r/т задают местоположение одного операнда следующим образом: если mod=11, то операндом является содержимое регистра, двоичный код (номер) которого задается в 3-разрядном поле r/т в соответствии с табл. 1.1а.
Если тod=11, то в полях mod и r/т содержится информация, согласно которой устанавливается один из способов адресации - прямая, косвенная регистровая, по базе, индексная и по базе с индексированием. Если для реализации выбранного способа адресации требуется дополнительная адресная информация, то она указывается в одном или двух байтах в виде смещения disp, которое следует непосредственно за постбайтом. Наличие или отсутствие смещения и его размерность определяются полем mod следующим образом:
* если mod = 00, то disp отсутствует;
* если mod=01, то disp размерностью 1 байт указывается за постбайтом, причем перед использованием этого смещения при формировании исполнительного адреса ЕА оно расширяется со знаком до 16 разрядов (расширение со знаком подразумевает заполнение старшего байта значением знакового разряда, указанного в disp);
* если mod=10, то за постбайтом следует 16-разрядное смещение disp, рассматриваемое как число со знаком.
Код
в поле
r/mЗначение исполнительного адреса ЕА000(BX+SI)+disp001(BX+DI)+disp010(BP+SI)+disp011(BP+DI)+disp100(SI)+disp101(DI)+disp110(BP)+disp111(BX)+disp Таблица 1.1б Таблица 1.1а Код
регистраРегистр16-разрядный8-разрядный000AXAL001CXCL010DXDL011BXBL100SPAH101BPCH110SIDH111DIBH Для каждой комбинации значений поля mod 00, 01 или 10 формирование исполнительного адреса ЕА определяется полем r/т в соответствии с табл. 1.1б. Исключение из описанных способов кодирования полей mod и r/т составляет случай mod=00, r/т=110, соответствующий EA = disp, причем disp- есть 16-разрядное смещение. Таким образом, при обращении к памяти имеется 24 варианта вычисления адреса ЕА, используемого в качестве смещения в сегменте при вычислении физического адреса. Рис. 1.7. Форматы команд центрального процессора
Поле reg постбайта используется для адресации тогда, когда в команде задаются два операнда. В этом случае второй операнд всегда находится в регистре, код которого указывается в поле постбайта в соответствии с табл. 1.1. В командах, где требуется только один операнд, поле reg постбайта используется совместно с байтом кода операции (КОП) для увеличения вариантов кодирования операций. Всего в ЦП используются восемь способов адресации, из которых пять реализуются с помощью постбайта. На рис. 1.7 представлены форматы команд, иллюстрирующие задание различных способов адресации.
Регистровая адресация. Операнд находится в одном из РОН, код которого указывается в байте КОП (рис. 1.7, а) или в постбайте при mod= 11 (рис. 1.7, б, в, д). В командах с двумя операндами может быть использовано два регистра, причем код второго задается полем reg постбайта в соответствии с табл. 1.1. В командах, оперирующих словами, байт КОП содержит w=1 и код регистра определяет один из восьми 16-разрядных регистров АХ-DI. В командах, операндами которых являются байты (w = = 0), код регистра определяет один из восьми 8-разрядных регистров AL-ВН в соответствии с табл. 1.1.
Непосредственная адресация. Операнд содержится в формате команды в виде одно- или двухбайтовой константы (рис 1.7, а, б). Этот способ задается особой комбинацией значений разрядов в поле КОП и может быть использован в большинстве команд с двумя операндами. Такие команды имеют постбайт, что делает возможным выполнение операций над константой и операндом, расположенным в памяти или регистре. Способ непосредственной адресации неприменим в командах загрузки сегментных регистров и в команде занесения данных в стек. В этих случаях используется промежуточная загрузка константы в один из регистров, указанных в табл. 1.1.
В командах с однобайтовыми операндами (w = 0) операнд имеет длину 1 байт и располагается в конце команды (рис. 1.7, а, б) в поле данных. В командах с операндами-словами (w = 1) операнд обычно занимает поле данных длиной 2 байт (рис. 1.7, а). Однако некоторые команды с операндами-словами могут иметь однобайтовый операнд, что указывается с помощью присвоения 1-разрядному полю s значения 1 (рис. 1.7, б). Если 5 = 1, то однобайтовое поле данных, содержащееся непосредственно в команде, перед использованием в операции расширяется со знаком до 16-разрядного слова. Расширение со знаком позволяет использовать 16-разрядные операнды в диапазоне значений от -128 до +127, которые в команде записываются однобайтовым операндом вместо двухбайтового. Двухбайтовый операнд используется в случаях, когда значение требуемого операнда (константы) выходит за пределы указанного диапазона.
Прямая адресация. Исполнительный адрес операнда задается с помощью двух байтов, которые следуют за первым байтом (рис. 1.7, г) или за постбайтом (рис. 1.7,д). Младший байт адреса идет по порядку первым. Прямая адресация позволяет обращаться к операндам в пределах одного сегмента памяти емкостью 64К байт.
Возможна также длинная прямая адресация, при которой команда содержит 16-разрядный базовый адрес сегмента, а также 16-разрядное смещение в сегменте (исполнительный адрес), что позволяет при программировании осуществить обращение к операнду, находящемуся в произвольном (не текущем) сегменте, т. е. в пределах всей памяти емкостью в 1М байт. Однако такой способ прямой адресации применим только в командах переходов и командах вызова подпрограмм, в которых он позволяет осуществлять межсегментные переходы. Невозможность применения этого способа адресации в командах, задающих операции над данными, представляет определенное неудобство.
Косвенная регистровая адресация. Исполнительный адрес операнда содержится в одном из регистров ВХ, SI или DI, код которого задается в постбайте (рис. 1.7, б, в, д).
Адресация по базе. Реализуется с использованием постбайта, в котором указывается один из регистров ВХ, ВР или DI, содержащий 16-разрядный базовый адрес. Исполнительный адрес операнда формируется путем сложения этого базового адреса и 8- или 16-разрядного смещения, указанного в команде непосредственно за постбайтом (рис. 1.7,6); 8-разрядное смещение рассматривается как число со знаком, т. е. его значение лежит в диапазоне от -128 до +127. Использование адресации по базе позволяет осуществить доступ к элементам упорядоченных структур данных, когда смещение конкретного элемента данных известно, а базовый адрес структуры вычисляется по программе.
Адресация с индексированием. В формате команды непосредственно за постбайтом задается 16-разрядный базовый адрес, а в постбайте указывается один из регистров ВХ, ВР, SI или DI, в котором хранится индекс (рис. 1.7, д). Адресация с индексированием логически эквивалентна адресации по базе с 16-разрядным смещением. Различие заключается в том, что 16-разрядное смещение интерпретируется как базовый адрес, а регистр хранит индекс. Однако поскольку любой из указанных четырех регистров может применяться как при адресации по базе, так и • при адресации с индексированием, указанное различие является несущественным.
Адресация по базе с индексированием. Если в предыдущих способах адресации либо базы, либо смещения были фиксированы при выполнении команды и задавались в формате команды непосредственно, то адресация по базе с индексированием позволяет задавать оба этих параметра в регистрах (рис. 1.7,б,в). Это дает возможность вычислить во время выполнения программы как базовый адрес структуры данных, так и смещение одного из ее элементов.
Поскольку любой из регистров ВХ и ВР может использоваться в качестве базового, а любой из регистров SI и DI может служить индексным, имеется четыре различные комбинации регистров, которые могут реализовать адресацию по базе с индексированием. Кроме того, адресация по базе с индексированием может быть дополнена 8- или 16-разрядным смещением, которое является третьим слагаемым при вычислении исполнительного адреса ЕА; 8-разрядное смещение, как и ранее, рассматривается как число со знаком, находящемся в диапазоне от -128 до +127.
Относительная адресация. Исполнительный адрес вычисляется как сумма содержимого указателя команд IP и 8- или 16-разрядного смещения со знаком, заданного непосредственно в команде (рис. 1.7, е). Следует подчеркнуть, что в момент вычисления исполнительного адреса значение указателя команд IP равно адресу первого байта следующей команды. Способ относительной адресации так же, как и прямая адресация, имеет ограниченное применение и используется только в командах переходов, вызова подпрограмм и управления циклами.
В завершение рассмотрения различных способов адресации отметим, что исполнительные адреса ЕА, получаемые описанными выше способами, являются в действительности 16-разрядными смещениями в сегменте. Как было показано на рис. 1.3, 20-разрядный физический адрес получается путем сложения смещения в сегменте с предварительно сдвинутым на четыре разряда влево базовым адресом сегмента. Поскольку имеется четыре сегментных регистра CS, DS, SS и ES, для выполнения каждого преобразования логического адреса в физический должен быть выбран определенный регистр, содержащий базовый адрес соответствующего сегмента. Это осуществляют аппаратные средства микропроцессора, которые автоматически выбирают сегментный регистр согласно цели каждого обращения к памяти, как показано в табл. 1.2. В таблице указан также источник логического адреса, определяющий смещение в сегменте.
В ряде случаев для эффективной передачи данных между сегментами удобно извлекать операнды, находящиеся в стековом сегменте, не прибегая к операциям со стеком. Это относится, например, к извлечению параметров подпрограмм, которые находятся глубоко в стеке. Для подобных целей существует специальный вид обращения к памяти с использованием базового регистра ВР. Данные, для доступа к которым используется регистр ВР, выбираются из стекового сегмента, причем содержимое регистра SS служит в этом случае базовым адресом, а смещение задается исполнительным адресом ЕА, в формировании которого участвует содержимое регистра ВР.
Таблица 1.2
Вид обращения к памятиСегментный регистрЛогический адресВыборка команды Операции со стеком Обращение к исходной строке Обращение к строке - результату ВР - базовый регистр Прочие обращения к переменнойCS
SS
DS*
ES
SS*
DS*IP
SP
SI
DI
EA
EA Примечание. Знаком * отмечены регистры, которые могут быть заменены на любые сегментные регистры при смене сегмента памяти с помощью префикса замены.
При выполнении команд обработки данных может появиться необходимость адресовать операнды, находящиеся вне текущего сегмента, выбираемого процессором автоматически. Для этих целей, как уже отмечалось, применяется префикс замены сегмента, имеющий размерность 1 байт. Префикс помещается непосредственно перед байтом кода операции и содержит код сегментного регистра, используемого в качестве замены.
Одной из особенностей Intel 8086 является наличие двух режимов - максимального и минимального, существенно отличающихся по функциональным возможностям. Для минимального режима ЦП характерно использование только тех управляющих сигналов, которые вырабатываются непосредственно на выводах микросхемы. Режим ЦП устанавливается путем соответствующего подключения вывода MN/MX к уровню "1" для минимального режима и к уровню "0" для максимального. В зависимости от выбранного режима изменяется назначение некоторых выводов ЦП. На рис. 1.8 приведены обозначения выводов микропроцессора, соответствующие минимальному режиму (MN/MX=1), а в табл. 1.3 указаны назначения выводов.
Режим ЦП устанавливается путем соответствующего подключения вывода MN/MX к уровню "1" для минимального режима и к уровню "0" для максимального. В зависимости от выбранного режима изменяется назначение некоторых выводов ЦП. На рис. 1.8 приведены обозначения выводов микропроцессора, соответствующие минимальному режиму (MN/MX=1), а в табл. 1.3 указаны назначения выводов.
Рис. 1.8. Условно-графическое обозначение микросхемы ЦП Intel 8086
Наиболее широко функциональные возможности обеспечиваются при использовании ЦП в максимальном режиме работы, который характеризуется тем, что вырабатываются дополнительные управляющие сигналы, обеспечивающие совместную работу центрального процессора с другими центральными процессорами или с сопроцессорами. Сопроцессоры берут на себя выполнение арифметических действий и реализацию обмена данными с внешними устройствами. Тем самым достигается существенное повышение производительности по сравнению с минимальным режимом.
Область применения ЦП в максимальном режиме и построенных на его основе ВМ определяется их способностью с большой скоростью выполнять сложные и высокоточные вычисления. При установке максимального режима изменяется назначение восьми выводов микропроцессора, что отражается в изменении их обозначений (рис. 1.8). На выходах s0, s1, s2 присутствует код состояния микропроцессора, характеризующий текущий цикл работы и определяющий способ использования ША/Д. Использование информации о состоянии ЦП позволяет в дальнейшем выработать все сигналы, необходимые для управления внешними устройствами ВМ.
Выводы RQ/GT0 и RQ/GT1 являются двунаправленными линиями, предназначенными для организации захвата системной шины другими устройствами. Вход запроса захвата RQ/GT0 имеет более высокий приоритет, а в остальном эти входы функционально эквивалентны. Захват начинается с поступления на один из входов RQ/GT запроса захвата шин длительностью в один такт от внешнего устройства (если запрос поступит одновременно на оба входа RQ/GT0 и RQ/GT1, то будет обслуживаться запрос по RQ/GT0). Во время очередного такта на этот вывод микропроцессор подает выходной сигнал, который информирует запросившее устройство о разрешении захвата. В следующем такте ЦП входит в режим захвата и устанавливает соответствующие выводы в высокоимпедансное состояние. По окончании использования системных шин ВУ информирует об этом ЦП сигналом освобождения шин, который также подается на вывод RQ/GT микропроцессора и имеет длительность 1 такт. Получив этот сигнал, ЦП возобновляет работу.
Таблица 1.3
Обозначение выводаВход/выходНазначение выводаAD15-ADOВход/выходМультиплексированная ША/ДAI6/S3-A19/S6ВыходЛинии адреса или состояния
BHE/S7ВыходРазрешение старшего байта шиныRDВыходУправление чтениемWRВыходУправление записьюM/IOВыходВыбор памяти или ВУALEВыходРазрешение фиксации адресаDT/RВыходУправление пересылкой данныхDENВыходРазрешение пересылки данныхMN/MXВходУстановка режимаTESTВходСигнал окончания режима ожиданияHOLDВход Запрос захвата шинHLDAВыходПодтверждение захватаINTRВходЗапрос прерыванияNMIВходЗапрос немаскируемого прерыванияINTAВыходПодтверждение прерыванияREADYВходГотовность памяти или ВУRESETВходСброс (начальная установка)CLKВходТакты ГТИGND, +5 вВходОбщий (земля), питание Вывод LOCK, так же как и рассмотренные выводы RQ/GT0 и RQ/GT1, служит для организации взаимодействия ЦП с внешними устройствами. Активный сигнал LOCK=0 вырабатывается с помощью специальной команды и позволяет в случае необходимости запретить захват шин ЦП внешними устройствами. Выводы QS0 и QS1 несут информацию о состоянии очереди из байтов команд. Для декодирования сигналов состояния микропроцессора s0, s1, s2 в систему (при использовании ЦП в максимальном режиме) включается системный контроллер Intel 8288, позволяющий осуществить полную развязку управляющей, адресной и информационной шин, а также различение ВУ и ЗУ при обращении к этим устройствам. Это позволяет полностью реализовать возможности адресации, предусмотренные в ЦП, т. е. возможности обращения к 1М байт памяти и 64К байт портов ввода-вывода.
1.3. Общая характеристика системы команд
Для удобства рассмотрения систему команд ЦП разбивают на шесть групп: команды пересылки данных, арифметические команды, логические команды и сдвиги, команды анализа и преобразования строк, команды передачи управления и команды управления микропроцессором. При изучении системы команд целесообразно пользоваться мнемокодом, т. е. символическим обозначением кода операции, и для каждого мнемокода давать набор всех форматов, определяющих различные способы его использования в программах.
В ряде случаев, особенно при разработке программного обеспечения для систем реального времени, важным является время выполнения той или иной программы, поэтому для каждой команды указывается число тактов n, требуемых для ее выполнения. Поскольку один и тот же формат команды может быть использован для задания различных способов адресации и, следовательно, различных способов вычисления исполнительного адреса ЕА (см. 1.2), то время выполнения такой команды будет равно n + Ta, где Ta - время, необходимое для вычисления исполнительного адреса. Конкретное значение Ta зависит от используемого способа адресации, расположения 16-разрядного операнда в памяти (с четного или нечетного адреса) и наличия или отсутствия префикса замены сегмента. Для определения Ta могут быть использованы следующие данные (способ адресации - число тактов):
Прямая с 16-разрядным смещением - 6
По базе или с индексированием - 5
По базе или с индексированием при наличии константы смещения - 9
По базе с индексирование - 7
По базе с индексированием при наличии константы смещения - 11
Здесь приведены значения Ta для 8- или 16-разрядных операндов, расположенных по четным адресам. Если 16-разрядный операнд расположен с нечетного адреса, то к указанному выше значению времени следует прибавить еще четыре такта, а в случае использования префикса замены сегмента добавляется еще два такта.
1.4. Команды пересылки данных
Различают четыре типа пересылок: общего назначения, с участием аккумулятора, адреса операнда и флагов. Ни одна из команд этой группы не влияет на флаги, за исключением двух команд, которые осуществляют явную загрузку регистра флагов F.
Пересылки общего назначения. Задаются с помощью четырех мнемокодов: MOV (переслать), PUSH (занести в стек), POP (извлечь из стека) и XCHG (обменять).
Команда MOV осуществляет пересылку байта или слова из источника в место назначения. В качестве источника и места назначения может служить регистр, память или сегментный регистр. Кроме того, источником могут являться данные (константы), непосредственно представленные в формате команды. Команда MOV часто используется в программах, что является одной из причин существования достаточно большого числа ее форматов. Выбор подходящего формата в определенной степени может оптимизировать программу по времени ее выполнения.
Команда PUSH служит для занесения содержимого 16-разрядного источника в стек. Источником операнда может являться регистр, сегментный регистр или память. Выполнению команды предшествует формирование адреса вершины стека: (SP) = (SP) - 2.
Команда POP служит для извлечения 16-разрядного операнда из стека и пересылки его в регистр, память или сегментный регистр. Операция извлечения из стека завершается формированием нового адреса вершины стека (SP) = (SP) + 2. Команда XCHG вызывает обмен байтами или словами между источниками. В качестве источников могут служить регистры и память. Команда имеет всего два формата, поскольку сегментные регистры не могут использоваться при обмене.
Пересылки с участием аккумулятора. Состоят из трех команд: IN (ввод), OUT (вывод) и XLAT (трансляция). В отличие от рассмотренных выше пересылок общего типа эти команды обязательно используют аккумулятор в качестве источника или места назначения операнда.
Команда IN служит для пересылки данных (байта или слова) из порта ввода в аккумулятор (в AL или АХ). Номер порта ввода может быть задан как непосредственно, во втором байте команды, так и косвенно, в регистре DX, причем только регистр DX из всех РОН может использоваться для этой цели. Если первый формат команды ввода позволяет адресоваться к 256 портам, то второй - к 216 = 65536 портам. Косвенное задание порта хотя и требует предварительной загрузки его номера в DX, однако позволяет организовывать программные циклы, в которых используется изменяющийся номер портов ввода. Команда OUT служит для пересылки данных (байта или слова) из аккумулятора (из AL или АХ) в порт вывода. Эта команда, как и команда IN, имеет два формата, которые определяют способ адресации порта вывода. Преимущества и недостатки использования каждого из форматов определяются теми же соображениями, что и для команды IN.
Команда XLAT осуществляет табличное преобразование кодов. Таблица размером не более 256 байт размещается в памяти, а ее начальный адрес - в регистре ВХ. При выполнении этой команды содержимое AL используется в качестве относительного адреса строки таблицы, из которой байт пересылается в AL.
Пересылки адреса операнда. Включают три команды: LEA (загрузить исполнительный адрес), LDS (загрузить указатель в DS) и LES (загрузить указатель в ES). Эти команды служат средством управления механизмом адресации операндов.
По команде LEA извлекается не сам операнд, а его исполнительный адрес ЕА. Действие команды состоит в передаче вычисленного 16-разрядного адреса операнда в 16-разрядный регистр, код которого указан в поле reg. Использование команды LEA удобно при составлении подпрограмм, работающих с параметрами. В этом случае перед вызовом подпрограммы выделенный регистр загружается адресом переменной, которая предварительно записана в память в качестве параметра. Например, подпрограмма оперирует с параметром, адрес которого содержится в РОН ВХ. Если перед вызовом этой подпрограммы выполнить команду LEA BX, ALPHA, где ALPHA - имя ячейки памяти, содержащей переменную, то подпрограмма будет использовать в качестве параметра переменную из ячейки ALPHA. Если же перед вызовом подпрограммы выполнить команду LEA BX, BETA, то в качестве значения параметра подпрограмма будет использовать значение переменной из ячейки с именем BETA.
Команды LDS и LES используются, в основном, при обращении к данным, находящимся вне текущих сегментов DS или ES, так, что возникает необходимость изменить базовый адрес сегмента. Пара 16-разрядных адресов - база сегмента и смещение в сегменте, называемая указателем, предварительно загружается в память. Относительный адрес указателя определяется значениями полей mod и r/т постбайта команды LDS (или LES). Значение смещения содержится в двух первых байтах указателя, а базовый адрес сегмента - в третьем и четвертом байтах. По команде LDS (или LES) происходит обращение к указателю и осуществляется загрузка регистра DS (или ES) базовым адресом, а смещение пересылается в регистр, указанный полем reg постбайта команды.
Пересылки флагов. Включают четыре однобайтовые команды: LAHF (загрузить АН флагами), SAHF (запомнить АН в регистре F), PUSH F (занести F в стек) и POP F (извлечь из стека в F).
По команде LAHF осуществляется пересылка младшего байта регистра флагов F в АН, а по команде SAHF - обратная пересылка. Эти команды введены в систему команд ЦП для упрощения программной совместимости с ВМ80. В частности, без их использования для реализации команд PUSH PSW и POP PSW BM80 с помощью команд ЦП потребовалось бы по 9 байт памяти, а использование, например, команды LAHF позволяет при реализации команды PUSH PSW обойтись всего двумя байтами: LAHF, PUSH AX. Команда PUSHF помещает содержимое регистра F в стек, причем сначала записывается старший байт, а затем младший байт регистра F.
1.5. Арифметические команды
Микропроцессор ЦП выполняет четыре основных арифметических действия - сложение, вычитание, умножение и деление над 8- и 16-разрядными данными со знаками и без знака. Числа со знаком представлены в ЦП в дополнительном коде и их диапазон составляет от -32768 до +32767. Для реализации арифметических действий над числами, представленными в двоично-десятичном коде, введены специальные команды коррекции результатов. Все арифметические команды влияют на флаги.
Операции сложения. Включают три мнемокода: ADD (сложить), ADC (сложить с учетом переноса) и INC (увеличить на единицу).
Команда ADD осуществляет сложение операнда источника с операндом места назначения. Источником и местом назначения обычно являются регистр и память, причем источником могут быть также данные (константы), непосредственно представленные в команде. В первом формате поле d определяет место назначения результатов сложения: при d = 1 - это регистр, а при d = 0 - память.
Во втором формате поле s определяет число байтов данных, непосредственно представленных в команде. При s=0 команда состоит из 4 байт, причем в двух последних записана 16-разрядная константа. При s=1 команда состоит из 3 байт и последний, третий, содержит 8-разрядную константу, которая предварительно (т. е. до сложения) расширяется со знаком до 16 разрядов. Напомним, что расширение со знаком состоит в распространении значения знакового разряда байта на весь старший байт; например, константа 5Аh будет расширена до 005Аh, а константа 8Аh - до FF8Аh.
Команда ADC выполняет операцию сложения двух операндов с прибавлением значения флага CF. Она используется для организации сложения многоразрядных чисел, двоичное представление которых превышает 16 разрядов. Сначала по команде ADD суммируются младшие разряды, а затем при сложении старших разрядов чисел используется команда ADC, которая позволяет учитывать единицу переноса. В качестве источника и места назначения операндов может служить регистр и память. Команда ADC имеет форматы, аналогичные форматам команды ADD.
Команда INC вызывает увеличение на единицу (инкрементирование) содержимого регистра или памяти. Необходимо отметить, что эта команда, так же как и команда DEC, влияет на все флаги, кроме CF.
Операции вычитания. Включают пять мнемокодов: SUB (вычесть), SBB (вычесть с учетом заема), DEC (уменьшить на единицу), NEG (изменить знак) и СМР (сравнить).
По команде SUB происходит вычитание операнда источника из операнда места назначения. Как и в команде сложения, операнды могут находиться в регистрах и памяти. В качестве вычитаемого может также служить операнд (константа), заданный непосредственно в команде.
Команда SBB служит для вычитания операндов с учетом заема, т. е. наряду с операндами в вычитании участвует значение флага CF.
Команда DEC вызывает уменьшение на единицу (декрементирование) содержимого регистра или памяти и имеет два формата, как и команда INC.
Команда NEG изменяет знак операнда, причем используется представление операнда в дополнительном коде. Например, если операнд есть -1 (11111111), то команда NEG изменит его на + 1 (00000001).
Команда СМР служит для сравнения двух операндов путем вычитания значения операнда места назначения из операнда источника. В отличие от обычного вычитания полученная разность никуда не заносится, а результатом операции сравнения являются значения флагов, которые устанавливаются в зависимости от соотношения сравниваемых операндов. Команда СМР имеет форматы, аналогичные команде вычитания.
Операции умножения. Включают два мнемокода: MUL (умножить) и IMUL (умножить числа со знаком).
По команде MUL происходит умножение без знака содержимого аккумулятора (AL или АХ) на операнд источника, а результат двойной длины возвращается в аккумулятор и регистр, используемый для его расширения (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов). Команда затрагивает только два флага CF и OF, которые устанавливаются в "1", если старшая половина результата отлична от нуля.
В отличие от операций сложения и вычитания обычное умножение чисел, представленных в двоичной системе счисления, дает правильные результаты только для чисел без знака. Например, если рассматривать умножение 8-разрядных чисел 11111111В x 11111111В = 1111111000000001В как 255 x 255 = 65 025, то результат будет правильным. Если же эти перемножаемые числа рассматривать как числа со знаком (-1) x (-1), то результат -511 будет неверным. Когда перемножаемые операнды и результат рассматриваются как числа со знаком, используется команда IMUL.
Операции деления. Включают два мнемокода: DIV (разделить) и IDIV (разделить числа со знаком).
По команде DIV происходит деление без знака операнда двойной длины, находящегося в аккумуляторе и регистре, используемом для расширения аккумулятора (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов) на операнд из заданного источника. Частное заносится в аккумулятор (AL или АХ), а остаток - в регистр расширения аккумулятора (АН или DX). При выполнении операции деления флаги принимают произвольные значения. При положительном частном, превышающем максимально допустимое значение max, или при отрицательном частном, которое меньше, чем 0 - (mах+1), частное и остаток будут иметь неопределенные значения и произойдет прерывание типа 0.
Особенность команды деления IDIV состоит в том, что частное и остаток всегда имеют одинаковые знаки. Например, при делении числа -47 на +3 из двух возможных результатов: -15 с остатком -2 и -16 с остатком +1, будет получен первый результат. Дробные значения частного округлены до ближайшего целого. Значения флагов при выполнении команды IDIV также не определены.
Операции коррекции результата позволяют выполнять арифметические действия над числами, представленными в двоично-десятичной системе счисления или в коде ASCII, используемом при обмене информацией и при вводе с клавиатуры. Для коррекции результатов сложения и вычитания чисел в двоично-десятичной системе служат команды DAA (коррекция сложения) и DAS (коррекция вычитания).
Аналогичным образом, но с вычитанием констант 6 и 60Н осуществляется коррекция результата вычисления в AL по команде DAS.
Поскольку для чисел, представленных в обычном двоично-десятичном коде, коррекция результатов умножения и деления невозможна, используется неупакованный двоично-десятичный код ASCII.
Для коррекции результатов арифметических действий над числами в коде ASCII используются четыре команды: AAA (коррекция сложения), AAS (коррекция вычитания), ААМ (коррекция умножения) и AAD (коррекция деления).
К группе арифметических операций относятся также две команды, которые осуществляют расширение со знаком 8- и 16-разрядных операндов. Эти команды играют вспомогательную роль при подготовке операнда, используемого в качестве делимого. Поскольку делимое при делении 8-разрядных операндов размещается в 16-разрядном аккумуляторе АХ (а при делении 16-разрядных операндов в 32-разрядном составном регистре DX, АХ), необходимо при подготовке делимого заполнить АН (или DX). Для чисел без знака указанные регистры заполняются нулями. При делении чисел со знаком перед заполнением указанных регистров требуется анализировать знак делимого и заполнить регистр либо нулями, если делимое является положительным, либо единицами, если делимое отрицательное. Для этих целей используются команды CBW (расширение со знаком байта до слова) и CWD (расширение со знаком слова до двойного слова). По команде CBW (CWD) знак AL (или АХ), т. е. самый старший разряд регистра, записывается во все разряды регистра АН (или DX).
1.6. Сдвиги и логические команды
Группа сдвигов и логических команд служит для реализации ряда функций, связанных с преобразованием и анализом операндов, которые размещаются как в регистре, так и в памяти.
Команды сдвига. Обеспечивают прежде всего удвоение чисел и деление пополам. Для удвоения числа без знака достаточно сдвинуть все его разряды на один влево, заполнив младший бит нулем. Поскольку старший бит при сдвиге передается в разряд CF, анализ значения этого флага позволяет судить о точности результата. Например, удвоение числа 65 (01000001) путем сдвига влево дает точный результат 130 (10000010), что определяется значением CF=0. Дальнейшее удвоение даст неправильный результат 4 (00000100), что определяется значением CF=1. Аналогично, используя сдвиг вправо, осуществляется деление числа без знака пополам. Например, сдвигая число 13 (00001101), получаем 6 (00000110) и CF=1, что свидетельствует о неточном результате.
Команды, выполняющие удвоение и деление пополам чисел без знака, имеют мнемокоды SHL (логический сдвиг влево) и SHR (логический сдвиг вправо) соответственно. Аналогичные операции для чисел со знаком реализуются с помощью команд SAL (арифметический сдвиг влево) и SAR (арифметический сдвиг вправо). Длина сдвигаемого операнда, как обычно, определяется полем w первого байта (w = 0 - 8-разрядный операнд, w = 1 - 16-разрядный операнд). С помощью любой из перечисленных команд сдвига операнд может сдвигаться на произвольное число разрядов до 8 или 16 включительно. Значение флага OF устанавливается равным "1", если окончательное значение бита знака при последнем сдвиге отличается от его предыдущего значения.
Логические команды. Служат для реализации четырех булевых функций: AND (поразрядное логическое И), OR (поразрядное логическое ИЛИ), XOR (поразрядная логическая сумма по модулю 2) и NOT (поразрядное логическое НЕ). Сюда также относится команда TEST (проверка), которая состоит в поразрядном логическом умножении (И) операндов без занесения результата умножения в место назначения и служит для анализа содержимого источника по значениям флагов. Все двухоперандные команды AND, OR, XOR и TEST имеют по три одинаковых формата и совпадают по времени исполнения. Однооперандная команда NOT осуществляет инвертирование операнда и имеет один формат. Следует отметить, что при выполнении логических команд флаги CF и OF не изменяют своих значений, а в соответствии с результатом операции устанавливаются флаги PF, SF и ZF. Флаг AF после выполнения логических команд имеет неопределенное значение.
1.7. Команды обработки строк данных
Строкой называют последовательность байтов или слов, размещаемую в смежных ячейках памяти. Примером может служить строка, которая вводится с терминала в ВМ. Операции со строками выполняются над каждым элементом строки (байтом или словом), так что время их выполнения пропорционально числу элементов в строке. В ЦП имеется несколько однобайтных команд, выполняющих простые операции над строками. Эти команды значительно ускоряют манипуляции над строками благодаря уменьшению времени, затрачиваемого на обработку каждого элемента и на вспомогательные действия, которые необходимо выполнять между обработкой последовательных элементов. К вспомогательным действиям относятся: переадресация элемента строки, уменьшение на единицу счетчика числа обрабатываемых элементов и проверка достижения счетчиком нуля.
Для иллюстрации временных затрат на обработку одного элемента строки рассмотрим процесс пересылки строки из одной области памяти в другую. Для указания начального адреса первого элемента исходной строки и строки результата используются регистры SI (индекс источника) и DI (индекс места назначения) соответственно, число пересылаемых элементов задается в регистре-счетчике СХ. Пересылка строки заключается в выполнении следующих шагов (при описании каждого шага указана соответствующая команда):
1: JCXZ Exit; если СХ=0, то пересылка закончена
2: MOVAL, [SI] ; переслать байт из в AL
3: MOV[DI], AL; запомнить содержимое AL в памяти
4: INC SI; увеличить SI на "1"
5: INCDI; увеличить DI на "1"
6: DEC СХ; уменьшить СХ на "1"
7: JNZ 1; перейти к шагу 1.
Собственно пересылка байта выполняется на шагах 2 и 3. На шагах 4 и 5 осуществляется вычисление адресов источника и места назначения для следующего элемента строки. Наконец, шаги 1, 6 и 7 служат для определения числа обработанных элементов.
Действия, которые выполняются с помощью указанных четырех команд на протяжении шагов 2-5, могут быть выполнены с помощью одной команды MOVS (переслать элемент строки). Для организации циклического исполнения команды MOVS (а также других команд обработки строк) используется однобайтовая команда-префикс REP (повторить). Она записывается перед основной командой (например, REP MOVS) и обеспечивает ее выполнение N раз. Число повторений N предварительно записывается в регистр СХ и на каждом шаге содержимое СХ уменьшается на единицу. Используются три мнемокода команды-префикса: REP, REPNE/REPNZ и REPE/REPZ. Первый мнемокод анализирует только одно условие окончания повторений: (СХ)=0. В тех случаях, когда возникает необходимость дополнительно анализировать условие ZF=0 (или ZF=1), используется второй (или третий) мнемокод. Команда REP позволяет еще больше сократить время на обработку элементов строки за счет совмещения операций (СХ) = (СХ) - 1 с проверкой достижения счетчиком нуля. Так, совокупность действий, выполняемых за семь указанных выше шагов, может быть выполнена командой MOVS с префиксом REP.
В ряде случаев возникает необходимость в пересылке строки в обратном порядке, начиная не с первого, а с последнего ее элемента. Например, требуется переслать строку, содержащую 10 байт и расположенную в памяти, с относительного адреса (SI) = 200 по (SI) = 209 в область памяти с относительного адреса (DI)=205 no (DI) =214. Ясно, что такую пересылку нельзя выполнять начиная с первого элемента, так как области памяти с исходной строкой и строкой-результатом перекрываются и первая же пересылка "испортит" значение пятого элемента исходной строки. Требуемую пересылку строк можно осуществить начиная с последнего элемента исходной строки. В этом случае следует установить начальные адреса элементов строк равными (SI) =205 и (DI) =214. Кроме того, при пересылке каждого элемента необходимо не увеличивать, а уменьшать на единицу содержимое индексных регистров SI и DI. Направление передачи устанавливается с помощью флага DF: при значении DF=1 происходит автодекрементирование индексных регистров, а при значении DF=0 - автоинкрементирование.
Когда в качестве элементов строк используются не байты, а слова, соответствующее увеличение или уменьшение значений индексных регистров осуществляется на два, т. е. при DF=1: SI = SI - 2; DI = DI - 2, а при DF=0: SI = SI + 2, DI = DI + 2.
Кроме команды MOVS для действия со строками имеется еще четыре команды: CMPS (сравнение элементов строк), SCAS (сканирование элементов строки), LODS (загрузка элемента строки) и STOS (заполнение элемента строки).
Команда CMPS позволяет осуществить поэлементное сравнение двух строк, одна из которых располагается в памяти с относительного адреса, указанного в SI, а вторая - с относительного адреса, указанного в DI. По команде CMPS производится вычитание элемента строки с адресом в SI из элемента строки с адресом в DI. Как обычно, при выполнении операции сравнения результат вычитания не фиксируется, а устанавливаются соответствующие значения флагов, по которым определяется результат сравнения. По аналогии с командой MOVS при сравнении изменяются значения индексных регистров по правилу: SI = SI ± А; DI = DI ± A, где " + " - используется при DF=0; "-" - при DF=1; А=1- при w = 0; А = 2 при w=1.
Для циклического повторения команды CMPS используется префикс повторения REPNE/REPNZ или REPE/REPZ.
По команде сканирования SCAS производится сравнение значения элемента строки, расположенной с относительного адреса, который указан в DI, со значением AL. При этом также осуществляется операция вычитания, результат которой не фиксируется. Одно из возможных применений команды сканирования состоит в отыскании элемента строки, равного заданному образцу.
Образцовый элемент загружается в AL и затем организуется цикл сканирования с использованием префикса повторения REPE/REPZ. Как и при выполнении предыдущих команд, каждый раз по команде SCAS производится автоинкремент (или автодекремент) адреса элемента: (DI) = (DI) ± A.
Две следующие команды LODS (загрузка элемента строки) и STOS (запись элемента строки) позволяют загружать элементы строки в аккумулятор и записывать содержимое аккумулятора в строку. При выполнении этих команд осуществляется подготовка адреса следующего элемента строки, т. е. модифицируется содержимое соответствующего индексного регистра. Однако повторение команды LODS обычно не используется, а повторение команды STOS, организуемое с помощью префикса REP, применяется при загрузке строки константой, предварительно помещенной в аккумулятор.
Рассмотренные выше команды работы со строками реализуют относительно простые операции, на базе которых можно организовать более сложные операции обработки строк.
1.8. Команды передачи управления
В группе команд передачи управления различают четыре типа команд: безусловные переходы, условные переходы, циклы и прерывания.
Команды безусловных переходов. Включают три мнемокода: JMP (безусловный переход), CALL (вызов подпрограммы) и RET (возврат из подпрограммы).
Команда JMP позволяет осуществить переход в любую точку программы, расположенную как в текущем программном сегменте, так и в другом сегменте. При переходе в пределах текущего программного сегмента используются первые три формата команды JMP.
Первый формат обеспечивает переход в произвольную точку программы внутри текущего программного сегмента, для чего к содержимому IP добавляется в дополнительном коде 16-разрядное смещение, старший разряд которого является знаковым. Второй, укороченный формат позволяет перейти к точке программы, отстоящей не более чем на -128-f-127 адресов от команды JMP. Наконец, третий формат осуществляет загрузку указателя команд 16-разрядным числом, которое размещено по исполнительному адресу ЕА, определяемому постбайтом. Этот переход называется косвенным, так как используется косвенная адресация.
Для реализации безусловного перехода к точке программы, расположенной вне текущего программного сегмента, когда требуется перезагрузка сегментного регистра CS, используются четвертый и пятый форматы команды JMP.
Четвертый формат определяет прямой межсегментный переход, при котором во втором и третьем байтах формата указан относительный адрес точки перехода, а в четвертом и пятом байтах- новое значение CS. Пятый формат с помощью постбайта позволяет определить исполнительный адрес ЕА, по которому находится относительный адрес точки перехода (в байтах памяти с адресами ЕА, ЕА+1), и новое значение CS (в байтах памяти ЕА+2, ЕА+3).
Команда CALL позволяет вызвать подпрограмму, расположенную как в текущем программном сегменте, так и в другой области памяти. Она имеет такие же форматы, что и команда JMP, за исключением укороченного. В отличие от команды JMP аналогичного формата по команде CALL перед изменением значений IP или IP и CS происходит автоматическая запись в стек текущих значений этих регистров, что обеспечивает запоминание точки возврата из подпрограммы.
Для возврата из подпрограммы используется команда RET, под действием которой происходит передача управления по адресу возврата, занесенному в стек при выполнении предыдущей команды CALL. При возврате из подпрограмм, расположенных в текущем программном сегменте, применяются первые два формата команды RET, причем второй формат отличается от первого тем, что к содержимому указателя стека добавляется константа, записанная во 2-м и 3-м байтах команды. Это позволяет одновременно с возвратом из подпрограммы сбрасывать параметры, записанные в стек при выполнении этой подпрограммы и не используемые в дальнейшем.
Для межсегментного возврата применяются третий и четвертый форматы RET, которые обеспечивают восстановление содержимого как указателя команд, так и программного сегмента.
Команды условных переходов. Осуществляют передачу управления в зависимости от результатов предыдущих операций. Различают три разновидности условных переходов, которые используются для установления соотношений чисел со знаком, чисел без знака и произвольных чисел. В первых двух разновидностях для одних и тех же соотношений между числами выбираются различные мнемокоды команд, поскольку одним и тем же соотношениям чисел со знаком и чисел без знака соответствуют различные значения флагов.
В мнемокодах команд условных переходов при сравнении чисел со знаком для обозначения условия "больше" используется буква G (Greater - больше), а для обозначения - "меньше" буква L (Less - меньше). Для аналогичных условий при сравнении чисел без знака используются соответственно буквы A (Above- над) и В (Below - под). Условие равенства обозначается буквой Е (Equal - равно), а невыполнение некоторого условия - буквой N (Not - не). Следует отметить, что допускается исползование двух различных мнемокодов для каждой команды; например, мнемокоды JL и JNGF - эквивалентны, поскольку условия "меньше" и "не больше или равно" - идентичны.
Полный список мнемокодов команд, проверяемых условий, а также соответствующие булевские комбинации флагов и их значения приведен в табл. 1.4.
Таблица 1.4
Мнемокод командыУсловиеЗначение флаговДля чисел со знакомJL/JNGEМеньше/не больше или равноSF + OF = lJNL/JGEНе меньше/больше или равноSF + OF = 0JG/JNLEБольше/не меньше или равно(SF + OF) V ZF = 0JNG/JLEНе больше/меньше или равно Для чисел без знака(SF + OF) V ZF = lJB/JNAEМеньше/не больше или равноCF = 1JNB/JAEНе меньше/больше или равноCF = 0JA/JNBEБольшеCF V ZF = 0JNA/JBEНе больше
Для прочих данных
CF V ZF = 1JE/JZРавно/по нулюZF = 1JNE/JNZНе равно/по нулюZF = 0JSПо минусуSF = 1JNSПо плюсуSF = 0JOПо переполнениюOF = lJNOПо отсутствию переполненияOF = 0JP/JPEПо четному паритетуPF = 1JNP/JPOПо нечетному паритетуPF = 0 Все команды условных переходов имеют одинаковый двухбайтовый формат, в первом байте которого задается код операции (КОП), а во втором - 8-разрядное смещение, которое рассматривается как число со знаком и, следовательно, позволяет осуществлять изменение адреса в диапазоне от -128 до +127. При необходимости более отдаленного ("дальнего") перехода по выполнению условия используется дополнительно команда безусловного перехода.
Время выполнения каждой из команд условных переходов указано для двух случаев: 1) условие выполнено и управление действительно передается в соответствии со смещением, 2) условие не выполнено, так что управление передается следующей команде.
Команды организации циклов. Введены в ЦП для удобства выполнения вычислительных циклов. К ним относятся следующие мнемокоды: LOOP (цикл, пока (СХ) не равно 0), LOOPNZ/LOOPNE (цикл, пока не нуль/не равно), LOOPZ/LOOPE (цикл, пока нуль/равно) и JCXZ (переход по нулю в СХ). Каждая из этих команд имеет двухбайтовый формат, во втором байте которого указывается 8-разрядное смещение, используемое для организации перехода. Это смещение рассматривается как число со знаком и перед вычислением адреса перехода оно расширяется со знаком до 16 разрядов. Используя команды циклов совместно с командами манипуляции элементами строк, можно составлять достаточно сложные программы преобразования строк. Рассмотрим пример составления программы для перевода строки данных, записанных в шестнадцатеричной системе счисления, в некоторый код, для которого перекодировочная таблица находится в памяти с начального адреса, указанного в ВХ, как это требуется для использования команды табличного преобразования кодов XLAT. Пусть далее исходная строка содержит 80 элементов и находится в памяти с относительного начального адреса 100, а строка-результат должна быть размещена с относительного адреса 200. Программа, выполняющая перекодировку исходной строки в строку-результат, при значении флага направления DF=0 будет иметь вид:
MOV SI ,100
MOV DI ,200
MOV СХ , 80 TRANSLATE:LODS
XLAT
STOS
LOOP TRANSLATE
Здесь использована команда табличного преобразования кодов XLAT, описанная в 1.2.
Команды прерывания. Включают три мнемокода: INT (прерывание), INTO (прерывание при переполнении) и IRET (возврат из прерывания).
Команда прерывания INT при v = 1 имеет двухбайтовый формат, второй байт которого содержит 8-разрядное число, определяющее тип (type) или уровень прерывания. По команде INT type процессор переходит к выполнению программы обслуживания прерывания указанного уровня, причем автоматически выполняются действия, необходимые для обеспечения возврата в точку прерывания. Эти действия состоят в следующем: содержимое регистра флагов F записывается в стек (PUSHF), сбрасываются флаги IF и TF, текущие значения регистра CS и указателя команд IP записываются в стек.
Для определения начального адреса программы обслуживания в соответствии со значением type используется таблица уровней прерывания. Для каждого из 256 уровней прерываний в этой таблице отведено по четыре байта: первые два байта определяют значение указателя команд IP, вторые - значение сегментного регистра CS. Эта четверка байтов определяет начальные адреса программ обслуживания (пары значений CS, IP), которые должны быть предварительно записаны в ячейки памяти по абсолютным адресам 0-3FFH. Адрес таблицы, соответствующий указанному в команде INT type уровню прерывания, определяется в ЦП следующим образом. После запоминания в стеке текущих значений CS и ГР осуществляются загрузки: CS = type x 4 + 2 и IP = type x 4. Новые значения CS и IP, взятые соответственно из ячеек с адресами type x 4 + 2 и type x 4, определяют начальный адрес требуемой программы обслуживания. Рассмотренная выше команда прерывания INT при значении поля v = 0 имеет однобайтовый формат, т. е. не требует специального указания уровня прерывания. Эта команда автоматически воспринимается процессором как прерывание третьего уровня (type=3) и обычно используется в программах в качестве контрольной точки.
Команда прерывания при переполнении INTO вызывает переход на обслуживание прерывания четвертого уровня (type = 4) в случае, когда значение флага переполнения OF = 1. Команда INTO обычно используется после арифметических команд над числами со знаком. Обычно несколько первых уровней прерываний (до 32) резервируются под обработку ряда специфических ситуаций, таких, например, как попытка деления на нуль, переполнение и тому подобных. Особенность обработки прерываний зарезервированных уровней состоит в том, что процессор переходит к их обслуживанию независимо от значения флага IF разрешения прерываний.
Однобайтовая команда IRET ставится в конце каждой программы обслуживания прерывания и обеспечивает возврат из прерывания. По этой команде процессор извлекает из стека значение указателя команд IP и программного сегмента CS, а также восстанавливает прежнее содержимое регистра флагов F (как и по команде POPF). При необходимости содержимое остальных регистров ЦП, соответствующее прерываемой программе, может быть запомнено в стеке при переходе на программу обслуживания и затем восстановлено при возврате из нее с помощью команд обращения к стеку.
1.9. Команды управления процессором
В группе команд управления процессором различают три типа: операции с флагами, установки ЦП в особые состояния и синхронизации с сопроцессорами.
Операции с флагами. Включают семь мнемокодов команд: STC (установка флага переноса CF), CMC (дополнение флага переноса CF), CLC (сброс флага переноса CF), STD (установка флага направления DF), CLD (сброс флага направления DF), STI и CLI (соответственно установка и сброс флага разрешения прерывания IF).
Назначение перечисленных команд очевидно. Так, команды STC CMC и CLC позволяют задавать требуемое исходное значение флага CF при различных арифметических и логических преобразованиях данных и сдвигах. Команды STD и CLD используются при обработке строк для задания направления обработки: от первого элемента строки к последнему или наоборот. Наконец, команды STI и CLI служат для управления системой прерываний и позволяют соответственно разрешить или запретить прерывание на любом участке программы.
Команды установки ЦП в особые состояния. Включают два мнемокода: HLT (останов) и WAIT (ожидание), которые переводят процессор соответственно в состояние ожидания или останова.
Находясь в любом из этих состояний, процессор не выполняет никаких действий до тех пор, пока не будут поданы определенные внешние воздействия. Из состояния останова процессор может быть выведен двумя способами: путем начального сброса (сигналом по входу RESET) либо внешним прерыванием (сигнал запроса по входу INTR). При первом способе процессор перейдет к выполнению основной программы сначала, во втором - к выполнению программы обслуживания прерывания соответствующего уровня. При выполнении команды HLT содержимое указателя команд IP автоматически увеличивается на единицу, так что после выполнения программы обслуживания прерывания процессор перейдет к выполнению следующей за HLT команды.
Основной способ вывода процессора из состояния ожидания состоит в подаче сигнала отрицательной полярности на вход TEST. Таким образом, время нахождения в состоянии ожидания определяется моментами подачи команды WAIT и появлением активного нуля на входе TEST. Управление ожиданием с помощью этого механизма позволяет осуществлять синхронизацию, т. е. сопряжение во времени работы процессора с различными внешними устройствами (например, с сопроцессорами либо с устройствами, обладающими меньшим быстродействием). В случае, когда сигнал на входе TEST активен в момент подачи команды WAIT, процессор будет находиться в состоянии ожидания в течение трех тактов ГТИ.
Второй способ вывода процессора из состояния ожидания заключается в подаче запроса прерывания по входу INTR. Однако в этом случае процессор выходит из состояния ожидания только временно. По команде WAIT не происходит автоматического наращивания указателя команд IP, вследствие чего после выполнения соответствующей программы обслуживания прерывания процессор вновь перейдет к выполнению команды WAIT, т. е. перейдет в состояние ожидания. Важно отметить, что при возобновлении работы процессора после ожидания (по сигналу TEST = 0) внешние прерывания не будут обслуживаться до тех пор, пока не выполнится следующая за WAIT команда.
Команды синхронизации с сопроцессорами. Команды служат целям проектирования многопроцессорных систем на основе ЦП. Хотя система команд ЦП достаточно развита, в ней отсутствуют некоторые команды, характерные для высокопроизводительных систем. Как обычно, недостающие команды процессора можно реализовать с помощью соответствующих подпрограмм. Однако более эффективным решением является использование сопроцессоров - специализированных процессоров, предназначенных для расширения функций основного процессора. Например, отсутствующие в системе команд операции над числами с плавающей запятой могут быть выполнены с помощью сопроцессора Intel 8087.
Для организации совместной работы основного процессора системы с сопроцессорами служит команда ESC. Первый байт формата команды содержит код операции ESC, равный 11011, и трехразрядное поле х; второй байт имеет структуру постбайта, в котором поле reg обозначено как у (рис 1.9). Поле х указывает номер того сопроцессора многопроцессорной системы, который должен выполнить операцию, а поле у - номер (код) этой операции. Для организации взаимодействия основного процессора с сопроцессорами последние должны следить за появлением в потоке команд основного процессора команды ESC, которая укажет, какой сопроцессор и какую операцию должен выполнять. В общем случае поля х и у позволяют задать 64 комбинации 6-разрядных двоичных кодов, что при необходимости произвольным образом изменяет стандартное назначение полей х и у. Например, можно построить систему с одним сопроцессором, который выполняет 64 различные операции, либо с восемью сопроцессорами, каждый из которых будет выполнять до восьми операций, и т. д.
Рис. 1.9. Фрагмент программы умножения чисел с плавающей запятой
Поля mod и rim второго байта команды ESC используются для задания адреса операнда. По содержимому этих полей основной процессор извлекает операнд из памяти и выставляет его значение на ШД в качестве операнда для сопроцессора. Таким образом, основной процессор выдает всю необходимую информацию для работы соответствующего сопроцессора: момент включения в работу (появление кода операции ESC), номер сопроцессора (поле х), код операции (поле у) и операнд (выставлен на ШД).
Контрольные вопросы
1. Каково назначение блока преобразования адресов в ЦП?
2. Дайте сравнительную характеристику способов адресации.
3. Чем определяется время формирования исполнительного адреса?
4. Каковы основные отличия работы ЦП в минимальном и максимальном режимах?
5. В чем заключается назначение системного контроллера Intel 8288?
6. 7. В чем состоит различие в использовании флагов CF и OF?
8. В чем сходство и различие выполнения команд MUL и IMUL, а также DIV и IDIV?
9. В чем состоит основное назначение команды SCAS?
10. Какие ограничения присущи командам передачи управления?
11. Перечислите все префиксы, которые можно использовать с командой MOV.
12. Объясните главное различие в состояниях останова и ожидания, в которые ЦП попадает после выполнения команды HLT и WAIT, соответственно?
13. Какие команды выполняют удвоение и деление пополам чисел со знаком?
14. Сколько восьмиразрядных РОН вы знаете? Перечислите их имена.
15. Как используется регистр ВР для доступа к содержимому стека?
16. Что принято называть программной моделью процессора?
17. Для чего служат регистры-индексы?
18. В каких операциях по умолчанию используется сегментный регистр ES?
19. Могут ли совпадать значения в регистрах DS и CS?
20. Назовите три флага управления режимом работы ЦП.
21. В какое значение установятся флаги CF и SF после вычитания из меньшего числа большего?
22. В каком из способов адресации используется больше всего составляющих при формировании эффективного адреса?
23. Сколько байтов занимает самый длинный и самый короткий формат команды?
24. Почему очередь команд состоит из 6-ти байтов?
25. В чем состоит особенность команд работы с портами ввода и вывода?
26. Какое значение примут флаги ZF, SF и CF после выполнения команды add ah,bh, если перед выполнением команды ah = bh = 128?
27. Объясните назначение флага DF на примере. Когда требуется устанавливать DF = 1?
28. Поясните принцип формирования мнемокодов команд условных переходов.
29. Как ЦП определит начальный адрес подпрограммы обслуживания прерывания 25-го уровня?
30. Какие действия может выполнять ЦП, находясь в состоянии ожидания?
Раздел 2. Арифметический процессор
2.1. Архитектура арифметического процессора
Реализация алгоритмов, в которых необходима высокая точность вычислений, наталкивается на трудности, связанные с недостаточной разрядностью представимых данных. Кроме того, в системе команд ЦП отсутствуют операции с данными, представленными с плавающей запятой, что затрудняет обработку чисел, изменяющихся в широком диапазоне. Для увеличения разрядности данных и выполнения арифметических операций с плавающей запятой можно составить соответствующие подпрограммы, однако их выполнение будет занимать значительное время. Более эффективным является использование специальных аппаратных средств. К таким средствам относится арифметический процессор (АП) Intel 8087, который называют специализированным сопроцессором для выполнения арифметических операций над числами с плавающей запятой. АП позволяет работать с тремя типами данных; целыми числами, представленными в двоичной системе счисления; целыми числами, представленными в двоично-десятичной системе счисления; вещественными числами. Двоичные целые числа. Могут быть представлены в одном из трех форматов: слово (16-разрядное число со знаком), короткое целое (32-разрядное число со знаком) и длинное целое (64-разрядное число со знаком). В памяти целые двоичные числа записываются начиная с младшего байта.
Двоично-десятичное представление чисел. Соответствует формату, показанному на рис. 2.1, а, где d17 - d0 - обозначают 4-разрядные коды цифр числа. Таким образом, максимальное число значащих разрядов равно 18. Для записи двоично-десятичных чисел в памяти отводится 10 байт. Старший байт (на рисунке разряды 72 - 79) содержит только знак числа в старшем бите, а остальные его разряды не используются. Вещественные числа. Могут быть представлены в одном из трех форматов. Короткий вещественный формат (КВФ) занимает 32 двоичных разряда и состоит из 23-разрядной мантиссы, 8-разрядного порядка и знака мантиссы. Длинный вещественный формат (ДВФ) занимает 64 двоичных разряда и состоит из 52-разрядной мантиссы, 11-разрядного порядка и знака мантиссы. Внутренний вещественный формат (ВВФ) занимает 80 двоичных разрядов и состоит из 64-разрядной мантиссы, 15-разрядного порядка и знака мантиссы. Все форматы вещественных чисел соответствуют стандарту IEEE 754.
Диапазон значений вещественных чисел с плавающей запятой, в котором могут выполняться вычисления арифметическим процессором, приведен в табл. 4.1. Для представления бесконечно больших чисел введены специальные коды - единица во всех разрядах порядка и нуль во всех разрядах мантиссы. Комбинации представлений мантиссы и порядка, лежащие за пределами бесконечности, обозначены NAN (от английского Not А Number - не число). Они не воспринимаются процессором как числа, так как выходят за границы допустимой точности вычислений. Таким образом, максимальный рабочий диапазон значений чисел соответствует формату ВВФ и независимо от типа исходных данных АП выполняет все операции в этом формате. Преобразование исходных данных любого типа (целые, двоично-десятичные, вещественные в КВФ и ДВФ) в формат ВВФ осуществляется сопроцессором автоматически. Причем такое преобразование всегда происходит без потери точности, так как формат ВВФ обеспечивает максимальный рабочий диапазон значений чисел. Результат вычислений может быть получен в любой желаемой форме представления (целые, двоично-десятичные, вещественные КВФ и ДВФ), т. е. получение результата связано с обратным преобразованием из внутреннего вещественного формата в требуемый. Естественно, обратное преобразование в ряде случаев может вызвать потерю точности за счет необходимости округлений. В любом случае потери точности процессор сигнализирует об этом. Способ записи мантиссы и порядка вещественных чисел имеет следующие особенности. Числа представляются в нормализованном виде, т. е. первая значащая цифра после запятой не нуль. Например, нормализованный вид десятичного числа 0,0057 есть 0,57*10-2. Нормализованная мантисса двоичного числа всегда будет иметь "1" после запятой. Поскольку первая цифра после запятой всегда "1", нет смысла ее хранить, и в АП она условно переносится в разряд целых. Например, если записана мантисса 010 ... О, то подразумевается, что записано число 1,010...0. Форматы вещественных чисел (рис. 2.1) содержат только знак мантиссы. Таблица 2.1
Диапазоны представленийДиапазоны значенийЗнакПорядокМантиссаКВФДВФВВФ11 1 ... 1 11 1 ... 1 1NANNANNAN. . .. . .. . .. . .. . .11 1 ... 1 100...01NANNANNAN11 1 ... 1 100...00- оо- оо- оо111...1011...11- 3,37*1038- 1,67*10308- 1,2*104932. . .. . .. . .. . .. . .100...0000...01- 8,43*10-37- 4,19*10-307- 3,4*10-4931100...0000...00- 0- 0- 0000...0000...00+0+0+0000...0000...01+ 8,43*10-37+ 4,19*10-307+ 3,4*10-4931. . .. . .. . .. . .. . .01 1 ... 1 01 1 ... 1 1+ 3,37*1038+ 1,67*10308+ 1,2*10493201 1 ... 1 100...00+ оо+оо+оо01 1 ... 1 100...01NANNANNAN. . .. . .. . .. . .. . .011...1111...11NANNANNAN Порядки всегда суммируются с константой смещения, выбранной так, что максимальное отрицательное значение порядка, будучи просуммировано с этой константой, дает в результате нуль. Константы смещения имеют различные значения для каждого формата вещественных чисел: КВФ - 127, ДВФ - 1023 и ВВФ - 16383.
Схема АП (рис. 2.2) включает два основных блока - сопряжения с шиной (БСШ) и исполнительный ИБ. Эти блоки, как и в ЦП, осуществляют конвейерный принцип обработки данных, при котором извлечение команд и операндов выполняется параллельно с вычислениями. Команды и операнды по мультиплексированной шине адреса/данных (ША/Д) ВМ, предварительно извлекаются из памяти и размещаются в соответствующих очередях. АП может работать только в паре с центральным процессором, который в этом случае должен быть установлен в максимальный режим. Когда процессоры включены совместно, команды передаваемые по ША/Д, поступают на оба процессора одновременно. В то время как ЦП выполняет команды, АП просто "прослеживает" их прохождение, не выполняя никаких действий.
ю
Рис. 2.2. Архитектура арифметического процессора Intel 8087
Это пассивное "прослеживание" продолжается до тех пор, пока в потоке команд не встречается команда ESC, которая предназначена для АП. С момента поступления команды ESC арифметический процессор начинает анализировать состояние очереди команд ЦП по сигналам QS1, QS0 (табл. 2.2). Поскольку команды в ЦП хранятся в очереди байтов команд, точный момент начала выполнения команды ESC определяется по концу выполнения предыдущей команды в очереди. Таблица 2.2
Состояние очереди командДействия с очередью команд в ЦПQS0QS100Очередь не изменилась01Первый байт команды взят из очереди10Очередь реинициализирована11Очередной байт команды взят из очереди
Как только сопроцессор определит, что последний байт предыдущей (перед ЕSС) команды взят из очереди, он приступает к выполнению своей команды. Команда ESC, как было отмечено в 1.9, обычно предваряется командой WAIT, которая переводит ЦП в состояние ожидания. Время нахождения центрального процессора в состоянии ожидания определяется активным сигналом на входе TEST. Арифметический процессор, приступая к выполнению команды, выставляет на выходе BUSY (занят) единичный сигнал, который подается на вход TEST центрального процессора и задерживает его в состоянии ожидания на время выполнения команды.
Напомним, что, находясь в состоянии ожидания, ЦП анализирует запросы прерывания и при необходимости может их обслуживать. Для обеспечения возможности совместного использования ША/Д процессоры снабжены соответствующими аппаратными средствами. Центральный процессор обладает преимущественным правом использования шины. Когда у АП возникает необходимость использования шины, например при пересылке результата операции в память, он посылает запрос на предоставление шины центральному процессору по линии RQ/GT. ЦП по этой же линии выдает сигнал разрешения на использование шины арифметическому процессору. После того как АП выполнит действия, связанные с использованием шины, он вновь посылает сигнал по линии RQ/GT, свидетельствующий об окончании использования. Этот механизм позволяет синхронизировать работу процессоров, предоставляя ресурсы ВМ в распоряжение АП. Закончив выполнение команды, АП сбрасывает сигнал BUSY, делая активным сигнал на входе TEST, и выводит ЦП из состояния ожидания. Из приведенного описания ясно, что побудительным стимулом для включения в работу сопроцессора является наличие кода команды ESC в потоке команд совместно включенных процессоров. Код операции, которую выполняет АП, содержится в полях Х и Y команды ESC (см. рис. 1.9). В ряде случаев при выполнении команд в АП возникают исключительные ситуации, связанные с переполнением, потерей точности при округлениях и т. п. Для обработки таких ситуаций может потребоваться вмешательство ЦП, которому предписаны соответствующие программы обработки исключительных ситуаций. Механизм передачи управления на эти программы основан на использовании системы прерываний. Для этой цели АП имеет выход INT запроса прерываний, на котором генерируется сигнал запроса, когда возникает та или иная исключительная ситуация. Рассмотренные аппаратные и программные средства процессоров позволяют достаточно просто организовать их взаимодействие и значительно расширить возможности ЦП. 2.2. Программная модель арифметического процессора
В ариметическом процессоре можно выделить арифметические регистры и регистры окружения. Арифметические регистры играют роль регистров общего назначения и состоят из восьми 80-разрядных регистров (рис. 2.3), организованных в стек. Со стеком связан трехразрядный указатель стека ST, значение которого указывает на один из восьми арифметических регистров (элементов стека), который является текущей вершиной стека. На рис. 2.3 показано, как нумеруются элементы стека при заданном значении (ST = 100). При выполнении операции PUSH - занесения в стек, значение ST предварительно уменьшается ST = ST - 1 и указывает номер регистра, куда заносится данное. При извлечении данных из стека по команде POP значение ST автоматически увеличивается на единицу ST = ST + 1 после извлечения. Следует отметить, что при исходном значении ST = 000 по команде PUSH будет получено значение ST = 111, а при иходном значении ST = 111 по команде POP - значение SТ = 000, т. е. регистры "закольцованы". Рис. 2.3. Арифметические регистры и указатель стека
Регистры окружения. Включают три 16-разрядных регистра: SR - регистр состояния; CR - регистр управления; TR - регистр-этикетка и 64-разрядный регистр EP - указатель исключительных ситуаций. Регистр состояния SR. Содержит различные поля и флаги (рис. 2.4), которые при функционировании процессора автоматически устанавливаются в соответствии с выполняемыми действиями или результатами действий.
Рис. 2.4. Регистр состояния SR и управления CR
Флаг В (от BUSY) устанавливается в "1", когда АП выполняет команду (центральный процессор при этом находится в состоянии ожидания). Поле ST принимает значение, равное текущему значению указателя стека арифметических регистров. Флаги С0, С1, С2 и С3 принимают значения в соответствии с результатами выполнения ряда команд, как описано ниже. Пара флагов С3, С0 служит для записи результата команд сравнения чисел, одно из которых x0 находится в вершине стека, а второе х1 в памяти или POH. В табл. 2.3 приведены значения флагов С3, С0 в зависимости от соотношения между значениями чисел x0 и х1. Ситуация, соответствующая случаю "x0 несравнимо с х1" (C3C0=11), возникает, например, при сравнении некоторого конечного числа с NAN (см. табл. 2.1). Таблица 2.3
Соотношение x0 и х1С3С0x0 > х100x0 < х101x0 = х110x0 несравнимо с х111 Все четыре флага С0 - С3 одновременно служат для записи результата команды FXAM, которая осуществляет детальный анализ содержимого вершины стека ST(0). Флаг С2 указывает знак числа, находящегося в вершине: если С2 = 0 - знак "+", иначе " - ". Флаг С3 указывает на различие в использовании значений пары флагов С0, C1 в соответствии с табл. 2.4. Значение С3 = 0 указывает, что в вершине стека находится какое-либо конечное число, а значение C3 = 1 указывает, что содержимое вершины стека не является конечным числом.
Таблица 2.4
Флаги
С0 С1Значение вершины стека ST(0)При С3 = 0При С3 = 10 0НенормализованноеNAN0 1НормализованноеБесконечность1 0ДенормализованноеВершина стека не инициализирована1 1Нулевое Флаги С0 - C3 служат также для кодирования результатов выполнения команды FPREM получения частичного остатка. Эта команда позволяет определить точное значение частного от деления чисел. За одно обращение она выполняет 64 вычитания (со сдвигом) делителя из делимого. Если при этом точный результат не найден, то выдается полученная часть результата и флаг С2 показывает, завершена команда полностью (C2=0) или не завершена (С2=1). В том случае, когда деление не завершено полностью (С2=1), в разряды С3, С1, С0 заносятся три младших разряда частного и команда затем может быть построена из последней точки. Для целей управления режимами обработки исключительных ситуаций служат флаги, расположенные в младшем байте регистра состояния SR (см. рис. 2.4). Флаг IR (флаг запроса прерывания) устанавливается в "1", когда АП запрашивает прерывание (по выходу INT) у ЦП. Этот запрос осуществляется в случае возникновения какой-либо исключительной ситуации. Флаги PE, UE, ОЕ, ZE, DE, IE соответствуют возможным исключительным ситуациям, возникающим в результате выполнения команд. Флаг PE устанавливается в "1", когда исключительная ситуация связана с потерей точности. Это может случиться при преобразовании данных из формата ВВФ в какой-либо другой, например при выдаче результата. Флаг UE устанавливается в "1", когда исключительная ситуация связана с денормализацией. Эта ситуация может возникнуть тогда, когда в результате операции получается настолько малое значение, что оно не может быть представлено в нормализованном виде, Флаг UE используется только при выполнении операций над вещественными числами, так как понятие "нормализованный" для целых чисел смысла не имеет. Флаг ОЕ устанавливается в "1" при исключительной ситуации, связанной с переполнением. Эта ситуация может возникнуть тогда, когда в результате операции получается настолько большое значение, что оно не может быть представлено каким-либо конечным числом. Флаг ZE устанавливается в "1" при попытке деления на нуль. АП анализирует значение делителя и при равенстве его нулю сигнализирует об этом. Флаг DE устанавливается в "1" тогда, когда в качестве операнда операции задается ненормализованное значение. Флаг IE устанавливается в "1" при попытке выполнить недействительную операцию. В качестве такой операции может быть любая, где в качестве операнда задается NAN. Операции, которые приводят, к неопределенным значениям, также вызывают исключительную ситуацию, характеризующуюся как недействительная операция. Отметим, что каждый из перечисленных флагов, будучи установленным, не сбрасывается до тех пор, пока не будет подана команда FCLEX - обнуление флагов исключительных ситуаций. Регистр управления CR. Служит для задания различных режимов работы сопроцессора. Различают две основные группы режимов - вычислений и обработки исключительных ситуаций. Для управления режимами вычислений служат поля, расположенные в старшем байте регистра CR (см. рис. 2.4). Поле RC осуществляет управление округлением результатов вычислений в соответствии с табл. 2.5. Режим округления к ближайшему четному значению используется наиболее часто, так как обеспечивает максимальную точность вычислений. Режимы округления по направлению к плюс/минус бесконечности используются для определения границ значений, в пределах которых находится результат (например, полученный в режиме RC = 00). Наконец, режим округления по направлению к нулю используется в редких случаях, например для моделирования на базе АП целочисленной арифметики. Поле РС осуществляет управление точностью представления результатов вычислений в соответствии с табл. 2.6. Обычно задается значение поля РС = 00, которое позволяет получить наиболее точные значения при вычислениях. Два других варианта задания точности РС = 01 и РС = 10 ограничивают представление результатов форматами КВФ и ДВФ. Причем, поскольку АП производит все действия в формате ВВФ, округление результатов до более коротких форматов может приводить к потере точности. Таблица 2.5 Таблица 2.6
Код поля RCСпособ округления результата00 К ближайшему четному01 По направлению к - оо10 По направлению к +оо11 По направлению к нулюКод поля РCТочность представления результата00В формате ВВФ01В формате КВФ10В формате ДВФ Флаг IC позволяет управлять типом арифметики. Значение IC = 1 определяет режим работы АП в обычной арифметике, использующей числа, лежащие в диапазоне от минус до плюс бесконечности. Значение IC = 0 определяет режим работы в так называемой проективной арифметике, которая имеет одну бесконечность без знака. Обычная арифметика имеет две бесконечности, между которыми расположены все вещественные числа. В проективной арифметике числа отображаются на проективную окружность, верхняя точка которой соответствует бесконечности без знака, нижняя нулю, а все остальные точки соответствуют конечным положительным и отрицательным числам. Особенность вычислений в проективной арифметике состоит, в частности, в том, что ни одно конечное число несравнимо с бесконечно большим. При выполнении операций сравнения это различие приведет к тому, что в результате сравнения чисел, одно из которых бесконечно большое, а другое конечное, в режиме IC = 1 получится вполне определенный результат (С3С0 = 00 или 01), а в режиме IC = 0 числа окажутся несравнимы (С3С0 = 11). Для целей управления режимами обработки исключительных ситуаций служат разряды масок, расположенные в младшем байте регистра управления CR (см. рис. 2.4). Когда возникает исключительная ситуация, необходимо осуществить какие-либо корректирующие действия. В большинстве случаев достаточно бывает выполнить стандартные действия, которые АП производит без помощи ЦП. В особых ситуациях АП посылает сигнал запроса прерывания и корректирующие действия выполняет ЦП. Соответствующие разряды масок позволяют управлять режимами обработки исключительных ситуаций стандартным способом либо с привлечением центрального процессора. Разряд РМ = 1 маскирует флаг РЕ, и исключительная ситуация, связанная с потерей точности, обрабатывается стандартным способом. Сопроцессор в качестве результата операции выдает округленное значение. Разряд UM = 1 маскирует флаг UE, и в качестве результата операции выдается значение в ненормализованном виде. Разряд ОМ = 1 маскирует флаг ОЕ, и исключительная ситуация, связанная с переполнением, обрабатывается стандартным образом. Разряд ZM = 1 маскирует флаг ZE и в качестве результата деления на нуль выдает значение бесконечности. Знак бесконечности формируется как сумма по модулю 2 знаков делимого и делителя (напомним, что нуль в форматах вещественных чисел имеет знак "+" и "-"). Разряд DM = 1 маскирует флаг DE и, сопроцессор выполняет операцию с ненормализованным значением операнда.
Разряд IM = 1 маскирует флаг IE, и в качестве результата АП выдает значение NAN. Если операция оценивается как недействительная, когда оба участвующих в ней операнда имеют значение NAN, то в качестве результата выдается то из них, которое имеет большую мантиссу. Описанные разряды масок могут быть установлены в "1" или сброшены соответствующей командой независимо друг от друга.
Разряд IEM - маска разрешения прерываний, прямо не связан с управлением режимами обработки исключительных ситуаций, но существенно влияет на их обработку. Когда разряд IEM = 1 АП не может послать сигнал запроса прерывания INT центральному процессору до тех пор, пока разряд IEM не будет сброшен в "0". Этот механизм позволяет в программах ЦП при необходимости запрещать обработку прерываний от АП. Установка в "1" и сброс в "0" разряда-маски IEM производится командой FENI и FDISI соответственно. Рис. 2.5. Регистр этикеток
Регистр этикеток TR. Содержит восемь 2-разрядных полей TAG7 - ТАG0 (рис. 2.5), каждое из которых соответствует своему арифметическому регистру ST(7) - ST(0) . В этих полях кодируется информация о содержимом соответствующего арифметического регистра. Информация кодируется в соответствии с табл. 2.7. В обычных применениях регистр этикеток не используется пользователями при составлении программы, а служит для предотвращения переполнения стека. Перед загрузкой данных в стек сопроцессор анализирует значение соответствующей этикетки TAG и, если флаг IE не замаскирован, автоматически генерирует запрос прерывания для обработки исключительной ситуации, связанной с недействительной операцией. В ряде специальных использований имеется возможность изменения значений полей регистра TR программным путем. Регистр - указатель исключительных ситуаций EP. Обеспечивает возможность привлечения ЦП для обработки различных исключительных ситуаций. Когда такие ситуации возникают и соответствующие им флаги РЕ, UE, ОЕ, ZE, DE и флаг IE не замаскированы, АП посылает запрос прерывания INT центральному процессору. Для того чтобы ЦП мог правильно перейти к соответствующей программе обработки, ему необходимо иметь достаточную информацию об условиях, вызвавших прерывание. Эта информация включает адрес команды, вызвавшей прерывание, код операции, выполняемой данной командой, и адрес операнда, который участвовал в операции. АП помещает указанную информацию в регистр-указатель ЕР при выполнении каждой команды. Формат представления данных в ЕР, показан на рис. 2.6. Рис. 2.6. Формат представления данных в регистре ЕР
Первый 32-разрядный регистр ЕР содержит 20-разрядный адрес команды, вызвавшей прерывание, и 11 младших разрядов кода операций. Отметим, что пять старших разрядов любой команды для АП содержат код 11011 (ESC) и поэтому не запоминаются в ЕР. Второй 32-разрядный регистр содержит 20-разрядный адрес операнда, а оставшиеся 12 разрядов не используются.
2.3. Система команд арифметического процессора
Система команд сопроцессора состоит из четырех групп команд: команды передачи данных, основные вычислительные команды, команды управления и специальные вычислительные команды.
Напомним, что АП может быть использован только совместно с ЦП и, следовательно, его систему команд можно рассматривать как расширение системы команд ЦП. Программные средства, которые обеспечивают взаимодействие процессоров, составляют команды WAIT и ESC. Команда WAIT служит для перевода ЦП в режим ожидания на время выполнения команды арифметическим процессором. На рис. 2.7,а представлен обобщенный формат команд сопроцессора. Команда может содержать от двух до четырех байт. Первый байт любой команды содержит код 11011 (ESC). Поля Х и Y отводятся для задания КОП. Если операция выполняется над одним операндом, то он всегда располагается в вершине стека ST(0), при этом поле mod=11, а поле r/т служит для задания КОП, т. е. является как бы продолжением полей Х и Y. Если операция двухоперандная, то один из операндов располагается в вершине стека ST(0), а адрес второго задается полями mod и r/т. Значение поля mod определяет наличие и размерность смещения. При mod=00 смещение отсутствует и команда состоит из 2 байт, при mod=01 или 10 смещение соответственно 8- или 16-разрядное и команда состоит из 3 или 4 байт. Код поля r/т в этих случаях определяет способ формирования исполнительного адреса ЕА операции в соответствии с табл. 1.2. Значение поля mod=11 указывает на то, что операнд находится в регистре ST(i), номер i которого задается двоичным кодом в поле r/m. В ряде команд два старших разряда поля Х используются для задания типа операнда, находящегося в памяти (рис. 2.7,б). Соответствие форматов операнда и значений поля MF представлено в табл. 2.7. Таблица 2.7
Код поля MFФормат операнда00КВФ10ДВФ1116-разрядное целое0132-разрядное целое Команды передачи данных. Включают команды загрузки, запоминания и пересылки. Команды загрузки. Эти команды (табл. 2.8) позволяют записывать данные из памяти в вершину стека. Они автоматически изменяют значение указателя стека ST = ST - 1 и анализируют значение соответствующего поля TAG в регистре этикеток TR. Если значения TAG=11 (е), то данные загружаются в вершину стека ST(0) по новому значению указателя. Если ТАG=00, 01 или 10 - это означает, что текущий регистр в стеке уже заполнен. В этом случае сопроцессор взводит флаг IE исключительной ситуации и новое значение не загружается, если флаг IE не замаскирован. Данные, которые извлекаются из памяти, могут быть представлены в любом из форматов: целые 16-, 32- и 64-разрядные, целые двоично-десятичные и вещественные (КВФ, ДВФ, ВВФ). Перед записью в стек АП автоматически переводит их в формат ВВФ. Такой перевод никогда не вызывает потерю точности, поскольку ВВФ позволяет представить числа в самом широком диапазоне значений. Таблица 2.8
Мнемокод командыТип данныхВыполняемые действия FLD addrВещественные (аddr)->ST(0) FILD addrЦелые FBLD addr Двоично-десятичные При выполнении различных вычислений часто используется ряд констант. Наиболее употребительные константы записаны в ПЗУ констант АП, они могут быть загружены в ST(0) с применением команд загрузки констант (табл. 2.9).
Таблица 2.9
Мнемокод командыВыполняемые действияFLDZ "0" -> ST(0)FDD1 "1" -> ST(0)FLDPI 3,1415...-> ST(0)FLD2I log2 (10) -> ST(0)FLD2E 1og е -> ST(0)FLDLG2 1g2 -> ST(0)FLDLN2 1n2 -> ST(0)
Все константы представлены в формате ВВФ, т. е. обеспечивают высокую точность вычислений.
Команды запоминания. Эти команды (табл. 2.10) осуществляют передачу данных из вершины стека ST(0) в память. Существуют две разновидности команд запоминания: запоминание без выталкивания данных (FST, FIST) и запоминание с выталкиванием данных (FSTP, FISTP, FBSTP) из вершины стека. После запоминания автоматически изменяется содержимое TAG-11 (е - пусто) и увеличивается значение указателя ST=ST+1. При запоминании с выталкиванием сопроцессор автоматически переводит данные из ВВФ в любой желаемый формат. Такой перевод может вызвать исключительные ситуации, связанные с потерей точности (взводится флаг PE), денормализацией (взводится флаг UE) и переполнением (взводится флаг OE). На рис. 2.8 показаны операции загрузки и запоминания.
Таблица 2.10
Мнемокод командыТип данныхВыполняемые действия FST addrКВФ, ДВФ ST(0) -> (аddr) FIST addrЦелые 16 и 32- разрядные ST(0) -> (аddr) FSTP addrКВФ, ДВФ, ВВФ ST(0) -> (аddr) + POP FISP addrЦелые 16, 32 и 64 - разрядные ST(0) -> (аddr) + POP FBSTP addrДвоично-десятичные ST(0) -> (аddr) + POP Команды пересылки. Эти команды (табл. 2.11) позволяют осуществлять Таблица 2.11
Мнемокод командыВыполняемые действия FLD ST(i)ST(i) -> ST(0) + PUSH FST ST(i)ST(0) -> SТ(i) FSTP ST(i)ST(0) -> ST(i ) + PUSH FXCH ST(i)ST(0) <-> ST(i) передачу данных между различными регистрами стека. Команды FLD ST(i) и FSTP ST(i) выполняются как стеновые операции, т. е. загрузка сопровождается операцией записи в стек PUSH, а запоминание - операцией выталкивания из стека POP. Например, команда FLD ST (0) позволяет задублировать содержимое вершины стека в двух регистрах ST(0) и ST(1). Две другие команды, FST ST(i) и FXCH ST(i), осуществляют пересылку и обмен без изменения указателя стека, т. е. обращаются к регистрам ST(0) и ST(i) не как к стеку. Основные вычислительные команды. Включают в себя различные арифметические команды и команды сравнения. Элементарные арифметические команды. Эти команды (табл. 2.12)
Таблица 2.12
Мнемокод командыВыполняемые действияFADDST(0) + ST(1) -> ST(0)FSUBST(0) - ST(1) -> ST(0)FSUBRST(1) - ST(0) -> ST(0)FMULST(0) x ST(1) -> ST(0)FDIVST(0) / ST(1) -> ST(0)FDIVRST(1) / ST(0) -> ST(0)
выполняют четыре арифметических действия над операндами, размещенными в двух верхних элементах стека ST(0) и ST(1) с занесением результата в ST(0). В обычных операциях сложения FADD, вычитания FSUB, умножения FMUL и деления FDIV первый операнд берется из вершины стека ST(0), а второй из следующего элемента ST(1). Поскольку результат вычитания и деления зависит от порядка следования операндов, введены так называемые обратные операции вычитания FSUBR и деления FDIVR, которые меняют операнды местами. Для обеспечения большей гибкости при выполнении арифметических действий введены арифметические команды с расширенными возможностями (табл. 2.13). При использовании этих команд один операнд должен находиться в вершине стека, а второй - в произвольном регистре ST(i) или в памяти. В последнем случае операнд может быть представлен только в двух форматах КВФ и ДВФ.
Таблица 2.13
Мнемокод команды(а)(б)(в) FADD FADDP FIADD FSUB FSUBP FISUB FSUBR FSUBRP FISUBR FMUL FMULP FIMUL FDIV FDIVP FIDIV FDIVR FDIVRP FIDIVR
Результат операции может быть размещен в произвольном регистре ST(i). Возможности размещения второго операнда и результата различны для мнемокодов команд, представленных в различных столбцах (а, б, в табл. 2.13). Команды (а) допускают размещение второго операнда как в памяти, так и в произвольном регистре ST(i), причем результат может быть размещен в произвольном регистре. Команды (б) допускают размещение второго операнда и запись результата в произвольный регистр. При выполнении команд (б) дополнительно осуществляется выталкивание из стека содержимого его вершины. Команды (в) допускают размещение второго операнда только в памяти, а результат размещения в вершину стека ST (0). Эти команды выполняют арифметические действия над 16- и 32-разрядными целыми числами. Мнемокоды команд (а) не отличаются от мнемокодов элементарных арифметических команд. Они расширяют возможности программиирования и позволяют, например, записать команду FADD ST, ST(i), которая в отличие от команды FADD второй операнд выбирает из ST (i), а не из ST(1) (при записи команд допускается написание ST вместо ST (0)). Можно также записать команду FADD ST(3), ST, которая результат размещает в ST(3), а не в вершину. Удобно использование команд типа FADD ST, ALPHA, где ALPHA - адрес памяти, с которого размещено второе слагаемое. Эта команда эквивалентна паре команд FLD ALPHA и FADD. Отметим, что запись команды в виде FADD ALPHA,ST недопустима, поскольку результат не может быть размещен в памяти. Эту команду можно реализовать с помощью двух команд FADD ST, ALPHA и FST ALPHA. Элементарные команды сравнения. Эти команды (табл. 2.14) позволяют сравнивать данные, расположенные в двух верхних регистрах стека ST(0) и ST(1) (команды FCOM, FCOMP, FCOMPP), а также сравнивать с нулем (FTST) и анализировать данные в вершине FXAM. Команды сравнения могут выполняться без изменения состояния стека (FCOM), с выталкиванием одного из сравниваемых данных (FCOMP) и с выталкиванием обоих сравниваемых данных (FCOMPP).
Таблица 2.14
Мнемокод командыВыполняемые действия FCOM ST(0) сравнивается с ST (1) FCOMP ST(0) сравнивается с ST (1) и выталкивается FCOMPP ST(0) сравнивается с ST (1) и оба выталкиваются FTST ST(0) сравнивается с нулем FXAM ST(0) анализируется
Результаты сравнения помещаются в регистр состояния SR (разряды С3, С0). Значения флагов С3,С0 устанавливаются в зависимости от соотношения сравниваемых данных в соответствии с табл. 2.3. Поскольку при реализации алгоритмов довольно часто производится сравнение с нулем, введена соответствующая команда FTST. Команда FXAM выполняет детальный анализ содержимого вершины стека и помещает результаты в регистр состояния SR (разряды С0-C3). Значения флагов С0,C1,C3 устанавливаются в зависимости от результатов анализа (см. табл. 2.4). Флаг С2 указывает знак числа, расположенного в вершине. Для обеспечения большей гибкости при сравнениях введены команды сравнения с расширенными возможностями: FCOM addr, FCOMP addr, FICOM addr и FICOMP addr, где addr - ST(i) или адрес памяти (mem). Возможности размещения второго операнда различны для мнемокодов FCOM, FCOMP и FICOM, FICOMP. Первые две команды допускают размещение второго операнда как в памяти, так и в произвольном регистре ST(i) и позволяют выполнять сравнение вещественных чисел в форматах КВФ и ДВФ. Вторые две команды допускают размещение второго операнда только в памяти и позволяют сравнивать 16- и 32-разрядные целые числа. Во всех случаях результаты сравнения помещаются в разряды С3,С0 регистра состояния. Команды управления. Включают различные команды управления сопроцессором и насчитывают 15 мнемокодов. Команда FINIT - начальной инициализации производит действия, аналогичные тем, которые выполняются по внешнему сигналу RESET. Эта команда позволяет в любой момент осуществить начальную установку сопроцессора. Команды FENI и FDISI - разрешения и запрещения выдачи запросов прерывания на выходе INT арифметического процессора позволяют устанавливать в "1" и сбрасывать в "0" разряд-маску IEM, назначение которого описано выше. Команда FLDCW addr позволяет загружать управляющее слово в регистр управления CR. Управляющее слово должно быть предварительно сформировано в памяти, где в соответствующих полях (см. рис. 2.4) задаются необходимые режимы округления RC, управления точностью РС, тип арифметики IC, а также разряды-маски исключительных ситуаций РМ, UM, OM, ZM, DM, IM.
Команда FSTCW addr позволяет запомнить содержимое регистра управления в памяти по указанному адресу. Команда FCLEX - обнуление флагов исключительных ситуаций позволяет сбросить эти флаги в "0". Напомним, что любой из флагов PE, UE, ОЕ, ZE, DE и IE, будучи однажды установлен в "1", будет находиться в этом состоянии вплоть до подачи команды FCLEX. Команда FSTSW addr позволяет запомнить слово-состояние в памяти по указанному адресу. Под словом-состоянием понимается содержимое регистра состояния SR. Эта команда используется для организации условных переходов по результатам сравнения чисел. Поскольку в системе команд АП отсутствуют команды переходов, то для того, чтобы воспользоваться соответствующей командой ЦП необходимо предварительно передать результаты сравнения чисел из регистра SR сопроцессора в регистр F центрального процессора.
Флаги С0,С3 расположены в разрядах регистра состояния SR, соответствующих расположению флагов CF, ZF центрального процессора. Это обеспечивает простую реализацию условных переходов по результатам сравнения чисел в АП.
Команда FSTENV addr позволяет запомнить в памяти по указанному адресу состояние всех регистров окружения. Последовательность записи регистров в память представлена на рис. 2.9,а. Команда FLDENV addr загружает регистры окружения сопроцессора данными из памяти, расположенными по указанному адресу. Команда FSAVE addr производит запись в память по указанному адресу состояния регистров окружения и арифметических регистров сопроцессора. Эта информация запоминается в памяти в форме, представленной на рис. 2.9, б. Команда FRSTOR addr осуществляет обратную пересылку, т. е. загружает регистры сопроцессора данными из памяти, расположенным по указанному адресу. Команды FINCSTP и FDECSTP увеличивают и уменьшают соответственно значения указателя стека ST на единицу. Эти команды не изменяют содержимое стека и регистра-этикеток TR. Команда FFREE присваивает значение TAG(i)=11 (еmpty), которое указывает, что регистр ST(i) не инициализирован. Команда FNOP заставляет сопроцессор пропустить три такта работы, не выполняя никаких действий.
Специальные вычислительные команды. Выполняют специфические операции, которые часто используются при вычислениях (табл. 2.15).
Таблица 2.15
Мнемокод командыСодержание команды FABSАбсолютное значение ST(0) FCHSИзменение знака ST(0) FRNDINTОкругление ST(0) FXTRACT FSQRT Выделение мантиссы и порядка ST(0) Вычисление квадратного корня из ST(0) FSCALFМасштабирование FPREMПолучение частичного остатка FPTANВычисление частичного тангенса FPATANВычисление частичного арктангенса FYL2Х FYL2ХР1 F2XM1ST(0) = ST(1) log2(ST(0)) ST(0) = ST(1) log2(ST(0)+1) ST(0) = 2ST(0) - 1 Команда FABS формирует абсолютное значение (модуль) числа, находящегося в вершине стека. Команда FCHS изменяет знак числа, находящегося в вершине, на противоположный. Команда FRNDINT производит округление числа, находящегося в вершине стека, до целого. Если исходное число представлено в формате целого, то оно не изменяется командой. Число, представленное в формате вещественного, округляется до целого в соответствии с заданным режимом округления (поле RC в регистре CR, см. табл. 2.5). Команда FXTRACT выделяет мантиссу и порядок числа. Например, перед выполнением команды FXTRACT ST(0) = 2,71 х 2-15, тогда после ее выполнения в вершине формируется значение мантиссы ST(0) = 2,71 х 20, а в следующем регистре значение порядка ST (1) = -15 х 20, представленные в формате ВВФ. Команда FSQRT извлекает квадратный корень из числа, находящегося в вершине стека. Команда FSCALE производит масштабирование числа, находящегося в вершине стека. Масштабный коэффициент перед выполнением команды должен быть размещен в ST(1). Действия команды состоят в сложении порядка числа с масштабным коэффициентом и размещением результата в поле порядка. Масштабирование эквивалентно умножению и делению (если коэффициент отрицательный) исходного числа на 2n, где n - масштабный коэффициент. Поскольку значение коэффициента остается без изменений, циклическое использование команды с предварительной загрузкой ST(0) и последующим запоминанием результата позволяет масштабировать массивы чисел. Команда FPREM позволяет получить частичный остаток от деления чисел. Циклическое использование этой команды с запоминанием промежуточных значений частного позволяет получить точное значение частного с любой, наперед заданной, степенью точности. Признаком завершения команды (получения нулевого частичного остатка) является значение флага С2 (С2=0 - команда завершена, С2=1 - команда не завершена), который позволяет управлять переходом на повторение цикла или завершение операции. Команда FPTAN вычисляет частичный тангенс числа. Исходное значение z размещается в ST(0). Результат выполнения команды FPTAN - значения х и у, где ST(0) = х, ST(1) = у, могут быть использованы для вычисления tg z/2=у/х, а также других тригонометрических функций, например sin z=2(y/х)/[1+(у/х)2]. Команда FPATAN реализует обратную функцию - вычисление частичного арктангенса. Исходные частичные значения х и y размещаются в ST(0) и ST(1) соответственно. Результат z = arctg у/х размещается в вершине стека ST(0). Использование известных формул позволяет по z получить значение других обратных тригонометрических функций. Команда FYLT2X позволяет вычислить значение логарифмической функции z = ylog2x, где х, у предварительно располагаются в ST(0), ST(1) соответственно, а результат z размещается в ST(0).
Команда FYL2XP1 служит для вычисления значений логарифмической функции z = y(log2x+1) с аналогичным размещением исходных значений и результата. Команда F2XM1 позволяет вычислить значение показательной функции z=2x - 1. Показатель x предварительно размещается в ST(0), где получается и результат. Набор команд FYL2X, FYL2XP1 и F2XM1 в совокупности с рассмотренными ранее командами загрузки констант позволяет достаточно просто вычислять другие логарифмические и показательные функции по известным формулам.
Контрольные вопросы
1. В чем состоит основное назначение арифметического процессора?
2. В каком формате осуществляются все операции в АП?
3. Каким образом осуществляются условные переходы по результатам сравнения чисел в АП?
4. Объясните назначение регистра этикеток.
5. Как в потоке команд отличить мнемокод команды для АП?
6. Как ЦП узнает об исключительной ситуации в АП?
7. Используя специальные вычислительные команды, напишите процедуру для вычисления x y.
8. Как и какие способы округления поддерживает АП?
9. Сколько мнемокодов включает система команд АП?
10. В каком состоянии находится ЦП когда АП выполняет команду?
11. Перечислите все регистры окружения и объясните их назначение.
12. В каком из форматов можно представит самое большое вещественное число и каков его порядок?
13. Зачем используются коды NAN?
14. Перечислите все флаги исключительных ситуаций и объясните их назначение.
15. Что такое двоично-десятичный формат представления целых чисел? Представьте число 9374 в формате ДДФ.
16. Представьте число -0,75 в формате КВФ.
17. Для чего в диапазон представления вещественных чисел включены коды для представления +0,0 и -0,0?
18. Когда и почему при сохранении результатов вычислений в памяти может происходить потеря точности?
19. Для чего в регистре состояния служит поле ST?
20. Какие способы округления можно задать с помощью поля RC регистра управления?
21. Перечислите все группы команд АП.
22. В чем основное различие команд загрузки и команд запоминания? 23. Выполнение каких команд может приводить к потере точности?
24. В чем заключается особенность выполнения команд условных переходов?
25. Для каких арифметических команд целесообразно ввести возможность перемены мест операндов перед выполнением операции?
26. Какой тип арифметики позволяет задать флаг IP? В чем различие типов?
27. Напишите фрагмент программы, осуществляющий пересылку результатов сравнения из регистра SR в регистр F.
28. Как обрабатываются исключительные ситуации по умолчанию, если они замаскированы?
29. Составьте программу, реализующую вычисление функции yx.
30. Составьте программу, реализующую функцию n! (факториал).
Раздел 3. Эволюция характеристик ЦП
3.1. Архитектура ЦП Pentium
Эволюция центральных процессоров Intel - от первого 16-разрядного Intel 8086 до Pentium IV - составила значительное число шагов. Основные вехи этой эволюции отражены в табл. 3.1. Первой существенной вехой явилось расширение разрядности внутренних регистров ЦП с 16 до 32 и увеличение адресного пространства до 4 Гбайт при переходе к ЦП Intel 80386. Немаловажным явилось событие в размещении на одном кристалле ЦП и АП, а также появление внутренней кэш-памяти у ЦП Intel 80486.
Кэш первого уровня процессора Intel 80486 имеет четырехканальную структуру (рис. 3.1). Каждый канал состоит из 128 строк по 16 байт в каждой. Одноименные строки всех четырех каналов образуют 128 наборов из четырех строк, каждый из которых обслуживает свои адреса памяти. Каждой строке соответствует 21-разрядная информация об адресе скопированного в нее блока системной памяти. Эта информация называется тегом (tag) строки.
Рис. 3.1. Структура внутреннего кэша ЦП Intel 80486
Кроме того, в состав кэша входит так называемый диспетчер, то есть область памяти с организацией 128 х 7, в которой хранятся 4-битные теги действительности (достоверности) для каждого из 128 наборов и 3-битные коды LRU (Least Recently Used) для каждого из 128 наборов. Тег действительности набора включает в себя 4 бита достоверности каждой из 4 строк, входящих в данный набор. Бит достоверности, установленный в единицу, говорит о том, что соответствующая строка заполнена; если он сброшен в нуль, то строка пуста. Биты LRU говорят о том, как давно было обращение к данному набору. Это нужно для того, чтобы обновлять наименее используемые наборы.
Адресация кэш-памяти осуществляется с помощью 28 разрядов адреса. Из них 7 младших разрядов выбирают один из 128 наборов, а 21 старший разряд сравнивается с тегами всех 4 строк выбранного набора. Если теги совпадают с разрядами адреса, то получается ситуация кэш-попадания, а если нет, то ситуация кэш-промаха.
В случае цикла чтения при кэш-попадании байт или слово читаются из кэш-памяти. При кэш-промахе происходит обновление (перезагрузка) одной из строк кэш-памяти. В случае цикла записи при кэш-попадании производится запись как в кэш-память, так и в основную системную память. При кэш-промахе запись производится только в системную память, а обновление строки кэш-памяти не производится. Эта строка становится недостоверной (ее бит достоверности сбрасывается в нуль).
Такая политика записи называется сквозной или прямой записью (Write Through). В более поздних моделях процессоров применяется и обратная запись (Write Back), которая является более быстрой, так как требует гораздо меньшего числа обращений по внешней шине. При использовании обратной записи в основную память записываемая информация отправляется только в том случае, когда нужной строки в кэше нет. В случае же попадания модифицируется только кэш. В основную память измененная информация попадет только при перезаписи новой строки в кэш. Прежняя строка при этом целиком переписывается в основную память, и тем самым восстанавливается идентичность содержимого кэша и основной памяти.
В случае, когда требуемая строка в кэше не представлена (ситуация кэш-промаха), запрос на запись направляется на внешнюю шину, а запрос на чтение обрабатывается несколько сложнее. Если этот запрос относится к кэшируемой области памяти, то выполняется цикл заполнения целой строки кэша (16 байт из памяти переписывается в одну из строк набора, обслуживающего данный адрес). Если затребованные данные не укладываются в одной строке, то заполняется и соседняя строка.
Внутренний запрос процессора на данные удовлетворяется сразу, как только данные считываются из памяти, а дальнейшее заполнение строки может идти параллельно с обработкой данных. Если в наборе, который обслуживает данный адрес памяти, имеется свободная строка, заполнена будет именно она. Если же свободных строк нет, заполняется строка, к которой дольше всех не обращались. Для этого используются биты LRU, которые модифицируются при каждом обращении к строке данного набора. Кроме того, существует возможность аннулирования строк (объявления их недостоверными) и очистки всей кэш-памяти. При сквозной записи очистка кэша проводится специальным внешним сигналом процессора, программным образом с помощью специальных команд, а также при начальном сбросе - по сигналу RESET. При обратной записи очистка кэша подразумевает также выгрузку всех модифицированных строк в основную память.
Появление процессора Pentium MMX (Multi Media Extension), существенно расширило систему команд ЦП, введением специальных команд для нужд мультимедийных приложений. Этот процессор положил начало новой технологии обработки данных - SIMD (Single Instruction Multiply Data), при которой одна команда обрабатывает параллельно несколько данных.
Выпуск процессора Pentium III, также добавил большое число новых команд для потоковой обработки чисел с плавающей запятой. Эта новация носит название SSE (Streaming SIMD Extention) - потоковое SIMD расширение.
Наконец, большие успехи в технологии изготовления кристаллов микросхем позволили практически на порядок повысить их сложность, благодаря чему появился процессор Pentium IV, обладающей внутренней двухуровневой КЭШ памятью и достигшему в настоящее время огромного быстродействия, превышающего 3 ГГц. Таблица 3.1
Модель
Год
Млн. тр-ровЧ-та
(Мгц)Регистры
(бит)ШД
(бит)Адреса
(Гбайт)КЭШ
(Кбайт) Intel 808619780.029816160.001 Нет Intel 38619850.2754032324 Нет Intel 48619891.210032324 8 + 8 Pentium19933.1200326448 + 8 Pentium Pro19955.52003264648 + 8 Pentium MMX1997, янв6.523332 / 6464648 + 8 Pentium II (Xeon)1997, май7.545032 / 64646416 + 16 Celeron19987.575032 / 646464128 Pentium III19998.5100032 / 64 / 128646416 + 16 Pentium IV200042.0200032 / 64 / 1286464256 / 12 / 8
Совокупность технических решений, применённых в процессоре Pentium IV, получила собственное название: "архитектура NetBurst (пакетно-сетевая)". Архитектура процессора Pentuim IV представлена на рис. 3.2.
Основные особенности архитектуры NetBurst.
Для того, чтобы ЦП могли работать на частотах порядка нескольких ГГц Intel увеличил длину конвейера Pentium IV до 20 стадий (Hyper Pipelined Technology) - для сравнения - длина конвейера Pentium III составляет 10 стадий. Чего же достиг Intel, так удлинив конвейер? Благодаря декомпозиции выполнения каждой команды на более мелкие этапы, каждый из этих этапов теперь может выполняться быстрее, что позволяет увеличивать частоту процессора. Так, если при используемом технологическом процессе 0.18 мкм предельная частота для Pentium III составляет 1 ГГц, то Pentium IV мог достигнуть частоты в 2 ГГц. Однако у чрезмерно длинного конвейера есть и свои недостатки. Первый недостаток - каждая команда, проходя большее число стадий, выполняется дольше. Второй недостаток длинного конвейера вскрывается при ошибках в предсказании переходов.
Из-за такого увеличения длины конвейера время выполнения одной команды в процессорных тактах также увеличивается. Поэтому компания осуществила модернизацию алгоритмов предсказания переходов.
Advanced Dynamic Execution - осуществляет минимизацию простоя процессора при неправильном предсказании переходов и увеличение вероятности правильных предсказаний. Для этого Intel улучшил блок выборки инструкций для внеочередного выполнения и повысил правильность предсказания переходов. Правда, для этого алгоритмы предсказания переходов были доработаны минимально, основным же средством для достижения цели было выбрано увеличение размеров буферов, с которыми работают соответствующие блоки процессора. Количество предварительно загружаемых инструкций увеличилось до 126 по сравнению с 48 у Pentium III. Буфер, хранящий адреса условных переходов, также увеличился с 512 байт до 4 КБ. Все это позволило увеличить вероятность правильного предсказания переходов на 33%. Рис. 3.2. Архитектура процессора Pentium IV
Для ускорения работы целочисленных операций в Pentium IV применена технология удвоения внутренней тактовой частоты (Rapid Execution Engine). Два блока АЛУ, выполняющие операции над целочисленными данными, работают на частоте вдвое большей, чем частота самого процессора. Таким образом, например, в Pentium IV с частотой 1.4 ГГц АЛУ работает на частоте 2.8 ГГц. В АЛУ исполняются простые целочисленные инструкции, поэтому, производительность нового процессора при операциях с целыми числами очень высока. Однако, на производительности Pentium IV при операциях с вещественными числами, MMX или SSE двукратное ускорение АЛУ никак не сказывается.
Кэш 1-го уровня в процессоре также претерпел значительные изменения. В отличие от Pentium III, кэш которого мог хранить команды и данные, Pentium IV имеет всего 8 КБ кэш данных. Команды, поступающие на исполнение процессору, сохраняются в так называемом Trace Cach (кэш-память микрокоманд). Там они хранятся уже в декодированном виде, т.е. в виде последовательности микроопераций, поступающих для выполнения в исполнительные устройства процессора. Емкость этого кэша составляет 12000 микроопераций и по сравнению с обычным L1-кэшем он имеет много преимуществ, направленных на минимизацию простоев процессора при выполнении неправильных предсказаний переходов. Особенностью новых процессоров Pentium IV является расширение набора команд командами SSE2. К 70-ти командам SSE, работающим с потоковыми данными одинарной точности добавились 144 команды для работы с вещественными числами двойной точности, а также с целыми числами длиной от одного до восьми байт. Дальнейшее расширение - командами SSE3, добавившее еще 13 новых команд. Наконец, заявленное расширение SSE4 еще на несколько десятков команд.
3.2. Программная модель ЦП Pentium
Программная модель ЦП включает три группы регистров данных (рис. 3.3), в каждой из групп по восемь регистров. Первая группа включает 32-разрядные целочисленные регистры, вторая - 80-разрядные регистры и третья - 128-разрядные регистры. Расширение ММХ использует новые типы упакованных 64-разрядных данных:
* упакованные байты - восемь байт; * упакованные слова - четыре 16-разрядных слова; * упакованные двойные слова (два 32-разрядных слова); * учетверенное слово (одно 64-разрядное слово).
Эти типы данных могут обрабатываться в восьми 64-разрядных регистрах MMX0 - MMX7, которые фактически являются частью регистров АП. В систему команд для поддержки MMX введено 57 дополнительных команд для одновременной обработки нескольких единиц данных. Команды ММХ доступны из любого режима работы процессора. Команды MMX выполняются так же, как и команды с плавающей точкой. Более того, механизм сохранения и восстановления состояния вычислительной среды, принятый для операций с плавающей точкой, применим и при выполнении ММХ-вычислений.
Рис. 3.3. Регистры данных ЦП Pentium IV
SSE-расширение реализовано в виде аппаратно-программного модуля, который включает регистры третьей группы разрядностью в 128 бит, имеющих обозначение ХММО - ХММ7, и 32-разрядный регистр управления/состояния MXCSR (рис. 3.4). Программная часть SSE-расширения включает в себя набор SSE-команд для работы с данными с плавающей запятой. Содержимое ХММ-регистра может представлять собой:
* четыре 32-разрядных операнда с плавающей запятой в КВФ (рис. 2.1);
* два 64-разрядных операнда с плавающей запятой в ДВФ (рис. 2.1);
* один 128-разрядный операнд, представляющий числа в диапазоне от 2-126 до 2127.
Поскольку аппаратно модуль SSE-расширения реализован независимо от других модулей, то это позволяет выполнять SSE-комапды параллельно с командами АП и ММХ-командами.
Рис. 3.4. Младшие 16 разрядов регистра управления-состояния MXCSR
В процессе обработки данных команды SSE-расширения могут возбуждать исключительные ситуации, аналогичные тем которые были описаны в разделе 2.2. Эти события фиксируются в регистре MXCSR. Старшие 16 разрядов регистра управления-состояния не используются. Все поля регистра, за исключением FZ, обозначаются и используются аналогично соответствующим полям регистров SR и CR арифметического процессора, описанном в 2.2. Бит FZ используется, если результат операции близок к нулю. При этом ЦП выполняет следующие действия: • возвращает значение 0 и знак результата; • устанавливает флаги Р (бит 5) и U (бит 4); • маскирует биты исключений. Перед тем как создавать программы, использующие MMX- и SSE-расширения, следует убедиться в том, что данный тип процессора поддерживает эту технологию. В разделе 6.3 приводится пример такой проверки.
3.3. Система команд ММХ-расширения
Любая команда, относящаяся к ММХ-расширению начинается с буквы p. Большинство команд имеют суффикс, который определяет тип данных и используемую арифметику: • us (unsigned saturation) -беззнаковое насыщение; • s или ss (signed saturation) -знаковое насыщение;
• b, w, d, q - указывают тип данных (байт, 16-разрядное слово, 32-разрядное слово и 64-разрядное слово, соответственно). Если в суффиксе есть две из этих букв, первая соответствует входному операнду, вторая - выходному;
• если в суффиксе нет ни символа s, ни символов ss, то применяется циклическая арифметика (wraparound). Если в этом случае результат операции выходит за двоичную разрядную сетку используемого типа данных, то "лишние" старшие биты результата отбрасываются.
Система команд может быть представлена в виде 5-ти групп команд: передачи данных, арифметических, логических и команд сдвига, упаковки и распаковки и группы специальных команд.
Команды передачи данных. В группу команд передачи данных входят две команды movd и movq. Команда movd позволяет копировать 32-разрядное число: • из младших разрядов одного ММХ-регистра в младшие разряды другого (старшие разряды заполняются нулями); • из переменной в памяти либо из целочисленного регистра в младшие 32 разряда ММХ-регистра (старшие разряды заполняются нулями); • из младших разрядов ММХ-регистра в ячейку памяти либо в целочисленный регистр.
Команда movq выполняет копирование 64 бит: • из одного ММХ-регистра в другой; • из памяти в ММХ-регистр; • из ММХ-регистра в память. Среди всех ММХ-команд только movd и movq могут иметь выходной операнд в памяти, a movd - единственная команда, операнд которой может находиться в 32-разрядном регистре процессора.
Арифметические команды включают команды сложения, вычитания, умножения и сравнения.
Команды сложения и вычитания работают с упакованными байтами и словами со знаком и без знака, а также с упакованными двойными словами со знаком. Они могут использовать как циклическую арифметику, так и арифметику с насыщением. Команды сложения paddb, paddw, paddd (циклическая арифметика), paddsb, paddsw (арифметика со знаковым насыщением) и paddusb, paddusw (арифметика с беззнаковым насыщением) - входной операнд может находиться в ММХ-регистре или в памяти; выходной операнд должен находиться в ММХ-регистре. Работа команды paddusw ММ0,ММ1 проиллюстрирована на рис. 3.5. Из рисунка видно, что слово (16 - 31 разряд) содержит значение 65 535. Поскольку сумма соответствующих слов превышает предельно допустимое значение для данного типа операндов, в качестве суммы берется граничное значение.
Рис. 3.5. Сложение по команде paddusw MM0,MM1
Команды вычитания psub, psubw, psubd (циклическая арифметика), psubsb, psubsw (арифметика со знаковым насыщением) и psubusb, psubusw (арифметика с беззнаковым насыщением) - входной операнд может находиться в ММХ-регистре или в памяти; выходной операнд должен находиться в ММХ-регистре. Команды вычитания работают с теми же типами данных и формируют результат точно так же, как и команды сложения.
Команды умножения попарно перемножают 16-разрядные слова и дают результат по правилам циклической арифметики. Команда pmulhw ( pmullw) - попарное умножение 16-разрядных слов со знаком, находящихся во входном и выходном операндах. Результатом операции являются четыре 32-разрядных произведения, при этом старшие (младшие) разряды произведений сохраняются в 16-разрядных словах выходного операнда, а младшие (старшие) разряды произведений теряются. Входным операндом может выступать ММХ-регистр или ячейка памяти, а выходным операндом должен быть ММХ-регистр. Для получения полного результата умножения с помощью этих команд необходимо выполнить такую последовательность шагов: * получить старшие 16 бит произведения, используя команду pmulhw. * получить младшие 16 бит произведения, используя команду pmullw.
* объединить частичные результаты в одно двойное слово с помощью команд punpckhwd и punpcklwd.
Команда pmaddwd - попарное умножение 16-разрядных слов со знаком, находящихся в двух операндах. После получения в результате четырех 32-разрядных произведений первое произведение складывается со вторым, а третье - с четвертым. Суммы записываются в 32-разрядные слова выходного операнда. Работа команды pmaddwd ММ0,ММ1 проиллюстрирована на рис. 3.5.
Рис. 3.5. Умножение по команде ppaddwd MM0,MM1
Команды сравнения попарно сравнивают элементы данных (байты, 16- или 32-разрядные слова) входного и выходного операндов и в зависимости от результата сравнения соответствующий элемент данных выходного операнда заполняется нулями либо единицами. Входным операндом могут выступать ММХ-регистр или ячейка памяти, а выходной операнд должен находиться в ММХ-регистре.
Команды pcmpeqb, pcmpeqw, pcmpeqd заполняют элемент данных выходного операнда единицами, если соответствующие элементы равны и нулями, в противном случае. Команды pcmpgtb, pcmpgtw, pcmpgtd заполняют элемент данных выходного операнда единицами, если соответствующий элемент данных выходного операнда больше соответствующего входного элемента и нулями, в противном случае. Сдвиги и логические команды.
Команды сдвига выполняют сдвиг каждого элемента данных (16-, 32- или 64-разрядного слова) в выходном операнде на величину, задаваемую входным операндом. Входной операнд может быть непосредственным операндом либо находиться в ММХ-регистре или в памяти. Выходной операнд должен находиться в ММХ-регистре.
Команды psllw, pslld, psllq выполняют логический сдвиг влево, а команды psrlw, psrld, psrlq - вправо.
Команды psraw, psrad осуществляют арифметический сдвиг вправо для 16- и 32-разрядных слов.
Логические команды выполняют поразрядные логические операции над всеми 64 битами своих операндов. Они реализуют логические операции И, ИЛИ, И-НЕ, исключающего ИЛИ. Входной операнд может быть ММХ-регистром или операндом в памяти. Выходной операнд должен находиться в ММХ-регистре.
Команда pand (логическое И) - вычисляет поразрядное И своих операндов.
Команда pandn (логическое И-НЕ) - вычисляет поразрядное НЕ вы- выходного операнда, а затем поразрядное И между входным операндом и инвертированным значением выходного операнда.
Команда роr (логическое ИЛИ) - вычисляет поразрядное ИЛИ своих операндов. Команда рхоr(исключающее ИЛИ) - вычисляет поразрядное исключающее ИЛИ своих операндов. Команды упаковки преобразуют длинные элементы данных (16- и 32-разрядные слова) в более короткие. Если исходное значение "не помещается" в коротком элементе данных, то происходит "насыщение" - результатом считается граничное значение допустимого диапазона выходного типа данных. Команды распаковки попарно объединяют элементы данных из обоих операндов в более длинные элементы выходного операнда. Этими командами можно пользоваться для увеличения числа значащих разрядов при вычислениях. Входным операндом может выступать ММХ-регистр или ячейка памяти, выходной операнд должен находиться в ММХ-регистре;
Команды упаковки и упаковки.
Команды упаковки packsswb, packssdw - преобразуют длинные элементы данных (16- и 32-разрядные слова со знаком) в более короткие (байты или 16-разрядные слова со знаком). На рис. 3.6 иллюстрируется выполнение команды packssdw MM0,MM1.
Команда упаковки packuswb - выполняет преобразование 16-разрядных слов со знаком из обоих операндов в байты без знака и записывает их в выходной операнд. Если исходное слово со знаком было больше FFh, результатом преобразования считается FFh. Если исходное слово со знаком отрицательно, результатом преобразования считается 0h. Рис. 3.6. Выполнение команды упаковки packssdw MM0,ММ1.
Команды распаковки punpckhbw, punpckhwd, punpckhdq - попарно объединяют исходные элементы данных (байтов, 16- или 32-разрядных слов), находящиеся в старших 32 разрядах обоих операндов. Полученные в результате длинные элементы записываются в выходной операнд. Исходные значения младших разрядов операндов на результат не влияют. Рис. 3.7. Выполнение команды распаковки punpckhbw MM0,MM1.
На рис. 3.7 проиллюстрирован механизм работы команды punpckhbw. Суть работы команд punpckhwd и punpckhdq аналогична, с той лишь разницей, что punpckhwd распаковывает старшие два слова обоих регистров, а punpckhdq старшие двойные слова.
Команды распаковки punpcklbw, punpcklwd, punpckldq - попарно объединяют исходные элементы данных (байтов, 16- или 32-разрядных слов), находящиеся в младших 32 разрядах обоих операндов. Полученные в результате длинные элементы данных записываются в выходной операнд. Исходные значения старших разрядов операндов на результат не влияют. Механизм работы команды распаковки punpcklwd проиллюстрирован на рис. 3.8.
Рис. 3.8. Выполнение команды распаковки punpcklwd MM0,MM1.
Суть работы команд punpcklbw и punpckldq аналогична, с той разницей, что punpcklbw распаковывает младшие четыре байта, а punpckldq - младшие двойные слова.
Специальные команды не имеют специфики какой-либо из рассмотренных выше групп.
Команды pavgb, pavdw - вычисляют среднее значение двух чисел, представленных байтами или словами. Значения операндов рассматриваются как беззнаковые целые числа. В качестве входного операнда может выступать ММХ-регистр или 64-разрядная ячейка памяти, выходным операндом служит один из ММХ-регистров.
Команда pextrw - извлекает одно из четырех упакованных слов входного операнда и имеет три аргумента: входной операнд, выходной операнд и маска. Младшие два бита маски задают во входном операнде номер упакованного слова, подлежащего извлечению. Извлеченное слово сохраняется в младшем слове выходного операнда. Выходным операндом этой команды может выступать один из 32-разрядных регистров общего назначения. Старшее слово выходного операнда обнуляется.
Команда pinsrw - вставляет слово в одно из четырех упакованных слов выходного операнда. Выходным операндом является один из ММХ-регистров, а входным операндом может выступать один из 32-разрядных регистров общего назначения, младшее слово которого будет вставлено в выходной операнд. Номер позиции, куда помещается операнд, определяется младшими двумя битами маски.
Команды pmaxusb, pmaxsw, (pminusb, pminsw) - извлекают максимальное (минимальное) значение из каждой пары упакованных элементов в выходном и входном операндах. В качестве выходного операнда может выступать ММХ-регистр, а в качестве входного - ММХ-регистр или 64-разрядная ячейка памяти. Команда pmovmskb - формирует байт, содержащий знаковые биты восьми байтов, содержащихся во входном операнде, в качестве которого может выступать один из ММХ-регистров. Выходным операндом является 32-разрядный регистр общего назначения, младший байт которого будет содержать результат.
Команда psadbw - вычисляет суммарную разность значений беззнаковых байтов входного и выходного операндов. Входным операндом может выступать ММХ-регистр или 64-разрядная ячейка памяти, а выходным - один из ММХ-регистров.
3.4. Система команд SSE-расширения
Набор SSE-расширения включает 70 команд. Их подробное описание можно найти в фирменном руководстве Intel. Арифметические команды могут выполняться в двух контекстах: скалярном и параллельном. Параллельные арифметические операции обрабатывают одновременно 4 двойных слова и имеют в своей мнемонике суффикс ps, а скалярные - обрабатывают только младшие 32-разрядные двойные слова упакованных операндов, не затрагивая при этом три старших двойных слова. Исключение составляют некоторые команды скалярной пересылки данных. Мнемоническое обозначение этих команд включает суффикс ss.
Набор команд SSE-расширения можно разделить на пять групп: команды передачи данных, арифметические команды, логические команды, команды преобразования и специальные команды.
Команды передачи данных. Включают восемь команд, позволяющих выполнять операции над 128-, 64- и 32-разрядными операндами.
Команды movaps (movups) - пересылка выровненных (невыровненных) по 16-байтовой границе 128-разрядных операндов. В качестве входного операнда могут выступать ХММ-регистр или 128-разрядная ячейка памяти, выходным операндом может служить один из ХММ-регистров. Если адрес ячейки памяти не будет выровнен по 16-байтовой границе, то по команде movaps произойдет исключение общей защиты. Команда movhps - пересылка невыровненных 64 бит из входного операнда в выходной. Один из операндов обязательно должен быть ХММ-регистром, в качестве второго может выступать 64-разрядная ячейка памяти. Пересылаются только старшие 64 бит входных операндов. Младшие 64 бит обоих операндов не изменяются. Если данные передаются из ХММ-регистра, то пересылке подлежат только старшие 64 бит. Команда не требует выравнивания по 16-байтовой границе адреса ячейки памяти. Команды movhlps (movlhps) - пересылка невыровненных 64 бит из входного операнда в выходной. Оба операнда должны находиться в ХММ-регистрах. Пересылаются только старшие (младшие) 64 бит входных операндов. В результате выполнения этой команды изменяются младшие (старшие) 64 бит регистра-приемника. Схема выполнения команд показана на рис. 3.9.
Рис. 3.9. Выполнение команд пересылок movhlps и movlhps
Команда irovlps - пересылка невыровненных 64 бит из входного операнда в выходной. Один из операндов обязательно должен быть ХММ-регистром, в качестве второго может выступать 64-разрядная ячейка памяти. Пересылаются только младшие 64 бит входных операндов. Старшие 64 бит обоих операндов не изменяются. Если данные передаются из ХММ-регистра, то пересылке подлежат только младшие 64 бит. Команда не требует выравнивания по 16-байтовой границе адреса ячейки памяти. Команда movmskps - пересылка знакового бита каждого из четырех упакованных чисел входного операнда в младшие четыре бита выходного операнда. В качестве входного операнда может выступать только ХММ-регистр, а в качестве выходного операнда - 32-разрядный регистр общего назначения. Эта команда используется для организации условных переходов. Команда movss - пересылка 32 младших битов из источника в приемник, при этом один из операндов должен быть ХММ-регистром, а второй - 32-разрядной ячейкой памяти. При выполнении операции пересылки из памяти младшие 32 бита помещаются в младшие 32 разряда ХММ-регистра. Если выполняется пересылка из ХММ-регистра, то выбираются младшие 32 разряда регистра, остальные разряды не изменяются.
Арифметические команды. Группа арифметических команд включает команды сложения, вычитания, умножения, деления, извлечения квадратного корня, вычисления максимального и минимального значения, вычисление обратных значений, а также команды сравнения.
При выполнении параллельных операций (мнемокоды с суффиксом ps) в качестве входного операнда (операнда-источника) выступают один из ХММ-регистров или 128-разрядная ячейка памяти. Выходным операндом (операндом-приемником) является один из ХММ-регистров. Скалярные операции (мнемокоды с суффиксом ss) предполагают, что младшие двойные слова операндов должны быть числами с плавающей запятой в КВФ формате. Результат помещается в операнд-приемник, в качестве которого может выступать ХММ-регистр. Входным операндом может быть ХММ-регистр или 32-разрядная ячейка памяти. Таблица 3.2
ОперацияПараллельнаяСкалярная СложениеaddpsAddss ВычитаниеsubpsSubss УмножениеmulpsMulss ДелениеdivpsDivss Извлечение корняsqrtpsSqrtss Нахождение максимумаmaxpsMaxss Нахождение минимумаminpsMinss Нахождение обратного значения (1/x)reppsRepss Нахождение обратного значения корня rsqrtpsRsqrtss Мнемокоды арифметических команд представлены в табл. 3.2 и табл. 3.3.
Команды сравнения позволяют определять соответствие операндов указанным условиям и, в зависимости от результата сравнения, устанавливают в нужном элементе операнда-приемника двоичные нули (если условие не выполняется) или двоичные единицы (если условие выполняется). Команды сравнения могут выполняться параллельно над упакованными операндами или скалярно над младшими двойными словами. Все команды имеют два операнда: в качестве входного операнда, или операнда-источника, могут выступать ХММ-регистр или ячейка памяти 128-разрядная для параллельных команд и 32-разрядная для скалярных. Выходным операндом, или операндом-приемником, может быть только один из ХММ-регистров, в котором задействованы либо 128 бит (параллельные команды), либо младшие 32 бита (скалярные команды). Таблица 3.3
ОперацияПараллельнаяСкалярнаяСравнение - условие "равно" cmpeqps cmpeqssСравнение - условие "меньше" cmpltps cmpltssСравнение - условие "меньше или равно" cmpleps cmplessСравнение - условие "неупорядоченности" cmpunordps cmpunordssСравнение - условие "не равно" cmpneqps cmpneqssСравнение - условие "не меньше" cmpnltps cmpnltssСравнение - условие "не меньше или равно" cmpnleps cmpnlessСравнение - условие "упорядоченности" cmpordps cmpordssСкалярное сравнение с установкой eflags - comissНеупорядоченное сравнение с установкой eflags - ucomiss
Две последние команды в табл 3.3 comiss и ucomiss имеют два операнда и выполняют скалярное сравнение младших 32-разрядных операндов. Особенностью этих команд является то, что содержимое обоих операндов после выполнения операции сравнения остается неизменным, а в регистре флагов EFLAGS процессора определенным образом устанавливаются флаги ZF, PF и CF, а флаги OF, SF и AF сбрасываются в 0. В качестве входных операндов обеих команд могут выступать ХММ-регистры или 32-разрядные переменные в памяти, выходными операндами могут быть только ХММ-регистры. Команды ucomiss и comiss отличаются тем, что генерируют исключительные ситуации для различных форматов не-чисел (NAN).
Логические команды Все логические команды являются параллельными и позволяют выполнять операции логического И, ИЛИ, И-НЕ, исключающего ИЛИ над отдельными парами битов операндов. Каждая команда имеет два операнда: в качестве входного операнда (источника) могут выступать ХММ-регистр или 128-разрядная ячейка памяти, а в качестве выходного (приемника) - ХММ-регистр. После выполнения команды содержимое операнда-источника не изменяется, а результат помещается в операнд-приемник
Команда andps - параллельная операция логического И над парами битов операнда-источника и операнда-приемника.
Команда andnps - параллельная операция логического И-НЕ над парами битов операнда-источника и операнда- приемника. Команда orps - параллельная операция логического ИЛИ над парами битов операнда-источника и операнда-приемника. Команда xorps - параллельная операция логического исключающего ИЛИ над парами битов операнда-источника и операнда-приемника. Команды преобразования.
Команды преобразования могут выполняться, как и арифметические команды, могут выполняться в параллельном и скалярном контекстах. К этой группе команд относятся: Команда cvtps2pi - параллельное преобразование двух младших упакованных 32- 32-разрядных чисел с плавающей точкой в коротком формате в два 32-разрядных целых числа. Команда имеет два операнда. В качестве входного операнда могут выступать ХММ-регистр или 128-разрядная ячейка памяти. Выходным операндом может служить один из регистров ММХ. На результат преобразования влияет установка битов поля rc, определяющего режим округления, регистра управления-состояния (MXCSR). Команда cvtss2si - скалярное преобразование младшего 32-разрядного числа с плавающей точкой в коротком формате в 32-разрядное целое число. Команда имеет два операнда. В качестве входного операнда могут выступать ХММ-регистр или 128-разрядная ячейка памяти. Выходным операндом может служить один из 32-разрядных регистров общего назначения. Как и для команды cvtps2pi, на результат преобразования влияет установка битов поля гс, определяющего режим округления, регистра управления-состояния (MXCSR). Команда cvttps2pi - параллельное преобразование двух младших упакованных 32-разрядных чисел с плавающей точкой в коротком формате в два 32-разрядных целых числа путем отсечения дробной части исходных операндов. Команда имеет два операнда. В качестве входного операнда могут выступать ХММ-регистр или 128-разрядная ячейка памяти. Выходным операндом может служить один из ММХ-регистров. Установка битов поля rc на результат не влияет. Команда cvttss2si - скалярное преобразование младшего 32-разрядного числа с плавающей точкой в коротком формате в 32-разрядное целое число путем отсечения дробной части входного операнда. Команда имеет два операнда. В качестве входного операнда могут выступать ХММ-регистр или 128-разрядная ячейка памяти, а выходным операндом может служить один из 32-разрядных регистров общего назначения. Установка битов поля rc. Команда cvtpi2ps - преобразование двух целых 32-разрядных чисел со знаком в два 32-разрядных числа с плавающей точкой в коротком формате. Команда имеет два операнда. В качестве входного операнда, или операнда-источника, может выступать ММХ-регистр или 64-разрядный операнд в памяти. Выходным операндом может служить только ХММ-регистр. Результат преобразования помещается в младшие два 32-разрядных элемента ХММ-регистра, старшие два элемента остаются без изменений. На результат преобразования влияет установка битов поля rc. Команда cvtsi2ss - преобразование 32-разрядного числа в целочисленном формате в 32-разрядное число с плавающей точкой в коротком формате. Команда имеет два операнда. В качестве входного операнда, или операнда-источника, может выступать 32-разрядный регистр общего назначения или операнд в памяти. Выходным операндом может служить только ХММ-регистр. Результат преобразования помещается в младший 32-разрядный элемент ХММ-регистра, при этом три старших элемента остаются без изменений. На результат преобразования влияет установка битов поля rc.
Специальные команды.
Включают три команды перемещения, четыре команды управления состоянием и три команды управления кэшированием.
Команды перемещения unpckhps (unpcklps)- выполняют параллельное перемещение старших (младших) двойных слов из операнда-источника и операнда-приемника в операнд-приемник. При этом два старших (младших) двойных слова операнда-источника становятся старшими (младшими) двойными словами в 64-разрядных элементах операнда-приемника, а два старших (младших) двойных слова операнда-приемника - младшими (старшими) двойными словами в 64-разрядных элементах операнда-приемника. Входным операндом (источником) могут выступать ХММ-регистр или 128-разрядная ячейка памяти, в качестве выходного операнда должен выступать ХММ-регистр.
Команда перемещения shufps - выполняет параллельное перемещение 32-разрядных упакованных операндов в соответствии с заданной маской. Команда имеет три операнда: входной, выходной и маску. Маска представляет собой непосредственное 8-разрядное значение, задающее порядок перемещения операндов. Младшие 4 бита маски указывают номера двух упакованных чисел приемника, которые становятся младшими упакованными значениями результата, а старшие 4 бита - номера упакованных чисел источника, которые становятся старшими упакованными значениями результата. Рис. 3.10. Выполнение команды перемещения shufps XMM0,XMM1,27h
На рис. 3.10 представлена схема, поясняющая особенности выполнения команды shufps. Как видно из рис. 3.10, отсчет упакованных чисел начинается с нуля. Команду shufps можно использовать для произвольных манипуляций упакованными элементами.
Команда управления состоянием stmxcsr - сохраняет содержимое регистра управления-состояния в 32-разрядной ячейке памяти, которая является единственным операндом. Команда управления состоянием ldmxcsr - загружает регистр управления-состояния содержимым 32-разрядной ячейки памяти, которая является единственным операндом.
Команда управления состоянием fxsave - сохраняет состояние ММХ- и SSE-расширения в область памяти размером в 512 байт. В качестве операнда выступает адрес области памяти. Команда управления состоянием fxrstor - загружает сохраненное состояние ММХ- и SEE-расширения из области памяти размером 512 байт. В качестве операнда выступает адрес области памяти, который должен быть выровнен по 16-байтовой границе. Команда управления кэшированием maskmovq - выполняет выборочное сохранение в памяти байтов упакованных данных ММХ-регистра. В качестве операнда-источника используется один из ММХ-регистров, а операндом-приемником служит область памяти, адрес которой задан в регистре EDI. Маска указывает, какие байты будут сохранены в памяти, и формируется из старших разрядов каждого байта, находящегося в ММХ-регистре.
Команда управления кэшированием movntq - записывает в память, минуя кэш, целочисленные упакованные данные в формате ММХ. Операндом-источником служит ММХ-регистр, а операндом-приемником - 64-разрядная ячейка памяти.
Команда управления кэшированием movnps - записывает в память, минуя кэш, упакованные числа с плавающей запятой в КВФ формате. Операндом-источником служит ХММ-регистр, а операндом-приемником - 128-разрядная ячейка памяти, адрес которой должен быть выровнен по 16-байтовой границе.
Дальнейшим прогрессом SSE-технологии явилось SSE2-расширение, добавившее 144 новых команды, которые позволили оперировать с такими типами данных как: • упакованные и скалярные числа с плавающей запятой в КВФ формате; • упакованные и скалярные числа с плавающей запятой в ДВФ формате; • упакованные и скалярные целые числа размером 128 бит.
Эта технология предназначена для разработки приложений трехмерной графики, обработки сигналов, кодирования и декодирования, распознавания речи и т. п. Кроме того, SSE2-команды позволяют: • разрабатывать алгоритмы, в которых одновременно можно обрабатывать смешанные типы данных: упакованные числа с плавающей точкой в коротком формате и указанные с двойной точностью, а также целые 64- и 128-разрядные числа; • работать с данными различной размерности: байтом, словом, двойным словом, учетверенным словом и двойным учетверенным словом. Следующим шагом совершенствования SSE-технологи стало SSE3-расширение, которое добавило еще 13 новых команд. Все они, за исключением трех, используют ХММ-регистры и предназначены для повышения производительности при выполнении следующих операций: • быстрое преобразование вещественного числа в целое (соответствующая команда fisttp заменяет семь "обычных" команд); • сложные арифметические вычисления (команды addsubps, addsubpd, movsldup, movshdup, movddup); • кодирование видео (команда 1ddqu); • обработка графики (команды haddps, hsubps, haddpd, hsubpd); • синхронизация потоков (команды monitor, mwait). Детальное описание новых команд можно найти в фирменных источниках Intel.
Контрольные вопросы
1. В какой модели процессора объединились ЦП и АП в одном кристалле?
2. Объясните главное назначение ММХ-расширения. Какие новые регистры данных добавились для его реализации?
3. Чем отличаются программные модели Pentium II и Pentium IV?
4. Какие форматы вещественных чисел доступны для параллельной обработки в SSE и SSE2 расширениях команд?
5. Что нового дало совершенствование технологии с введением SS3-расширения?
6. В чем сущность и каково назначение команд упаковки и распаковки?
7. Какие операции выполняются быстрее за счет удвоения внутренней тактовой частоты ЦП?
8. В чем отличие ситуации кэш-промаха и кэш-попадания?
9. Обратная или прямая запись в основную память используется в ЦП Pentium IV и почему?
10. Объясните особенности пакетно-сетевой архитектуры ЦП Pentium IV.
11. Сколько регистров данных образуют программную модель ЦП Pentium IV?
12. В чем заключается назначение регистра управления-состояния MXCSR?
13. Что происходит при "переполнении" по команде paddusw MM0,MM1?
14. Поясните назначение кэш-памяти микрокоманд ЦП.
15. Перечислите команды управления кэшированием и объясните их предназначение.
16. Сколько уровней внутренней кэш-памяти включает Pentium IV и как они распределяются между обрабатываемыми данными?
17. Почему увеличение числа стадий конвейера позволяет увеличить тактовую частоту работы ЦП?
18. Каков размер блока регистров расширения и для чего эти регистры служат?
19. Что является задачей блока трассировки и предсказания ветвлений и как он работает?
20. Объясните суть технологии удвоения внутренней тактовой частоты (Rapid Execution Engine).
21. Для чего служит кэш-память микрокоманд и что дает ее использование?
22. В чем заключаются основные отличия архитектуры Pentium MMX и Pentium III?
23. Дайте сравнительную характеристику ЦП Pentium III и Pentium IV.
24. Объясните назначение команд упаковки и распаковки и приведите примеры их использования.
25. Поясните как выполняется умножение по команде ppaddwd MM0,MM1?
26. На какие типы данных указывает каждый из суффиксов b, w, d, q в ММХ-командах?
27. Какие действия выполняются по команде pandn (логическое И-НЕ)?
28. К какому расширению относится команда punpckhbw?
29. Сколько данных одновременно могут обрабатывать параллельные арифметические операции?
30. Какие суффиксы имеют мнемокоды скалярных и параллельных операций?
Раздел 4. Системные устройства ВМ
4.1. Программируемый контроллер прерываний
Задача контроллера состоит в приеме запросов прерывания от ВУ, сравнении их приоритетов и посылки запроса прерывания в ЦП вместе с информацией о местоположении соответствующей подпрограммы. В функции ПКП также входит изменение дисциплины обслуживания ВУ, т. е. установка различных режимов присвоения приоритетов ВУ в соответствии с общими требованиями к системе.
Один контроллер позволяет обслуживать восемь ВУ, число которых может быть увеличено путем каскадирования контроллеров. Так, в ВМ используется два ПКП и число обслуживаемых аппаратных прерываний равно 15. На рис. 4.1 изображена схема ПКП.
Буфер данных БД вместе со схемой управления обменом по ШД D7 - D0 обеспечивает прием управляющих слов (команд) в контроллер при программировании, а также выдачу состояний регистров контроллера и информации об адресе подпрограммы. Регистр запросов прерываний РЗП служит для запоминания всех запросов от ВУ по входам IR7-IR0. Регистр масок прерываний РМП хранит маску, с помощью которой можно запретить обслуживание запросов по любому входу. Схема сравнения приоритетов СхСПр выбирает запрос с наибольшим приоритетом среди вновь поступивших и уже обслуживаемых запросов. Регистр обслуживаемых прерываний РОП. содержит единицы на позициях, соответствующих обслуживаемым запросам, причем каждая единица запрещает обслуживание запросов с меньшим приоритетом, если отсутствует режим специального маскирования. Управляющее устройство УУ, содержащее регистры команд инициализации РКИ и регистры рабочих команд РРК, обеспечивает выработку внешних и внутренних управляющих сигналов. Блок каскадирования БК осуществляет связь ведущей БИС контроллера с ведомыми при использовании нескольких ПКП в микропроцессорной системе.
Рис. 4.1. Схема программируемого контроллера прерываний Intel 8259A
Последовательность действий при обслуживании прерываний: 1. ПКП воспринимает запросы прерывания по входам IR от одного или нескольких ВУ, записывает единицы в соответствующие разряды РЗП, проверяет маскирование, определяет запрос с наивысшим приоритетом и посылает сигнал прерывания INT на соответствующий вход ЦП. 2. Если прерывания разрешены, ЦП заканчивает выполнение текущей команды и активизирует сигнал подтверждения прерывания INTA. 3. По получении первого импульса INTA ПКП устанавливает в "1" разряд регистра РОП, соответствующий запросу, подлежащему обслуживанию, а одноименный разряд регистра РЗП сбрасывается в "0". 4. ЦП вырабатывает второй импульс INTA, по получении которого контроллер посылает по ШД в ЦП8-разрядный указатель (вектор), используемый для определения начального адреса подпрограммы обслуживания прерывания. 5. ЦП переходит на выполнение подпрограммы обслуживания прерывания.
В режиме автоматического окончания прерывания AEOI цикл входа в прерывание завершается по окончании второго импульса INTA, по которому соответствующий разряд РОП сбрасывается в "0". В режиме обычного окончания разряд регистра РОП, соответствующий текущему уровню прерывания, остается в "1> до появления команды EOI - конец прерывания. Программирование контроллера прерываний. Контроллер программируется с помощью команд, которые формируются в регистре АL центрального процессора и передаются в ПКП по команде OUT. Различают два вида команд программирования: команды инициализации ICW, используемые для начальной подготовки контроллера к работе, и рабочие команды OCW, предназначенные для задания маски, различных режимов работы ПКП, а также для обеспечения контрольного считывания содержимого регистров ПКП. Управляющие сигналы, которые сопровождают подачу команд, приведены в табл. 4.1. Таблица 4.1.
A0D4D3RDWRCSОперация000100ШД -> ОСW2001100ШД -> ОСW301Х100ШД -> ICW11ХХ100 ШД -> ICW2, ICW3, ICW4, OCW10--010РЗП, РОП -> ШД1--010РМП -> ШДХХХ110 Нет операции (выходы D7 - D0ХХХХХ1- в третьем состоянии) Различают четыре основных режима работы контроллера: полной вложенности, циклического приоритета, специального маскирования и поллинга (последовательного опроса). Режим полной вложенности, при котором каждый вход запроса прерываний имеет фиксированный приоритет от высшего уровня (вход IRO) до низшего (вход IR7), является стандартным и не требует использования рабочих команд. Остальные режимы, а также состояние регистра маски РМП могут быть заданы с помощью следующих рабочих команд. Команда OCW1 устанавливает и сбрасывает разряды регистра РМП: установленный в "1" i-ый разряд регистра маскирует вход IRi; во всех режимах, в результате чего запросы по этому входу не будут вызывать перехода к программе обслуживания. Команда OCW2 управляет режимами сдвигов приоритетов и окончаний прерываний. Команда OCW3 служит для установки режимов маскирования, считывания статуса и поллинга.
Режимы работы контроллера. Режим полной вложенности - устанавливается сразу после окончания инициализации. Приоритеты запросов прерывания упорядочиваются в сторону убывания от 0 до 7. Добавим, что в системе с каскадированием контроллеров полная вложенность обеспечивается только по входам ведущего контроллера. При обслуживании запроса по какому-либо входу ведомого контроллера запросы по другим его входам (даже с более высоким приоритетом) не обслуживаются. Специальный режим полной вложенности. Применяется тогда, когда в системе используется каскадирование контроллеров и вложенность приоритетов должна сохраняться для каждого контроллера. Этот режим, устанавливаемый командой ICW4, отличается от обычного режима полной вложенности следующим: - когда обслуживается запрос от некоторого ведомого контроллера, этот контроллер не закрыт от приоритетной логики ведущего контроллера и дальнейшие запросы на прерывание от входов с более высоким приоритетом в пределах ведомого контроллера будут распознаваться ведущим контроллером и инициировать запрос прерывания для ЦП (в обычном режиме полной вложенности ведомый контроллер маскируется, если его запрос находится в обслуживании, так что другие запросы от него не воспринимаются); - если запускается подпрограмма обслуживания прерывания, то программным путем необходимо проверить, является ли данное прерывание единственным от этого ведомого контроллера. Это. делается с помощью посылки неспецифической команды окончания прерывания EOI на подчиненный контроллер с последующим чтением содержимого РОП и проверкой его на нуль. Если проверка удовлетворена, то такая же команда EOI посылается на ведущий контроллер для анализа его РОП. Режимы циклического приоритета. Используются в тех случаях, когда требуется установить одинаковые приоритеты на обслуживание ВУ. При этом любое обслуженное ВУ получает низший приоритет, а приоритеты остальных устройств циклически сдвигаются относительно него. Повторное обслуживание ВУ возможно лишь после обслуживания всех остальных устройств. Такой режим автоматического сдвига приоритетов называется режимом А и устанавливается командой OCW2. В контроллере имеется также режим программного сдвига приоритетов - режим В. В этом случае разработчик может с помощью команды OCW2 задавать номер входа, которому будет присвоен низший приоритет, а приоритеты других входов зафиксируются по отношению к заданному. Режим cпециального маскирования. Применяется для того, чтобы программы обслуживания прерываний могли динамически изменять структуру системных приоритетов в процессе работы. Например, при выполнении какой-либо части подпрограммы обслуживания необходимо запретить запросы более низких уровней, а при выполнении другой части - разрешить их. Трудность реализации таких действий состоит в том, что пока выполняется подпрограмма и соответствующий разряд в регистре РОП не сброшен, контроллер не реагирует на запросы с более низким приоритетом. Для разрешения прерываний со всех уровней (в том числе и с более низких) устанавливается режим специального маскирования (затенения), при котором запрещается только прерывание на данном уровне. Этот режим задается и отменяется командой OCW3. Рис. 4.2. Схема каскадирования ПКП
Режим опроса (поллинга). Применяется для организации обслуживания запросов прерываний по инициативе программы, выполняемой МП. При этом прерывания ЦП запрещаются путем сброса флага IF и используется команда POLL, которая задается с помощью OCW3. Тогда контроллер воспринимает следующий импульс по входу RD как подтверждение прерывания и выдает на ШД следующий байт: D7 = 1 - устанавливается .в "1", если на вход данного контроллера поступил запрос; D2 - D0 - задают двоичный код входа высшего уровня среди тех, по которым поступили запросы. С помощью команды POLL последовательно опрашиваются все контроллеры прерываний в системе, что позволяет легко наращивать число уровней приоритетов сверх 64. В этом режиме таблица адресов подпрограмм обслуживания не используется, и он полезен в тех случаях, когда одна подпрограмма применяется для обслуживания нескольких уровней прерываний. Каскадирование контроллеров прерываний. Контроллеры прерываний имеют встроенные средства для их каскадирования с целью увеличения числа уровней прерываний. На рис. 4.2 показана схема каскадирования, содержащая три контроллера, в которой контроллер ПКП0 является ведущим, а остальные два - ведомыми. Включение контроллера в качестве ведущего или ведомого определяется соответствующим подключением вывода SP/EN к источнику питания в первом случае и к общей шине - во втором. Шины каскадирования CAS0-CAS2 всех контроллеров соединяются параллельно, причем выводы CAS0-CAS2 ведущего контроллера работают как выходы, а у ведомых контроллеров - как входы. Когда активизируется вход запроса ведомого контроллера, ведущий контроллер разрешает ведомому выдать номер соответствующего уровня прерывания по второму импульсу INTA.
4.2. Программируемый контроллер ПДП
Контроллер прямого доступа к памяти (ПДП) предназначен для обмена данными между устройствами ввода-вывода и ОЗУ без использования центрального процессора, что позволяет освободить процессор для выполнения вычислений параллельно с обменом и независимо от него. Наиболее часто возможности ПДП используются при работе с дисковыми накопителями, однако реализовано использование ПДП и рядом других устройств. Ощутимые преимущества дает использование ПДП в процессе обмена с устройствами, принимающими или передающими данные достаточно большими порциями с высокой скоростью. В компьютерах IBM функции контроллера ПДП выполняет микросхема Intel 8237А. Контроллер имеет 4 независимых канала, каждый из которых может обслуживать одно устройство ввода-вывода.
В работе ПДП различаются 2 основных цикла: цикл ожидания (Idle cycle) и активный цикл (Active cycle). Каждый цикл подразделяется на ряд состояний, занимающих по времени один период часов (тик). Из цикла ожидания контроллер может быть переведен в состояние программирования (Program Condition) путем подачи на вход RESET сигнала высокого уровня, длительностью не менее 300 нc и следующей за ним подачи сигнала низкого уровня (уровня 0) на вывод CS (Chip Select). В состоянии программирования контроллер будет находится до тех пор, пока на выводе CS сохранится сигнал низкого уровня.
В процессе программирования контроллеру задаются три параметра:
- начальный адрес памяти для обмена;
- уменьшенное на единицу число передаваемых байтов;
- направление обмена.
Кроме того, устанавливаются требуемые режимы работы (разрешить или запретить циклическое изменение приоритетов, автоинициализацию, задать направление изменения адреса при обмене и т. д.).
Загрузка 16-разрядных регистров контроллера осуществляется через 8-разрядные порты ввода-вывода. Перед загрузкой первого (младшего) байта должен быть сброшен (очищен) триггер-защелка (триггер первый/последний, First/Last flip-flop), который изменяет свое состояние после вывода в порт первого байта и таким образом дает возможность следующей командой вывода в тот же порт загрузить старший байт соответствующего регистра. Запрограммированный канал должен быть демаскирован (бит маски канала устанавливается при этом в 0), после чего он может принимать сигналы "Запрос на ПДП", генерируемые тем внешним устройством, которое обслуживается через этот канал. Сигнал "Запрос на ПДП" может быть также инициирован установкой в 1 бита запроса данного канала в регистре запросов контроллера. После появления сигнала запроса контроллер входит в активный цикл, в котором выполняется обмен данными. Передача данных может осуществляться в одном из четырех режимов: Режим одиночной передачи (Signle Transfer Mode). После каждого цикла передачи контроллер освобождает шину процессору, но сразу же начинает проверку сигналов запроса и, как только обнаруживает активный сигнал запроса, инициирует следующий цикл передачи. Режим блочной передачи (Block Transfer Mode). В этом режиме наличие сигнала запроса требуется только до момента выдачи контроллером сигнала "Подтверждение запроса на ПДП" (DACK), после чего шина не освобождается вплоть до завершения передачи всего блока. Режим передачи по требованию (Demand Transfer Mode). Данный режим является промежуточным между двумя первыми: передача идет непрерывно до тех пор, пока активен сигнал запроса, состояние которого проверяется после каждого цикла передачи. Как только устройство не может продолжить передачу, сигнал запроса сбрасывается им и контроллер приостанавливает работу. Этот режим применяется для обмена с медленными устройствами, не позволяющими по своим временным характеристикам работать с ПДП в режиме блочной передачи.
Каскадный режим (Cascade Mode). Режим позволяет включить в подсистему ПДП более одного контроллера в тех случаях, когда недостаточно четырех каналов ПДП. В этом режиме один из каналов ведущего контроллера используется для каскадирования с контроллером второго уровня. Для работы в каскаде сигнал HRQ ("Запрос на захват") ведомого контроллера подается на вход DREG ("Запрос на канал ПДП") ведущего, а сигнал DACK ("Подтверждение запроса") ведущего подается на вход HDLA ("Потверждение захвата") ведомого. Такая схема подключения аналогична подключению ведущего (первого) контроллера к микропроцессору, с которым он обменивается сигналами HRQ и HDLA.
Типы передач.
1. Передача память-память (Memory-to-memory). Используется для передачи блока данных из одного места памяти в другое. Исходный адрес определяется в регистрах нулевого канала, выходной - в регистрах первого канала. Число циклов обмена (число байт минус 1) задается в регистре числа циклов канала 1. Передача происходит с использованием рабочего регистра контроллера в качестве промежуточного звена для хранения информации. При передачe память-память может быть задан специальный режим фиксации адреса (Address hold), при котором значение текущего адреса в регистре нулевого канала не изменяется, при этом весь выходной блок памяти заполняется одним и тем же элементом данных, находящимся по заданному адресу. 2. Автоинициализация (Autoinitialization). После завершения обычной передачи использованный канал ПДП маскируется и должен быть перепрограммирован для дальнейшей работы с ним. При автоинициализации маскировка канала после окончания передачи не происходит, а регистры текущего адреса и счетчик циклов автоматически загружаются из соответствующих регистров с начальными значениями. Таким образом для продолжения (повторения) обмена достаточно выставить сигнал запроса на ПДП по данному каналу. 3. Режим фиксированных приоритетов. В этом режиме канал 0 всегда имеет максимальный приоритет, а канал 3 - минимальный. Это означает, что любая передача по каналу с более высоким приоритетом будет выполняться раньше, чем по каналу с более низким приоритетом. 4. Циклический сдвиг приоритетов. Позволяет избежать "забивания" шины одним каналом при одновременной передачe по нескольким каналам. Каждому каналу, по которому прошла передача, автоматически присваивается низший приоритет, после чего право на передачу получает канал с наивысшим приоритетом, для которого передача в данный момент возможна.
5. Сжатие времени передачи (Compressed transfer timing). В случае, если временные характеристики быстродействия обменивающихся устройств совпадают, ПДП может сократить время выполнения каждого такта передачи на 2 цикла часов за счет тактов ожидания, входящих в каждый цикл передачи. Описание внутренних регистров ПДП
Контроллер имеет 344 бита внутренней памяти, организованной в виде регистров. Первые пять регистров имеются в каждом из 4-х каналов.
Регистр начального адреса (Base Address Register). В этом регистре задается стартовый адрес ОЗУ, с которого начинается передача. Регистр содержит 16 разрядов и определяет адрес внутри заданной страницы памяти размером 64К. Регистр начального счетчика циклов (Base Word Count Register). В этом регистре задается начальное число циклов передачи для программируемого канала. Фактическое число передаваемых во время работы ПДП элементов данных на единицу превышает заданное число циклов.
Регистр текущего адреса (Current Address Register). Начальное значение заносится в этот регистр одновременно с регистром начального адреса. В дальнейшем в ходе передачи значение текущего адреса автоматически увеличивается или уменьшается (конкретное направление изменения задается при программировании в регистре режима). Если разрешена автоинициализация, то после окончания передачи в регистр автоматически устанавливается значение из регистра начального адреса. Регистр текущего счетчика циклов (Current Word Count Register). Регистр содержит текущее значение счетчика циклов (число оставшихся циклов передачи). Отображаемое в нем число циклов всегда на единицу меньше числа еще не переданных элементов данных, так как изменение значения в этом регистре проиводится в конце цикла передачи, уже после фактической передачи элемента данных, а конец передачи фиксируется в момент переполнения счетчика (изменение его значения с 0 на 0FFFFh).
Регистр режима (Mode Register). Данный регистр задает режимы работы своего канала контроллера (используются 5 младших разрядов):
разряды 0-1: 00=проверка,
01=запись (в память),
10=чтение (из памяти)
11=недопустимая комбинация
разряд 2: 1- автоинициализация разрешена
0- автоинициализация запрещена
разряд 3: 0=увеличение текущего адреса при обмене
1=уменьшение текущего адреса при обме
разряды 4-5:00=режим передачи по требованию
01=режим одиночной передачи
10=режим блочной передачи
11=каскадный режим.
Следующий набор регистров является общим для всех каналов.
Регистр команд (Command Register). Этот 8-битный регистр управляет работой контроллера. Он программируется, когда контроллер находится в состоянии программирования и очищается командами сброса "Reset" и "Master Clear". Назначение битов регистра команд:
разряд0: 0=запретить передачу память-память, 1=разрешить
1:0=запретить фиксацию адреса в канале 0, 1=разрешить
2:0=разблокировать, 1=заблокировать контроллер
3:0=нормальная временная диаграмма, 1=сжатие времени 4:0=фиксированные приоритеты, 1=циклический сдвиг
5:1=режим расширенной записи, 0=задержки при записи
6:0=активным считается высокий уровень DREQ, 1=низкий
7:0= активным считается высокий уровень DACK, 1=низкий
Регистр состояния (Status Register). Регистр отражает текущее состояние запросов и передач по всем четырем каналам. Биты 0 - 3 устанавливаются в единицу после завершения передачи по каналам 0 - 3 (бит 0 - канал 0, бит 1 - канал 1 и т.д.), если не задан режим автоинициализации. Эти биты очищаются после команды сброса контроллера и после каждой операции считывания состояния из регистра состояния. Биты 4 - 7 указывают по какому из каналов 0 - 3 активен в текущий момент сигнал запроса на ПДП.
Регистр масок (Mask Register). Каждый бит этого 4-битового регистра маскирует/демаскирует свой канал ПДП, при этом значение 1 маскирует канал, значение 0 демаскирует канал и разрешает прием сигнала запроса по этому каналу.
Регистр запросов (Request Register). Сигнал запроса на ПДП (DREQ) может быть издан как обслуживаемым устройством, так и программно. Для программного издания сигнала запроса по одному из 4-х каналов ПДП необходимо установить соответствующий бит в 4-разрядном регистре запросов. Запрос на ПДП может быть отменен записью нулевого значения в соответствующий бит регистра. Бит запроса очищается автоматически при окончании передачи по данному каналу. Все биты запросов очищаются при сбросе контроллера. Для того, чтобы воспринимать программные запросы на ПДП, канал должен находится в режиме блоковой передачи. Рабочий регистр (Temporary Register). Этот 8-разрядный регистр используется для хранения элемента данных, передаваемого в режиме фиксированного адреса при передаче память-память или для временного хранения передаваемого байта при всех остальных режимах передачи.
4.3. Системный таймер
Все ВМ используют программируемый системный таймер (ПСТ), выполняющий три основных функции:
* генерацию прерываний от системных часов, вызывающих инкремент счетчика системного времени в ячейке 0000:046Ch - счетчик тиков таймера (области данных BIOS);
* генерацию запросов на регенерацию памяти;
* генерацию звуковых сигналов.
При инициализации BIOS устанавливает свой обработчик для прерывания таймера. Этот обработчик каждый раз увеличивает на 1 текущее значение четырехбайтовой переменной - счетчик тиков таймера. Если этот счетчик переполняется (прошло более 24 часов с момента запуска таймера), в ячейку 0000:0470h заносится 1.
Другое действие, выполняемое стандартным обработчиком прерывания таймера - контроль за работой двигателей НГМД. Если после последнего обращения к НГМД прошло более 2 секунд, обработчик прерывания выключает двигатель. Ячейка с адресом 0000:0440h содержит время, оставшееся до выключения двигателя. Это время постоянно уменьшается обработчиком прерывания таймера. Когда оно становится равно 0, обработчик выключает двигатель НГМД. Последнее действие, которое выполняет обработчик прерывания таймера - вызов прерывания INT 1Ch. После инициализации системы вектор INT 1Ch указывает на команду IRET, т.е. ничего не выполняется. Программа может установить собственный обработчик этого прерывания для того чтобы выполнять какие-либо периодические действия. В качестве ПСТ ранее применялась микросхема Intel 8254, роль которой на современных системных платах берет на себя чипсет, сохраняя полную программную совместимость. ПСТ представляет собой трехканальные программируемые счетчики-таймеры (рис. 4.3) с независимыми входами CLK - вход счетных импульсов и GATE - вход разрешения счета и выходом OUT, изменяющим состояние по окончании счета.
Каждый канал (счетчик 0, 1, 2) содержит регистры: * состояния канала RS (8 разрядов); * управляющего слова RSW (8 разрядов); * буферный регистр OL (16 разрядов); * регистр счетчика CE (16 разрядов); * регистр констант пересчета CR (16 разрядов). Регистр счетчика CE работает в режиме вычитания. Его содержимое уменьшается по заднему фронту сигнала CLK при условии, что на вход GATE установлен уровень логической 1. В зависимости от режима работы таймера при достижении счетчиком CE нуля тем или иным образом изменяется выходной сигнал OUT. Буферный регистр OL предназначен для запоминания текущего содержимого регистра счетчика CE без остановки процесса счета. После запоминания буферный регистр доступен программе для чтения. Регистр констант пересчета CR может загружаться в регистр счетчика, если это требуется в текущем режиме работы таймера. Регистр состояния канала RS и управляющего слова RSW предназначены, соответственно, для определения текущего состояния канала и для задания режима работы таймера. Возможны шесть режимов работы таймера. Они разделяются на три типа: * Режимы 0, 4 - однократное выполнение функций. * Режимы 1, 5 - работа с перезапуском. * Режимы 2, 3 - работа с автозагрузкой. В режиме однократного выполнения функций перед началом счета содержимое регистра констант пересчета CR переписывается в регистр счетчика CE по сигналу CLK, если сигнал GATE установлен в 1. В дальнейшем содержимое регистра CE уменьшается по мере прихода импульсов CLK. Процесс счета можно приостановить, если подать на вход GATE уровень логического 0. Если затем на вход GATE подать 1, счет будет продолжен дальше. Для повторения выполнения функции необходима новая загрузка регистра CR, т.е. повторное программирование таймера. При работе с перезапуском не требуется повторного программирования таймера для выполнения той же функции. По фронту сигнала GATE значение константы из регистра CR вновь переписывается в регистр CE, даже если текущая операция не была завершена. В режиме автозагрузки регистр CR автоматически переписывается в регистр CE после завершения счета. Сигнал на выходе OUT появляется только при наличии на входе GATE уровня логической 1. Этот режим используется для создания программируемых импульсных генераторов и генераторов прямоугольных импульсов (меандра). Программирование ПСТ осуществляется через порты ввода/вывода со следующими адресами: * 40h - канал 0; * 41h - канал 1; * 42h - канал 2; * 43h - управляющий регистр.
Формат управляющего регистра приведен на рис. 4.4. Поле B определяет формат константы, использующейся для счета - (В=0) двоичный или (В=1) двоично-десятичный. В двоично-десятичном режиме константа задается в диапазоне 1-9999. Поле M определяет режимы работы ПСТ: * 0 - прерывание от таймера; * 1 - программируемый ждущий мультивибратор; * 2 - программируемый генератор импульсов; * 3 - генератор меандра; * 4 - программно-запускаемый одновибратор; * 5 - аппаратно-запускаемый одновибратор. Поле RW определяет способ загрузки констант через однобайтовый порт. Если в этом поле задано значение 00, это управляющее слово будет использоваться для фиксации текущего содержимого регистров счетчика CE в буферном регистре OL с целью чтения программой. Это код команды CLC - фиксация регистров. Код канала, для которого будет выполняться фиксация, должен быть указан в поле SC. Поля M и B при этом не используются. Поле SC определяет номер канала, для которого предназначено управляющее слово. Если в этом поле задано значение 11, будет выполняться чтение состояния канала. Как указывалось в начале раздела одна из функций выполняемых ПСТ - генерация звуковых сигналов. В компьютере большинство операций обмена данными регулируется параллельным программируемым адаптером (ППА). Этот адаптер содержит три 8-разрядных регистра; два из них используются для операций ввода данных, а один - для вывода. Выходному регистру ППА соответствует номер порта 61Н. Динамиком можно управлять в двух режимах, задаваемых значениями двух битов выходного регистра ППА. Если бит 0 равен 1, то системный таймер (ПСТ) задает частоту звучания динамика. Если бит 1 равен 1, то динамик начинает издавать звук и продолжает звучать до тех пор, пока бит 1 не станет равным 0. 4.4. Системные регистры
Системные регистры предназначены для обслуживания ЦП при многозадачной обработке. Для этого ЦП переводится в защищенный режим. Прежде, чем процессор перейдёт в защищённый режим, должна быть определена глобальная дескрипторная таблица GDT (Global Descriptor Table), так как все сегменты и прочие системные объекты должны быть описаны в дескрипторной таблице. Глобальная дескрипторная таблица GDT - это область памяти, в которой находятся дескрипторы. Процессору всё равно, где именно вы расположили эту таблицу, но в любом случае она будет находиться в первом мегабайте адресного пространства, потому что только из режима реальных адресов можно перевести процессор в защищённый режим. Также подразумевается, что сама таблица GDT будет выровнена на границу 8 байт, так как дескрипторы, из которых она состоит, имеют 8-байтный размер. Такое выравнивание позволит процессору максимально быстро обращаться к дескрипторам, что, естественно, увеличивает производительность. Число дескрипторов, определённых в GDT, может быть любым, от 0 до 8192. Нулевой дескриптор, т.е. определённый в самом начале GDT, процессор не использует, обращение к такому дескриптору могло бы быть, когда поле Index селектора равно 0. Если всё же в программе встречается обращение к нулевому дескриптору, то процессор генерирует исключение и не позволит доступ к такому дескриптору. В связи с этим, везде в литературе рекомендуется использовать нулевой дескриптор как шаблон, на основе которого программа может создавать новые дескрипторы, но на практике их удобнее создавать иными способами, о которых мы ещё будем говорить. GDT используется процессором всё время, пока он находится в защищённом режиме. Параметры GDT хранятся в специальном 48-разрядном регистре GDTR: Рис. 4.5. Формат регистра GDTR. Адрес начала GDT - это тот адрес, по которому размещена таблица. Предел таблицы GDT - это максимальное смещение относительно её начала. Например, создаётся GDT, состоящую из 3-х дескрипторов - для сегментов кода, стека и данных. Общее число дескрипторов будет равно четырём, потому что первым по счёту будет идти нулевой дескриптор, а за ним уже остальные три: Смещение от начала GDTНазначение дескриптора0Нулевой8Сегмент кода16Сегмент стека24Сегмент данных Размер GDT в данном случае будет равен 32 байтам, следовательно, предельное смещение в таблице будет равно 31 - это и есть предел GDT. Для загрузки значения в регистр GDTR используется команда LGDT. Операндом этой команды является 48-разрядное значение адреса в памяти, где размещается адрес и предел GDT. Можно также сохранить содержимое GDTR командой SGDT, указав в операнде адрес 48-разрядной переменной в памяти. Следует отметить, что размер GDT желательно не менять в процессе выполнения программ в защищённом режиме. Если программа будет динамически создавать новые дескрипторы, то размер GDT лучше всего заранее задать достаточно большим, например, 64 Кб (максимальный размер). Однако, следует учитывать, что при обращении процессора к несуществующим дескрипторам, его поведение непредсказуемо, хотя оно, скорее всего, закончится зависанием. Все 32-разрядные процессоры, начиная с Intel 80386, имеют набор системных регистров, предназначенных для использования в защищённом режиме. Среди них есть регистры управления (Control Registers) CR0, CR1, CR2, CR3 и CR4.
Регистры управления, в основном, состоят из флагов. Назначение и использование каждого флага достаточно сложно и требует отдельного рассмотрения. Для начала мы рассмотрим только один бит PE (Protection Enable) регистра CR0, отвечающего за переход процессора в защищённый режим и обратно. Полный список с описаниями регистров управления можно найти, например на www.sasm.narod.ru/docs/pm. Регистры управления предназначены для считывания и записи информации. Они имеют размер 32 бита и оперировать ими можно только целиком - считывается значение целого регистра, изменяются нужные биты и записывается обратно. Единственная команда, которой позволен доступ к этим регистрам - это MOV, в качестве операнда которой используется 32-разрядный регистр общего назначения. Если установить бит РЕ в 1,то процессор перейдёт в защищённый режим, если сбросить - то в режим реальных адресов. Процессор после аппаратного сброса переходит в режим реальных адресов и бит PE сброшен. Ниже приведены примеры использования бита PE: 1. Перевод процессора в защищённый режим.
moveax,cr0; Копируем в EAX содержимое регистра CR0.
oral,1; Устанавливаем в копии 0-й бит, который
; соответствует 0-му биту CR0, т.е. биту PE.
movcr0,eax; Записываем в CR0 обновлённое значение.
; Процессор перешёл в защищённый режим.
...; 1-я команда программы, которая выполнится
; в защищённом режиме.
2. Перевод процессора в режим реальных адресов.
moveax,cr0
andal,0feh; Сбрасываем бит PE.
movcr0,eax; Процессор перешёл в режим реальных адресов.
Если просто выполнить переход в защищённый режим, как показано на приведенном выше примере, то процессор зависнет. Для работы в защищённом режиме процессор использует дескрипторы сегментов, вместо их адресов (которые находятся в сегментных регистрах), поэтому прежде, чем перевести процессор в защищённый режим, нужно провести определенные подготовительные работы. Эти особенности будут рассмотрены в следующем разделе.
Контрольные вопросы
1. Сколько режимов обслуживания прерываний обеспечивает ПКП?
2. В чем заключаются особенности работы ПКП в режиме поллинга и когда его целесообразно использовать?
3. Сколько уровней аппаратных прерываний могут обслужить четыре ПКП и как их следует объединить между собой?
4. Какие параметры передаются контроллеру ПДП при программировании?
5. Перечислите режимы работы контроллера ПДП и объясните особенности использования каждого режима.
6. Сколько каналов включено в ПСТ и в чем заключается основное предназначение каждого канала?
7. Какие регистры содержит каждый канал ПСТ и в чем их предназначение?
8. В чем заключается основное назначение системных регистров ЦП?
9. Опишите формат регистра GDTR и назначение его полей.
10. В чем заключается основное назначение регистров управления ЦП?
11. Сколько уровней прерываний можно обслужить с помощью ПКП?
12. Объясните назначение схемы сравнения приоритетов.
13. Для чего используется сигнал SP/EN?
14. Перечислите последовательность действий при обслуживании прерываний.
15. Объясните назначение режима блочной передачи.
16. Опишите особенности режимов работы системного таймера.
17. Какое число дескрипторов можно определить в GDT?
18. Что означает предел таблицы GDT?
19. Как и для чего используется бит РЕ регистра управления?
20. Опишите основное назначение системных регистров.
Раздел 5. Защищенный режим работы ВМ
5.1. Максимальный режим работы ЦП
Максимальный режим работы ЦП служит для реализации встроенного в него механизма защиты программ и данных друг от друга, что является необходимым условием многозадачной обработки. Основой защищённого режима являются уровни привилегий. Уровень привилегий - это степень использования ресурсов процессора. Всего таких уровней четыре и они имеют номера от 0 до 3. Уровень номер 0 - самый верхний - программе на этом уровне "можно всё". Уровень 1 - следующий в иерархии и запреты, установленные на уровне 0 действуют для уровня 1. Наконец, 3-ий уровень - имеет самый низкий приоритет. Оптимальная схема работы программ по уровням привилегий будет следующая: * уровень 0: ядро операционной системы, * уровень 1: драйверы ОС, * уровень 2: интерфейсы ОС, * уровень 3: прикладные программы.
Сам по себе уровень привилегий ещё ничего не значит, его нельзя "установить в процессоре". Уровень привилегий применяется как одно их свойств при описании различных объектов, например, программного сегмента и действует при работе только с этим объектом. Уровень привилегий обозначается как "PL" (от Privilege Level) и применяется в сочетаниях, например, IOPL - Input-Output Privilege Level - уровень привилегий ввода-вывода. Первое, с чем сталкивается программа при переходе в защищённый режим - это совершенно другая система адресации памяти. Напомним, что в режиме реальных адресов - для обращения к памяти используется пара 16-разрядных объектов - сегментный регистр и смещение.
Адресация памяти в защищенном режиме также производится через сегмент и смещение в сегменте, для чего используется пара регистров, но для описания сегмента используется больше информации, а именно: * 32-разрядный адрес, * 20-разрядный предел сегмента (предел = размер - 1), * номер уровня привилегий сегмента, * тип сегмента (программный, стек, данные или системный объект) * и некоторые дополнительные свойства, о которых будет сказано ниже. Для того, чтобы хранить эту информацию, используется специальная область памяти. Сегмент по-прежнему указывается в сегментном регистре, но теперь в нём хранится номер сегмента из списка определённых сегментов. Этот номер называется селектор. В качестве смещения используется 16- или 32-разрядный регистр. При обращении к памяти, процессор проверяет возможность доступа к сегменту по уровню привилегий, проверяет, не превысил ли адрес предел сегмента и можно ли обращаться к этому сегменту в данном случае (например, запрещена передача управления в сегмент, описывающий данные или стек). Если в результате проверки будет обнаружено нарушение какого-либо условия, то процессор сгенерирует исключение и тем самым обеспечит защиту. Предел сегмента - это максимально допустимое смещение внутри него, таким образом, предел сегмента определяет его размер: размер_сегмента = предел_сегмента + 1. Поскольку значение предела - 20-разрядная величина, это значит, что максимальное значение предела равно 2 20 - 1. Процессор измеряет размер сегмента двумя типами величин: либо байтами, либо страницами. Страница - это блок памяти размером в 4Кб. В описании сегмента можно указать, в каких единицах измеряется сегмент и тогда можно получить два типа сегментов с максимальными размерами: в 1Мб ( 2 20 байт ) или
в 4Гб ( 2 20 страниц = 2 20 * 4Кб = 2 20 * 2 12 = 2 32 байт )
Эта способность измерять сегмент либо байтами, либо страницами, называется гранулярность. Значение предела сегмента может быть любым, от 0 до 2 20 - 1, гранулярность устанавливается по усмотрению программиста и может быть либо байтная, либо страничная. Всё это позволяет определять сегменты любого размера - от 0 байт до 4Гб. Сегмент определяется в виде структуры данных, которая называется дескриптор. Размер дескриптора - 8 байт, все дескрипторы хранятся последовательно в специально отведённой области памяти - глобальной дескрипторной таблице. На рис. 5.1. приведен формат структуры дескриптора.
Рис. 5.1. Структура дескриптора
Значения предела и адреса сегмента "разбросаны" по всей структуре дескриптора потому, что впервые защищённый режим появился в 16-разрядном процессоре Intel 80286 и для совместимости с ним дескриптор не переделывали, а расширили дополнительными полями (биты с 49 по 63). Практически, в программах формат дескриптора удобнее использовать в следующем виде: descriptor:
dwlimit_low; младшее слово предела
dwaddress_low; младшее слово адреса
dbaddress_hi; 3-й (из четырёх) байт адреса
dbaccess_rights; права доступа
dblimit_hi_and_flags; старшая часть предела и флаги
dbaddress_hi; 4-й байт адреса
Байт прав доступа (40-47) имеет следующий формат: 40: A - бит доступа (Accessed)
41-43: Тип сегмента (табл. 5.1)
44: S - бит системного сегмента (System)
45-46: DPL - уровень привелегий (Descriptor Privelege Level )
47: P - бит присутствия (Present) сегмента в ОЗУ
Таблица 5.1
Тип Назначение сегмента000Сегмент данных только для чтения001Сегмент данных для чтения и записи010Сегмент стека только для чтения011Сегмент стека для чтения и записи100Сегмент кода с разрешением только выполнения101Сегмент кода с разрешением выполнения и чтения из него110Подчиненный сегмент кода с разрешением выполнения111Подчиненный сегмент кода с разрешением выполнения и чтения из него
Тетрада флагов (52-55) G,D,X,U имеет формат: 52: бит U - пользователь (User)
53: бит X - зарезервирован
54: бит D - размерность (Default size) операндов
55: бит G - бит гранулярности (Granularity)
При адресации памяти в защищённом режиме команды ссылаются на сегменты, указывая не их адреса (как в режиме реальных адресов), а описания сегментов (их дескрипторы). Указатель на описание сегмента называется селектор. Другими словами, селектор - это номер дескриптора из таблицы дескрипторов. Адресация производится через пару регистров сегмент:смещение, причём, в качестве сегментного регистра используются обычные CS, SS, DS, ES, FS и GS (последние два появились в ЦП Intel 80386), но в них указывается не адрес сегмента, а селектор дескриптора. Селекторы нужны, по крайней мере, по трём причинам: * Описание сегмента занимает 8 байт и использовать 8-байтные сегментные регистры было бы крайне неэффективно.
* Селекторы имеют размер в 16 бит, благодаря чему их можно использовать в сегментных регистрах и обращаться к памяти можно по-прежнему через пару регистров.
* Параметры всех сегментов хранятся в отдельной области памяти, доступ к которой имеет только операционная система. Программа, используя селектор, сможет получить о сегменте совсем немного информации и не сможет изменить параметры сегмента, благодаря чему очень удачно реализуется механизм защиты
Адрес памяти можно указывать не только через пару регистров, но и в переменных, через пару значений селектор:смещение. Можно было бы определить селектор просто, как номер сегмента, но в защищённом режиме кроме сегментов, дескриптор может определять целый ряд других системных объектов (например, задач), поэтому лучше не упрощать понятия селектора и дескриптора, а привыкнуть к этой терминологии. Селектор имеет следующий формат: Рис. 5.2. Формат селектора. * Двухбитовое поле RPL (Requested Privilege Level) содержит номер уровня привилегий, которое имеет текущая программа. Значение этого поля процессор использует для защиты по привилегиям. К одному и тому же дескриптору можно обращаться, используя селекторы с разными значениями RPL, но процессор позволит доступ только при определённых условиях (подробнее об этом см. в главе "Защита по привилегиям"). * Бит TI (Table Indicator) определяет таблицу, из которой выбирается нужный дескриптор. Если бит TI = 0, то обращение производится к глобальной дескрипторной таблице GDT (она одна на всю систему), если TI = 1 - то к текущей локальной дескрипторной таблице LDT (таких может быть много). * Index - это собственной номер дескриптора, от 0 до 8191. Т.к. поле индекса состоит из 13 бит, то максимальное число дескрипторов, одновременно существующих в системе равно 2 13, т.е. 8192. Как видите, это довольно-таки много и вполне удовлетворяет любым системным запросам. На самом деле, число дескрипторов можно значительно увеличить за счёт использования множества дополнительных локальных дескрипторных таблиц. Использование селекторов достаточно просто. Для тех дескрипторов, которые будут определены заранее, например, сегментов кода, стека и данных, селекторы подготавливаются как константы и затем используются для загрузки в сегментные регистры. Для дескрипторов, которые программа будет динамически создавать, селекторы придётся определять в переменных и загружать в сегментные регистры из памяти либо конструировать "на ходу", или даже как константы - всё зависит от конкретных условий. Способы использования селекторов и дескрипторов вы можете найти в примерах, которые будут следовать в дальнейших главах. Обращение к дескрипторной таблице процессор производит только в момент загрузки в сегментный регистр нового селектора. После этого содержимое дескриптора копируется в так называемый "теневой регистр", к которому имеет доступ только сам процессор и из которого оно в дальнейшем используется. Любое последующее обращение к сегменту будет происходить с помощью теневого регистра, без обращения к дескрипторной таблице и не потребует лишних тактов на циклы чтения памяти. Правда, эти такты тратятся каждый раз, когда вы загружаете новый селектор, но это не высокая плата за защиту дескрипторов от недозволенного доступа. При загрузке недопустимого значения селектора процессор будет генерировать исключение, даже если вы не обращались через него к памяти. В защищённом режиме работа прерываний происходит следующим образом: Во-первых, вводится новый класс прерываний, генерируемых самим процессором при нарушениях условий защиты - так называемые исключения (exceptions). Число возможных вектором прерываний по-прежнему равно 256, но 32 из них - от 00h до 1Fh используются исключениями.
Во-вторых, вместо дальних адресов в таблице прерываний используются дескрипторы специальных системных объектов, так называемых шлюзов. В-третьих, сама таблица прерываний, которая называется IDT (Interrupt Descriptors Table), может находится по любому адресу памяти. Все эти особенности появились в процессоре Intel 80386 и в полном объёме, с небольшими дополнениями, используются во всех 32-разрядных процессорах. Прерывания с векторами от 00 до 1Fh, т.е. исключения - это основа защищённого режима. Благодаря исключениям процессор автоматически реагирует на любые попытки нарушить защиту системы и позволяет их корректно обработать. Благодаря разделению кода и данных по уровням привилегий, обработчики прерываний можно надёжно изолировать от других программ. В грамотно построенной операционной системе никакая программа не сможет перехватить прерывание, изменить код или даже просто прочитать его(!), выйти за предел отведённых ей адресов и пр. Благодаря исключениям, операционная система может контролировать любые нарушения условий, поставленных ею. Когда срабатывает прерывание, процессор должен передать управление соответствующей процедуре-обработчику. В режиме реальных адресов это происходит сразу - из памяти выбирается вектор и по dw:dw адресу происходит переход. В защищённом режиме ситуация обстоит сложнее - перед передачей управления процессор производит множество проверок возможности доступа к обработчику прерывания - обеспечивает защиту. Адрес, по которому произойдёт переход на обработчик прерывания, находится в дескрипторе прерывания. Каждому вектору прерыванию соответствует свой дескриптор, все они (до 256) объединяются в специальную таблицу дескрипторов прерываний (IDT) и по формату похожи на дескрипторы сегментов, которые мы рассматривали в разделе "Защищённый режим".
5.2. Дескрипторы и шлюзы
Таблица дескрипторов прерываний в любой системе - одна. Программ (задач, процедур, приложений и пр.) - много. IDT реализуется на нулевом уровне привилегий и, следовательно, непосредственно к ней обратиться могут только программы, работающие на том же уровне. Для того, чтобы программы с других уровней (1, 2 и 3) могли пользоваться прерываниями, предусмотрены специальные системные объекты - так называемые шлюзы (gates). При вызове прерывания, процессор, прежде, чем передать управление обработчику, "опускается" через шлюз на его уровень привилегий, а после завершения обработки - "поднимается" обратно.
IDT может содержать три типа дескрипторов шлюзов: * Шлюз задачи * Шлюз прерывания * Шлюз ловушки Шлюзы содержат указатели на обработчики прерываний и права доступа к ним. При переходе через шлюз задачи, процессор производит автоматическое переключение задач, а при переходе через шлюз прерывания или ловушки передаёт управление процедуре в контексте текущей программы. Единственное отличие прерывания от ловушки в том, что при переходе через шлюз прерывания процессор автоматически сбрасывает флаг IF в EFLAGS и тем самым не допускает генерации других прерываний и исключений на время работы обработчика, а для шлюза ловушки - не меняет состояние флага IF. Ловушки используются для отладки программ и поэтому обработка ловушки должна быть прозрачна для внешних прерываний. Исключения и прерывания работают в основном через два типа шлюзов - задач и прерываний. Шлюз прерывания запускает обработчик в контексте текущей программы, т.е. просто передаёт управление по адресу, указанному в дескрипторе. Такой подход хорош только в простых операционных системах, когда работают заранее определённые программы, от которых не нужно защищать ядро ОС. Шлюз задачи является более удобным и универсальным, т.к. позволяет изолировать обработчик от других программ и его рекомендуется применять в системах, где программы потенциально могут нарушить целостность ОС. Шлюз задачи заставляет процессор автоматически переключаться на новую задачу при генерации исключения. Т.к. мультизадачность мы ещё не рассматривали, то обработчики исключений реализуем пока через шлюзы прерываний и ловушек. Далее приводятся форматы дескрипторов шлюзов: 1. Шлюз задачи. dw0
dwTSS_sel; Селектор TSS
db0
dbaccess_rights; Права доступа сегмента TSS
dw0
Рис. 5.3. Формат шлюза задачи.
Обратите внимание на то, что бит 4 в access_rights, соответствующий биту S в формате дескриптора, равен 0. Это значит, что дескриптор описывает системный объект и биты 0..3 в access_rights определяют тип этого объекта. Первое и последнее слова (dw) в формате дескриптора содержат 0, т.к. любая задача определяется своим дескриптором, на который и ссылается селектор TSS (подробно о задачах см. в разделе "Мультизадачность"). 2. Шлюз прерывания. dwoffset_low; Младшая часть смещения
dwselector; Селектор сегмента кода
db0
dbaccess_rights; Права доступа
dwoffset_hi; Старшая часть смещения
Шлюз прерывания через селектор и смещение задаёт адрес обработчика прерывания. Рис. 5.4. Формат шлюза прерывания.
3. Шлюз ловушки. dwoffset_low; Младшая часть смещения
dwselector; Селектор сегмента кода
db0
dbaccess_rights; Права доступа
dwoffset_hi; Старшая часть смещения
Шлюз ловушки через селектор и смещение задаёт адрес обработчика прерывания. Рис. 5.5. Формат шлюза ловушки.
Примечание. D - это размер шлюза: 1 = 32 бита; 0 = 16 бит. Размер шлюза определяет размер стека, используемый процессором по умолчанию. Перед вызовом обработчика, процессор помещает в стек значения регистров CS, EIP, EFLAGS и иногда SS, ESP и dw-код ошибки. Если размер шлюза - 32 бита, то значения размером в 16 бит будут расширены нулями до 32-х. Исключениями называются прерывания, которые генерирует процессор в ответ на нарушения условий защиты. Повлиять на исключения прикладные программы (работающие на уровне привилегий, выше 0) не могут, замаскировать - тоже. Аппаратный контроль защиты - самый надёжный и 32-разрядные процессоры предоставляют этот сервис в полном объёме. Исключения делятся на три типа, в зависимости от условий их возникновения: 1. Ошибка (fault) 2. Ловушка (trap) 3. Авария (abort) Ошибка - это исключение, возникающая в ситуации ошибочных действий программы и подразумевается, что такую ошибку можно исправить. Такой тип исключения позволяет рестарт "виноватой" команды после исправления ситуации, для чего в стеке обработчика адрес возврата из прерывания указывает на команду, вызвавшую исключение. Примером такого исключения может быть исключение неприсутствующего сегмента (прерывание 0Bh), возникающее при попытке обратиться к сегменту, в дескрипторе которого бит P=0. Благодаря этому реализуется механизм виртуальной памяти, в частности, подкачка данных с диска. Ловушка - это исключение, возникающее сразу после выполнения "отлавливаемой" команды. Это исключение позволяет продолжить выполнение программы со следующей команды (без рестарта "виноватой"). На ловушках строится механизм отладки программ. Авария - это исключение, которое не позволяет продолжить выполнение прерванной программы и сигнализирует о серьёзных нарушениях целостности системы. Примером аварии служит исключение двойного нарушения (прерывание 8), когда сама попытка обработки одного исключения вызывает другое исключение. Все дескрипторы прерываний и исключений объединяются в одну таблицу IDT (Interrupt Desriptor Table). Сама IDT может располагаться в памяти по любому адресу и состоять из любого числа дескрипторов в пределах от 0 до 256. В отличие от GDT, нулевой дескриптор в IDT используется нулевым вектором (исключение деления на 0).
Для неиспользуемых векторов бит P дескрипторов должен быть равен 0, тогда при попытке обращения к нему процессор будет генерировать исключение неприсутствующего сегмента и ОС сможет корректно обработать неиспользуемое прерывание. В противном случае, скорее всего, возникнет другое исключение, тип которого заранее предусмотреть невозможно.
Для повышения производительности системы, рекомендуется размещать IDT по адресу, кратному 8. Размер IDT должен быть кратен 8, т.к. она состоит из 8-байтных дескрипторов, а предел, следовательно, на 1 меньше.
Если произойдёт обращение к вектору прерывания, дескриптор которого должен находиться за пределами IDT, то процессор сгенерирует исключение общей защиты. Параметры IDT (адрес и предел) процессор хранит с специальном 48-разрядном регистре IDTR. Формат этого регистра следующий: Адрес начала IDT - это тот адрес, по которому вы разместили IDT. Предел таблицы IDT - это максимальное смещение относительно её начала. Рис. 5.6. Формат регистра IDTR.
Подготовка и запись значения IDTR аналогична действиям для GDTR, поэтому соответствующий пример здесь не приводится. Для загрузки содержимого IDTR из памяти в регистр используется команда LIDT, для сохранения из регистра в память - SIDT, причём, команда IDTR может выполняться только на нулевом уровне привилегий, а SIDT - на любом. Единственным операндом у обеих команд является адрес 48-разрядной переменной. Программа, работающая не на 0-м уровне привилегий может получить адрес и предел IDT и только от операционной системы зависит, разрешит ли она доступ непривилегированной программе к IDT. Контрольные вопросы
1. Сколько существует типов сегментов? 2. Как формируется адрес в реальном режиме? 3. Как формируется адрес в защищенном режиме (сегментная адресация)? 4. Какой сегментный регистр по умолчанию используется при ссылках на данные, находящиеся в стеке? 5. Где хранится селектор и что это такое? 6. Для чего нужен бит пометки "страница находится в памяти"? 7. Что представляет собой таблица векторов прерываний в реальном режиме? 8. Что представляет собой таблица векторов прерываний в защищенном режиме? Как она называется? 9. Для чего нужны GDT и LDT? Где хранятся указатели на их текущие значения? 10. Для чего служит максимальный режим работы ЦП и в чем его отличие от минимального режима?
11. Для чего используется сегментация памяти?
12. Как изменяется адресация памяти в защищенном режиме?
13. Для чего служат уровни привилегий и как они используются?
14. Опишите формат селектора.
15. Какие типы доступа к сегментам Вы знаете?
16. Опишите формат дескриптора в виде структуры, используемой в программах.
17. Что такое дескриптор вектора прерываний и для чего он нужен?
18. Каким образом и для чего используются шлюзы?
19. Какие типы дескрипторов шлюзов Вы знаете?
20. В чем заключается отличие шлюза задачи от шлюза прерывания?
21. Для чего и как используются ловушки?
22. Опишите форматы шлюзов.
23. Какие типы исключений вы знаете?
24. Поясните структуру таблицы IDT.
25. В каких случаях ЦП будет генерировать исключение неприсутствующего сегмента?
Раздел 6. Язык ассемблера
6.1. Программирование на языке ассемблера
Язык ассемблера изоморфен машинному языку, т. е. каждому оператору языка ассемблера соответствует, как правило, одна команда процессора. Это позволяет воспользоваться всеми возможностями системы команд ЦП и АП. Практика показала, что язык ассемблера является основным языком программирования контроллеров. Для систем, построенных на основе центрального процессора ЦП и АП, используется язык ассемблера АSМ-86. Программирование ПВВ Intel 8089 осуществляется на языке ассемблера АSМ-89. Рассмотрим основные особенности этих языков. Программа на языке ассемблера составляется в виде последовательности операторов. Имеется два типа операторов: мнемокоды команд и директивы. Основное отличие директив и мнемокодов команд состоит в том, что в процессе ассемблирования директивы предоставляют программе-ассемблеру вспомогательную информацию, которая используется в процессе ассемблирования и служит для описания типов данных, резервирования памяти, определения сегментов, организаций процедур и т. п. Рассмотрим пример простой программы, блок-схема которой приведена на рис. 6.1. Эта программа суммирует числа, поступающие из порта ввода-вывода port1, в ячейке sum до тех пор, пока накопленное значение sum<100, после чего выводит накопленное значение в port1. Ниже представлен полный текст программы на языке ASM-86 (нумерация строк введена исключительно для дальнейшего пояснения программы):
1 data SEGMENT; начало сегмента данных
2 sumDB?; резервирование байта
3 dataENDS; конец сегмента данных
4 codeSEGMENT; начало программного сегмента
5 ASSUMEcs: code, ; code - имя программного сегмента
ds: data ; data - имя сегмента данных
6 port1EQU110h; port1 - константа 110h
7 Go:movax,data
8 movds,ax
9movsum,0
10 Comp:cmpsum,100
11 jlNext
12 moval,sum
13outport1,al
14hlt
15 Next:inal,port1
16addsum,al
17jmpComp
18 codeENDS; конец программного сегмента
19ENDGo; конец ассемблирования
Программа состоит из двух сегментов: сегмента данных (строки 1-3) и программного сегмента (строки 4-18). Для определения начала каждого из этих сегментов служит директива SEGMENT, перед которой указано имя сегмента. В строке 1 определяется начало сегмента данных с именем data, а в строке 4 - начало программного сегмента с именем code. Конец каждого сегмента указывается с помощью директивы ENDS (строки 3 и 18), перед которой записывается имя соответствующего сегмента. Сегмент данных состоит из одной строки (строка 2), содержащей директиву DB - определение байта памяти. По этой директиве программа ассемблера резервирует под переменную с именем sum - 1 байт памяти. Директива ASSUME (строка 5) определяет соответствие сегментов и их имен. В строке 6 записана директива EDU, которая порту ввода-вывода port1 ставит в соответствие его номер. В дальнейшем, когда в тексте программы встретится имя port1, программа-ассемблер заменит его на номер 110h. Рис. 6.1. Блок-схема программы
Строка 7 - это первая строка программы, которая содержит мнемокод команды, т. е. первая команда результирующей программы будет получена при ассемблировании данной строки. Одно из требований к программам, написанным на языке АSМ-86, состоит в том, что первая строка программы, содержащая мнемокод команды, должна иметь метку. В данной программе имя метки Gо. Строки 7 и 8 служат для занесения начального адреса сегмента данных в регистр сегмента данных DS. Поскольку система команд ЦП не содержит команды загрузки константы в сегментный регистр, для этой цели используются две команды. В строке 9 переменной sum присваивается нулевое начальное значение и далее, в строке 10 производится сравнение значения sum со значением 100. В зависимости от результатов сравнения в строке 11 осуществляется переход по условию "меньше" на метку Next. В строках 12 - 14 полученное значение sum выводится в порт ввода-вывода, а в строках 15 - 17 осуществляется суммирование очередного введенного числа и переход на метку Comp в соответствии со схемой программы (рис. 6.1). Строка 18 завершает программный сегмент, а строка 19 содержит директиву END, которая указывает программе-ассемблеру на окончание ассемблирования и снабжается меткой, соответствующей началу программы. Рассмотренный пример позволяет установить две основные особенности программ на языке ASM-86. Первая состоит в сегментации программ, в результате чего они в общем случае получают следующую структуру:
имя1SEGMENT
оператор
оператор
. . .
имя1 ENDS
имя2SEGMENT
оператор
оператор
. . .
имя2 ENDS
. . .
имя3SEGMENT
оператор
оператор
. . .
имя3 ENDS
END метка начала
Вторая особенность состоит в том, что два типа операторов (директивы и мнемокоды команд) имеют идентичные форматы (рис. 6.2). Оператор, написанный на языке ассемблера, может быть разделен на четыре поля.
Рис. 6.2. Поля операторов языка ASM-86: а - директив; б - мнемокодов команд
Каждый оператор записывается с новой строки и между полями ставится один или несколько пробелов. Как видно из приведенного выше примера программы, не все поля могут быть заполнены. В любом операторе обязательно заполнено поле операции директивой или мнемокодом команды. 6.2. Директивы языка ассемблера ASM-86
Для определения сегментов программы служат директивы SEGMENT, ENDS, ASSUME и ORG. Назначение первых трех директив было показано в приведенном примере программы. Директива ORG задает ассемблеру адрес ячейки памяти для первой команды транслируемой программы в сегменте CS. Например, фрагмент программы codeSEGMENT
ORG 0F3h
указывает ассемблеру, что результирующая программа должна быть расположена, начиная с адреса 0F3h относительно содержимого регистра СS. Начальное значение регистра CS в этом случае назначает сама программа-ассемблер. При необходимости можно указать конкретный физический адрес начала программы путем использования вспомогательного оператора АТ. Например, фрагмент code SEGMENT АТ 0А000h ORG 0F3h задает начальный адрес первой команды программы, равный 0А00FЗh. Для определения типов переменных и резервирования памяти служат директивы DB, DW, DD, DQ и DT, которые определяют байт, слово, двойное слово, восемь байт и десять байт, соответственно. Например, совокупность операторов alpha DB ?
betaDW 0F200h gammaDD ?
резервирует байт памяти для переменной alpha, 4 байта - для переменной gamma и 2 байта - для переменной beta, причем переменной beta присваивается начальное значение 0F200h. Эти директивы могут задавать также и массивы переменных, например операторы
mas DB 5h, 0Аh, 13h zero DB 0,0,0,0,0,0
resDW ?,?,?,? определяют массив mas, включающий три константы 5h, 0АН и 13Н; массив zero, состоящий из шести байтов с нулевыми начальными значениями, и массив res, включающий четыре слова, для которых начальные значения не заданы. В тех случаях, когда требуется задать массив, состоящий из большого числа переменных, используется вспомогательный оператор DUP. Например, оператор zeros DB 100 DUP (0) задает массив zeros из 100 байт с нулевыми начальными значениями, а оператор result DW 200 DUP (?) резервирует 200 слов памяти под массив result. При использовании команд АМ возникает необходимость описывать данные размерностью 4, 8 и 10 байт соответственно для форматов КВФ, ДВФ и ВВФ. Для этой цели в языке ASM-86 введены директивы: DD, DQ и . DT, которые позволяют просто присваивать имена, а также резервировать соответствующее число байтов памяти без присвоения и с присвоением начальных значений. Для определения имен переменных или меток используются директивы EQU и PURGE. Например, в рассмотренной выше программе директива EQU ставила в соответствие имени порта port1 значение 110h. С помощью директивы EQU можно в любом месте программы вводить новые имена, например после включения оператора
port2 ЕQU port1
имена port2 и port1 будут восприниматься программой-ассемблером как эквивалентные. После включения оператора Count EQU СХ имя Count будет эквивалентно имени СХ, которое зарезервировано для обозначения регистра общего назначения ЦП. При использовании директивы EQU в поле операнда можно помещать различные выражения, например
sum2EQUsum1 + 2
cycleEQUreturn - 5.
Директива EDU переименовывает переменные, но не отменяет их старых имен, т. е. после этой директивы можно обращаться к переменной по любому имени. Для отмены старого имени переменной используется директива PURGE, например, после включения в программу оператора PURGE port1
использование имени port1 недопустимо. Для организации процедур применяются директивы PROC и ENDP. Например, процедура myproc увеличивает значение cx на 10:
myprocPROC
add cx,10
ret myprocENDP.
Очень часто в ассемблерных программах используются директивы, позволяющие вводить макроопределения. Например, макроопределение с именем mov_string и формальными параметрами dest, src и len.
mov_stringMACROdest,src,len
movcx,len
leasi,src
leadi,dest
repmovsb
ENDM
Это макроопределение позволит использовать в программе новую "команду" с мнемокодом mov_string и тремя операндами, которые при вызове станут фактическими параметрами. Так вызов макроопределения:
mov_string addrD,addrS,100
осуществит пересылку 100 байтов из адреса addrS по адресу addrD.
Наряду с мнемокодами команд процессора ЦП язык ASM-86 допускает использование мнемокодов команд арифметического процессора. Особенность программы-ассемблера при обработке команд АП заключается в том, что она автоматически вводит в результирующую программу код команды WAIT перед командами АП, которая необходима для синхронизации работы процессоров. Это освобождает составителя программ от необходимости записывать мнемокод WAIT перед каждой командой для АП. Как было показано, все мнемокоды команд АП начинаются с буквы F, что облегчает отличать их от мнемокодов команд ЦП. Для команд сопроцессора FNCLEX, FNDISI, ENENI, FNINIT, FNOP, FNSAVE, FNSTCW, FNSTSW не требуется наличия перед ними команды WAIT, поэтому мнемокод этих команд снабжается дополнительной буквой N, что также облегчает работу программы-ассемблера. В качестве примера рассмотрим фрагмент программы на ассемблере, использующий мнемокоды обоих процессоров: fcomp fnstsw flags1 mov ah,flags1 sahf jz ... Этот фрагмент показывает, как реализуется условный переход по результатам сравнения чисел с плавающей запятой. Поскольку в системе команд АП отсутствуют команды условных переходов, то используется следующий прием. После выполнения команды сравнения (fcomp) результаты сравнения (старший байт регистра состояния) запоминаются в памяти по адресу flags1. Затем они пересылаются в старший байт аккумулятора ah центрального процессора и запоминаются в регистре флагов F по команде sahf. Разряды С0,СЗ регистра состояния АП соответствуют разрядам регистра F, в которых размещены значения флагов CF и ZF, поэтому можно воспользоваться любой из команд условных переходов. 6.3. Использование регистров Pentium
В процессорах Pentium обычные регистры расширены до 32-х разрядов (рис 3.3). Конечно, благодаря программной совместимости можно использовать все 16-разрядные регистры по-прежнему, но дополнительно к этому можно использовать каждый из 32-разрядных регистров общего назначения, причём в любом режиме (не только защищённом). Например: movax,[ebx]; Поместить в AX значение из памяти
; по адресу DS:EBX
movdx,[ecx]; Поместить в DX значение из памяти
; по адресу DS:ECX
movcx,es:[eax]; Поместить в CX значение из памяти
; по адресу ES:EAX
Дополнительно к этой возможности введены следующие: * Использование константы и регистра: moveax,[ecx + 1]
movbl,[edx + 12345678h]
* Сумма двух регистров: movebp,[ebx + edi]
moveax,[ecx + edx]
* Сумма двух регистров и константы: movbl,[edx + eax + 12345678h]
* Масштаб - автоматическое умножение на 2, 4 или 8 одного из регистров, участвующих в образовании адреса: movax,[ebx * 2]
movcl,[edx + ebp * 4]
movesi,[edi + eax * 8 + 12345678h]
При использовании 32-разрядных регистров для адресации в режиме реальных адресов, следует учитывать, что размер сегмента фиксирован и равен 64 Кб. Если процессор сформирует адрес, больший 64 Кб, то процессор зависнет. Например: moveax,1234h
movbl,[eax]; В регистр BL будет произведена загрузка
; значения с адреса DS:EAX.
movedx,ffffh
movbl,[eax + edx]; Эффективный адрес будет равен
; 1234h + ffffh = 11233h (это больше,
; чем 64 Кб. Процессор зависнет.)
Использование 32-разрядных регистров для адресации памяти в защищённом режиме очень распространено, в основном, из-за того, что размер сегментов может достигать 4 Гб. Перед тем как создавать программы, использующие MMX- и SSE-расширения, следует убедиться в том, что данный тип ЦП поддерживает эту технологию. Для этого можно выполнить специальную команду cpuid, предварительно поместив в регистр ЕАХ значение 1. После выполнения команды проверка 23-го бита в регистре ЕDХ показывает, поддерживается ли технология ММХ процессором, а 25-го бита - поддерживается ли технология SSE. Ниже приводится текст процедуры на ассемблере, выполняющей эту проверку. .686 .model flat .code check_mmx_sse proc moveax, 1
xorbl, bl
cpuid test edx, 800000h jztest_sse
incbl
test_sse:test edx, 2000000h
jzexit
incbl
incbl
exit: moval, bl
ret check_mmx_sseendp end Процедура check_mmx_sse возвращает в регистре AL значение:
* al = 0 - если MMX и SSE не поддерживаются;
* al = 1 - поддерживается только MMX;
* al = 2 - поддерживается только SSE;
* al = 3 - поддерживается MMX и SSE.
6.4. Директивы языка ассемблера ASM-89
При составлении программ для ПВВ используется язык ASM-89. Этот язык также включает операторы двух типов: команды и директивы. На рис. 6.3 приведены примеры форматов команд и директив.
Рис. 6.3. Поля операторов языка ASM-89: a - директив; б - мнемокодов команд
Для определения типов переменных, используемых в программе, предназначены директивы DB и DD, аналогичные директивам АSМ-86. Наряду с ними для резервирования области ОЗУ применяется директива DS, позволяющая только резервировать (без задания начальных значений) произвольное число байтов. Особенности написания мнемокодов команд ПВВ, в зависимости от способов адресации приведены в табл. 6.1. В программах для ПВВ часто встречаются структуры данных, приведенные на рис. 6.4,а, для организации которых предусмотрена специальная директива STRUC, позволяющая присваивать имена и относительные адреса набору связанных друг с другом переменных, которые называют элементами структуры. Таблица 6.1
№ п/пСпособ адресацииПримеры мнемокода команды1 По базеADD GC, [GB]ADDBI [PP], 122 Со смещениемADDB IX, [GB].5 ADDB ВС, [GC].COUNT3 ИндекснаяADD [GC+ IX], BC4 Индексная с автоинкрементомADDI [GC+IX+],5
Задание структуры, показанной на рис. 6.4,а, с помощью директивы STRUC имеет вид: PARMBLOCKSTRUCT
TP:DS4
COMMAND:DS1
RESULT:DS1
BUFFER1:DS4
BUFFER2:DS2
PARMBLOCKENDS
Данной структуре присвоено имя РАRМВLОСК и она является блоком параметров, который включает указатель задания TP размерностью 4 байта, параметр COMMAND (1 байт), параметр RESULT (1 байт), два параметра BUFFER1 (4 байта) и BUFFER2 (2 байта). Имя структуры указывается перед директивой STRUC и перед директивой ENDS, определяющей конец структуры. Рис. 6.4. Размещение параметров структуры в памяти
Важно отметить, что задание структуры. не распределяет конкретные адреса памяти, а лишь определяет взаимное расположение ее элементов. Программа-ассемблер использует имена элементов структуры для определения величины смещения адреса соответствующего элемента от начального адреса структуры. Так, если начальный адрес структуры находится в регистре-указателе параметров РР, то обращение к элементам структуры в программе на языке ассемблера будет иметь вид: LPD GA, [PP].BUFFERl MOVBI [РР].RESULT, 0 \
Здесь первая команда загружает содержимое элемента структуры BUFFERl в регистр GA, а вторая команда обнуляет элемент структуры RESULT. Эти же операции можно выполнить и с помощью команд LPD GA, [PP] . 6 MOVBI [РР]. 5,0 соответственно. Однако организация структуры, позволяющей обращаться к ее элементам по их именам, делает программу более понятной и облегчает ее написание и отладку. Программа, написанная на языке ASM-89, может включать обращения к программам с помощью команды САLL (или LCALL). Первый операнд этих команд всегда задает адрес памяти, по которому должно быть сохранено значение регистра перед передачей управления вызываемой подпрограмме. Второй операнд этих команд содержит имя подпрограммы, определяющее ее начальный адрес. Возврат из подпрограммы осуществляется, как правило, с помощью команды MOVP, восстанавливающей содержимое регистра ТР из области сохранения. Ниже представлен фрагмент программы, которая использует команду вызова подпрограммы:
SAVE:DS3; задание области сохранения
LPDIGC,SAVE; загрузка адреса в GC
LCALL[GC],Donna; вызов подпрограммы Donna
. . .; тело программы
HLT; завершение программы
Donna:. . .; вход в подпрограмму Donna
. . .; тело подпрограммы
MOVPTP,[GC]; возврат из подпрограммы
Следует отметить, что подпрограмма Donna не должна изменять содержимое регистра GC, поскольку оно указывает на адрес возврата. В качестве примера рассмотрим две программы на языке ASM-89. Первая программа предназначена для пересылки блока информации из области памяти с начальным адресом ADR1 в область памяти с начальным адресом АDR2. Число пересылаемых байтов (до 64К байт) задается параметром SIZE. Исходные данные размещаются в памяти в виде простой структуры, представленной на рис. 6.4,б, с начальным адресом, указанным в регистре-указателе PP. Программа имеет вид 1 MEMTRANS SEGMENT
2 PBSTRUCT
3 TPRESERV:DS4
4 ADR1:DS4
5 ADR2:DS4
6 SIZE:DS2
7 PBENDS
8LPDGA,[PP].ADR1
9LPDGB,[PP].ADR2
10MOVBC,[PP].SIZE
11MOVCC,0C208h
12XFER
13WID16,16
14HLT
15MEMTRANSENDS
16END
В строке 1 используется директива SEGMENT, которая указывает на начало программы и присваивает ей имя MEMTRANS. В строках 2 - 7 описывается структура исходных данных, соответствующая рис. 6.4, б. В строках 8, 9 начальные адреса ADRI и ADR2 областей памяти, между которыми осуществляется пересылка данных, загружаются в регистры GA и GB, соответственно. В строке 10 в счетчик байтов ВС загружается число пересылаемых байтов. Для указанных загрузок используется адресация со смещением. Далее, в строке 11, в регистр управления каналом СС загружается константа, которая задает требуемый режим пересылки.
6.5. Модели программ, компиляция и отладка
На практике различают несколько моделей, используемых при написании программ. Существенное отличие моделей состоит в том, что каждая из них предполагает наличие различного числа сегментов и способов группирования программных сегментов и сегментов данных. Ниже перечислены используемые модели и даны их краткие характеристики (код - означает программный сегмент):
TINY- код и данные в одной группе (com - файлы );
SMALL - код - один сегмент, данные в одной группе;
MEDIUM - код - несколько сегментов, данные в одной группе;
COMPACT - код один сегмент, ссылка на данные - типа far;
LARGE - код - несколько сегментов, данные - типа far;
FLAT - код и данные в одном сегменте (плоская модель).
Для получения исполняемого файла программы составленной на ассемблере надо реализовать, по крайней мере, два этапа - осуществить трансляцию программы и получить объектный модуль с расширением obj, а затем скомпоновать объектные модули в исполняемую программу, с расширением exe (или com). Реализация первого этапа осуществляется с помощью программы MASM (или TASM), а второго - с помощью LINK (или TLINK). В ряде случаев, особенно при разработке сложных программ, состоящих из большого числа модулей, бывает не обойтись без специальных средств отладки, типа турбодебагера td.
Пусть текст исходной программы хранится в файле с именем SIMPLE.ASM. Трансляцию можно осуществить вызовом турбо ассемблера TASM.EXE с помощью, например, следующей команды DOS:
tasm /z/zi/n simple,simple,simple
Ключ /z разрешает вывод на экран строк исходного текста программы, в которых ассемблер обнаружил ошибки (без этого ключа поиск ошибок пришлось бы проводить по листингу трансляции).
Ключ /zi управляет включением в объектный файл информации, не требуемой при выполнении программы, но используемой отладчиком.
Ключ /n подавляет вывод в листинг перечня символических обозначений в программе, от чего несколько уменьшается информативность листинга, но сокращается его размер.
Стоящие далее параметры определяют имена файлов: исходного (SIMPLE.ASM), объектного (SIMPLE.OBJ) и листинга (SIMPLE.LST). При желании можно в строке вызова транслятора указать полные имена файлов с их расширениями, однако необходимости в этом нет, так как по умолчанию транслятор использует именно указанные выше расширения.
Важную роль при отладке программы на стадии трансляции играют ключи, которые управляют как процессом ассемблирования, так и полнотой листинга - файла с расширением LST, существенно облегчающего отладку программы.
Контрольные вопросы
1. Может ли регистр использоваться в фактическом параметре макровызова?
2. Чем отличается команда от директивы?
3. Придумайте, как программисты на ассемблере могут определить синонимы для мнемокодов команд. Как это можно реализовать?
4. Перечислите модели ассемблерных программ и укажите их особенности и основные отличия.
5. Перечислите все директивы определения данных и дайте примеры их использования.
6. Объясните назначение вспомогательной директивы DUP и приведите пример ее использования.
7. Какая директива определения данных используется под вещественные числа в формате ДВФ?
8. Приведите примеры использования директивы EQU.
9. Укажите все возможные способы передачи параметров процедуре.
10. Как расширились возможности регистров данных в процессоре Pentium, для целей адресации?
11. Расширилось ли число способов адресации в процессоре Pentium по отношению к Intel 8086 и на сколько?
12. Для чего используются директивы определения данных?
13. Какие директивы используются для определения данных в формате ВВФ?
14. Как осуществляется передача параметров в макросах?
15. В чем отличие в использовании макросов и процедур?
16. Приведите пример использования макросов - блоков повторения.
17. Для чего используются директивы условного ассемблирования?
18. Дайте сравнительную характеристику моделей программ.
19. Как можно узнать о том, выполняет ли ЦП команды ММХ и SSE?
20. В каких случаях используется директива PURGE?
21. Назовите отладчики, которые Вы знаете? Чем они отличаются?
22. Зачем нужен файл с расширением LST (листинг)?
23. Какую модель программы Вы использовали при выполнении лабораторных работ и почему?
24. Для чего служит программа debug.exe?
25. На каком этапе осуществляется "вставка" библиотечных процедур?
26. Существуют ли, какие-либо особенности использования команд ММХ и SSE в программах на ассемблере?
Раздел 7. Специфика вычислительных систем
7.1. Мультипроцессорные системы
В мультипроцессорных системах (МПС) имеется несколько процессоров, каждый из которых может относительно независимо от остальных выполнять свою программу. В МПС существует общая для всех процессоров операционная система, которая оперативно распределяет вычислительную нагрузку между процессорами. Важным свойством МПС является отказоустойчивость, то есть способность к продолжению работы при отказах некоторых элементов, например процессоров или блоков памяти. При этом производительность, естественно, снижается, но не до нуля, как в обычных системах, в которых отсутствует избыточность.
Любая вычислительная система достигает своей наивысшей производительности благодаря использованию высокоскоростных процессорных элементов (ПЭ) и параллельному выполнению большого числа операций. Параллельные ВМ часто подразделяются по классификации Флинна на машины типа SIMD (Single Instruction Multiple Data - с одним потоком команд при множественном потоке данных) и MIMD (Multiple Instruction Multiple Data - с множественным потоком команд при множественном потоке данных). Можно выделить четыре основных типа архитектуры систем параллельной обработки: Конвейерная и векторная обработка. Основу конвейерной обработки составляет раздельное выполнение операций в несколько этапов (за несколько ступеней) с передачей данных одного этапа следующему. Производительность при этом возрастает благодаря тому, что одновременно на различных ступенях конвейера выполняются несколько операций. Конвейеризация эффективна только тогда, когда загрузка конвейера близка к полной, а скорость подачи новых операндов соответствует максимальной производительности конвейера. Если происходит задержка, то параллельно будет выполняться меньше операций и суммарная производительность снизится. Идеальную возможность полной загрузки вычислительного конвейера обеспечивают векторные операции. Машины типа SIMD. Машины типа SIMD состоят из большого числа идентичных процессорных элементов, имеющих собственную память. Все ПЭ в такой машине выполняют одну и ту же программу. Очевидно, что такая машина, составленная из большого числа процессоров, может обеспечить очень высокую производительность только на тех задачах, при решении которых все процессоры могут делать одну и ту же работу. Модель вычислений для машины SIMD очень похожа на модель вычислений для векторного процессора: одиночная операция выполняется над большим блоком данных. Модели вычислений на векторных и матричных ВМ настолько схожи, что эти ВМ часто рассматриваются как эквивалентные. Машины типа MIMD. Термин "мультипроцессор" покрывает большинство машин типа MIMD и (подобно тому, как термин "матричный процессор" применяется к машинам типа SIMD) часто используется в качестве синонима для машин типа MIMD. В МПС каждый процессорный элемент выполняет свою программу независимо от других ПЭ. Процессорные элементы, конечно, должны как-то связываться друг с другом, и в МПС с общей памятью (сильносвязанных) имеется память данных и команд, доступная всем ПЭ. С общей памятью ПЭ связываются с помощью общей шины или сети обмена. В противоположность этому варианту в слабосвязанных МПС (машинах с локальной памятью) вся память делится между ПЭ и каждый блок памяти доступен только связанному с ним процессору. Сеть обмена связывает процессорные элементы друг с другом. МПС с SIMD-процессорами. Многие современные ВС представляют собой многопроцессорные системы, в которых в качестве процессоров используются векторные процессоры или процессоры типа SIMD. Такие машины относятся к машинам класса MSIMD. Языки программирования и соответствующие компиляторы для машин типа MSIMD обычно обеспечивают языковые конструкции, которые позволяют программисту описывать параллелизм. В пределах каждой задачи компилятор автоматически векторизует подходящие циклы. Основной характеристикой параллельных МПС является ускорение R, определяемое выражением
R = T1 / Tn ,
где T1 - время выполнения задачи на однопроцессорной ВМ; Tn - время выполнения той же задачи на n-процессорной ВМ.
Многопроцессорные системы за годы развития вычислительной техники претерпели ряд этапов своего развития. Исторически первой стала осваиваться технология SIMD. Однако в настоящее время наметился устойчивый интерес к архитектурам MIMD. Этот интерес главным образом определяется двумя факторами: 1. Архитектура MIMD дает большую гибкость: при наличии адекватной поддержки со стороны аппаратных средств и программного обеспечения. MIMD может работать как однопользовательская система, обеспечивая высокопроизводительную обработку данных для одной прикладной задачи, как многопрограммная машина, выполняющая множество задач параллельно, и как некоторая комбинация этих возможностей. 2. Архитектура MIMD может использовать все преимущества современной МПС технологии на основе учета соотношения стоимость/производительность. В действительности практически все современные МПС строятся на тех же микропроцессорах, которые можно найти в персональных компьютерах, рабочих станциях и небольших однопроцессорных серверах. Одной из отличительных особенностей МПС является сеть обмена, с помощью которой процессоры соединяются друг с другом или с памятью. Модель обмена настолько важна для МПС, что многие характеристики производительности и другие оценки выражаются отношением времени обработки к времени обмена, соответствующим решаемым задачам. Существуют две основные модели межпроцессорного обмена: одна основана на передаче сообщений, другая - на использовании общей памяти. В МПС с общей памятью один процессор осуществляет запись в конкретную ячейку, а другой процессор производит считывание из этой ячейки памяти. Чтобы обеспечить согласованность данных и синхронизацию процессов, обмен часто реализуется по принципу взаимно исключающего доступа к общей памяти методом "почтового ящика". Модель системы с общей памятью очень удобна для программирования и иногда рассматривается как высокоуровневое средство оценки влияния обмена на работу системы, даже если основная система в действительности реализована с применением локальной памяти и принципа передачи сообщений. В МПС с локальной памятью непосредственное разделение памяти невозможно. Вместо этого процессоры получают доступ к совместно используемым данным посредством передачи сообщений по сети обмена. Эффективность схемы коммуникаций зависит от протоколов обмена, основных сетей обмена и пропускной способности памяти и каналов обмена. В сетях с коммутацией каналов по мере возрастания требований к обмену следует учитывать возможность перегрузки сети. Здесь межпроцессорный обмен связывает сетевые ресурсы: каналы, процессоры, буферы сообщений. Объем передаваемой информации может быть сокращен за счет тщательной функциональной декомпозиции задачи и тщательного диспетчирования выполняемых функций. Таким образом, существующие МПС распадаются на две основные группы. К первой группе относятся МПС с общей (разделяемой) основной памятью, объединяющие до нескольких десятков (обычно менее 32) процессоров. Сравнительно небольшое количество процессоров в таких машинах позволяет иметь одну централизованную общую память и объединить процессоры и память с помощью одной шины. При наличии у процессоров кэш-памяти достаточного объема высокопроизводительная шина и общая память могут удовлетворить обращения к памяти, поступающие от нескольких процессоров. Поскольку имеется единственная память с одним и тем же временем доступа, эти МПС иногда называют UMA (Uniform Memory Access). Такой способ организации со сравнительно небольшой разделяемой памятью в настоящее время является наиболее популярным. Структура подобной системы представлена на рис. 7.1.
Вторую группу МПС составляют крупномасштабные системы с распределенной памятью. Для того чтобы поддерживать большое количество процессоров приходится распределять основную память между ними, в противном случае полосы пропускания памяти просто может не хватить для удовлетворения запросов, поступающих от очень большого числа процессоров. Естественно при таком подходе также требуется реализовать связь процессоров между собой. На рис. 7.2 показана структура такой системы. Рис. 7.1. Типовая архитектура МПС с общей памятью
С ростом числа процессоров просто невозможно обойти необходимость реализации модели распределенной памяти с высокоскоростной сетью для связи процессоров. С быстрым ростом производительности процессоров и связанным с этим ужесточением требования увеличения полосы пропускания памяти, масштаб систем (т.е. число процессоров в системе), для которых требуется организация распределенной памяти, уменьшается, также как и уменьшается число процессоров, которые удается поддерживать на одной разделяемой шине и общей памяти. Распределение памяти между отдельными узлами системы имеет два главных преимущества.
Рис. 7.2. Типовая архитектура МПС с распределенной памятью
Во-первых, это эффективный с точки зрения стоимости способ увеличения полосы пропускания памяти, поскольку большинство обращений могут выполняться параллельно к локальной памяти в каждом узле. Во-вторых, это уменьшает задержку обращения (время доступа) к локальной памяти. Эти два преимущества еще больше сокращают количество процессоров, для которых архитектура с распределенной памятью имеет смысл. Существующие ВС класса MIMD образуют три технических подкласса:
* симметричные мультипроцессоры;
* системы с массовым параллелизмом;
* кластеры.
Симметричные мультипроцессоры (SMP - Symmetric Multi Processors) используют принцип разделяемой памяти. В этом случае система состоит из нескольких однородных процессоров и массива общей памяти (обычно из нескольких независимых блоков). Все процессоры имеют доступ к любой ячейке памяти с одинаковой скоростью. Процессоры подключены к памяти с помощью общей шины или коммутатора. Аппаратно поддерживается когерентность кэшей. Вся система работает под управлением единой ОС.
Системы с массовым параллелизмом (MPP - Massively Parallel Processing) содержат множество процессоров c индивидуальной памятью, которые связаны через некоторую коммуникационную среду. Как правило, системы MPP благодаря специализированной высокоскоростной системе обмена обеспечивают наивысшее быстродействие.
Кластерные системы − более дешевый вариант MPP-систем, поскольку они также используют принцип передачи сообщений, но строятся из готовых компонентов. Базовым элементом кластера является локальная сеть. Оказалось, что на многих классах задач и при достаточном числе узлов такие системы дают производительность, сравнимую с суперкомпьютерной.
Кластер - параллельный компьютер, все процессоры которого действуют как единое целое для решения одной задачи. Первым кластером на рабочих станциях был Beowulf. Проект Beowulf начался в 1994 г. сборкой в научно-космическом центре NASA 16-процессорного кластера на Ethernet-кабеле. С тех пор кластеры на рабочих станциях обычно называют Beowulf-кластерами. Любой Beowulf-кластер состоит из машин (узлов) и объединяющей их сети (коммутатора). Кроме ОС, необходимо установить и настроить сетевые драйверы, компиляторы, ПО поддержки параллельного программирования и распределения вычислительной нагрузки. В качестве узлов обычно используются однопроцессорные ВМ с быстродействием 1 ГГц и выше или SMP-серверы с небольшим числом процессоров (обычно 2-4).
Для получения хорошей производительности межпроцессорных обменов используют полнодуплексную сеть Fast Ethernet с пропускной способностью 100 Mбит/с. При этом для уменьшения числа коллизий устанавливают несколько "параллельных" сегментов Ethernet или соединяют узлы кластера через коммутатор (switch). В качестве операционных систем обычно используют Linux или Windows NT и ее варианты, а в качестве языка программирования - С++.
Наиболее распространенным интерфейсом параллельного программирования в мод модели передачи сообщений является MPI (Message Passing Interface). Рекомендуемой бесплатной реализацией MPI является пакет MPICH, разработанный в Аргоннской национальной лаборатории США.
Во многих организациях имеются локальные сети компьютеров с соответствующим программным обеспечением. Если такую сеть снабдить пакетом MPICH, то без дополнительных затрат получается Beowulf-кластер, сравнимый по мощности с супер-ЭВМ. Это является причиной широкого распространения таких кластеров.
7.2. Управление процессами
Программная единица, которая выполняет независимую задачу, называется процессом. Если процессы выполняются последовательно, система называется однопрограммной. Обычно в однопрограммных системах в любой момент времени в памяти находится только один процесс, а следующий процесс не загружается для выполнения, пока не завершается текущий процесс. Такая ситуация не подходит для большого числа применений, особенно если в них требуется реакция на события в реальном времени или быстрое и эффективное выполнение многочисленных программ. Предположим, что МПС должна принимать и обрабатывать данные от двух независимых устройств сбора данных. При работе в однопрограммной среде любой процесс может пропустить часть входных данных в то время, когда выполняется другой процесс. Это может случиться, даже когда скорость поступления данных в обоих процессах невелика. Проблема вызывается не недостатком вычислительной мощности или быстродействием интерфейсов, а последовательным характером всего метода обработки Рис. 7.3. Производительность однопрограммной (а) и мультипрограммной (б) системы
В мультипрограммной среде в памяти одновременно находятся коды двух и более процессов, которые выполняются с мультиплексированием во времени. Если скорость передачи данных имеет приемлемое значение, процессы можно коммутировать с помощью прерываний и успешно выполнять оба процесса. Производительность системы часто измеряется числом заданий, выполненных за временной интервал; эта величина называется пропускной способностью системы. Чтобы показать, каким образом совмещение обработки и ввода-вывода в режиме ПДП может улучшить пропускную способность системы, рассмотрим два процесса. Типичные действия однопрограммной системы показаны на рис. 7.3,а. Процесс 1 начинается и продолжается до точки А, где ему потребовался ввод-вывод. Здесь инициируется ввод-вывод, а обработка продолжается параллельно с ним до тех пор, пока для обработки не потребовались входные данные (точка В); ЦП должен ожидать завершения ввода-вывода. Обработка возобновляется, когда ввод-вывод закончен (точка С). Аналогичная ситуация возникает в точках D, Е и F. По окончании процесса 1 начинается процесс 2; он выполняется также, как и процесс 1. Кроме "перемешивания" нескольких действий ввода-вывода, мультипрограммная система может одновременно обслуживать нескольких пользователей. Пользователи поочередно управляют ЦП, когда каждому из них выделяется временной квант - получается система с разделением времени. В памяти однопроцессорной мультипрограммной системы одновременно находятся несколько процессов, которые разделяют ЦП, хотя сам ЦП в любой момент времени может выполнять только один процесс. В простой мультипрограммной системе процессы могут находиться в трех состояниях, причем каждый процесс в любой момент времени находится только в одном из этих состояний. Указанными состояниями являются: 1. Выполнение процесса. Процесс выполняется центральным процессором. 2. Блокировка. Выполнение процесса продолжать невозможно, так как он ожидает появления некоторого события, например завершения операции ввода-вывода. 3. Готовность. Выполнение процесса можно возобновить в любой момент времени. Например, ввод-вывод, завершения которого ожидал процесс, закончен и обработку можно продолжить. Смена состояний каждого процесса во времени показана на рис. 7.4. При запуске процесс помещается в очередь процессов, находящихся в состоянии готовности. Если текущий выполняемый процесс переходит из состояния выполнения в состояние блокировки из-за необходимости ожидания ввода-вывода, ЦП освобождается и планировщик процессов выбирает из очереди процесс и изменяет его состояние готовности на состояние выполнения. До тех пор, пока процесс находится в состоянии блокировки, его выполнение приостанавливается. После завершения ввода-вывода процесс переходит в состояние готовности и помещается в соответствующую очередь. В наиболее простом механизме мультипрограммирования процесс выполняется до своего завершения или необходимости ожидать ввода-вывода. Однако для предотвращения монопольного использования процессора одним процессом систему можно спроектировать так, чтобы выполняемый процесс переходил в состояние готовности по истечении определенного временного интервала, что обеспечивает другим процессам шансы на выполнение. Такими системами с разделением времени управляют внешние программируемые устройства синхронизации, называемые часами (тиймерами) реального времени (см. $ 9.3). В системе с разделением времени время измеряется от момента перехода процесса в состояние выполнения; часы реального времени формируют прерывание, когда отведенное процессу время (т. е. временной квант) исчерпано. После этого процедура прерывания, являющаяся частью резидентного монитора, инициирует изменения состояний процессов. Рис. 7.4. Смена состояний процесса во времени
Реализация очереди процессов, находящихся в состоянии готовности, зависит от стратегии планирования. Простейшая стратегия "первый пришел, первый вышел" (FIFO) назначает всем процессам одинаковые приоритеты и всегда выбирает для выполнения процесс, который находится в очереди дольше всех. Структура списка готовности, опирающаяся на планирование FIFO и связанный список, представлена на рис. 7.5. Указатель первого элемента показывает, какой процесс находится в вершине очереди, а указатель последнего элемента - процесс в низу очереди. Указатель последнего элемента необходим для того, чтобы в очередь можно было помещать новые процессы без просмотра всего списка. В примере предполагается, что каждый процесс имеет ID (идентификатор), который совпадает с позицией в массиве, содержащем связанный список. Предполагается также, что очередь состоит из процессов 3, 6, 2, 8 и 5 (именно в таком порядке). Следовательно, указатель первого элемента содержит 3, указатель последнего элемента содержит 5, а процессы 2, 3, 5, 6 и 8 находятся в состоянии готовности. Остальные элементы в таблице процессов либо заняты выполняемыми или заблокированными процессами, либо в данное время не используются. Если число 0 применяется для указания конца списка, его нельзя употреблять в качестве ID процесса. Если ID процессов представлены одним байтом и не может быть процесса 0, то максимальное число процессов, которые могут находиться в системе одновременно, равно 255. Каждый элемент в списке содержит прямой указатель очереди (fqp), который указывает на следующий элемент в списке, и указатель управляющего блока процесса для локализации блока памяти, который хранит информацию, относящуюся к процессу. Управляющий блок процесса служит областью запоминания процесса для хранения состояния машины, а также ID процесса, состояния процесса, кода, показывающего, как и почему процесс переведен в текущее состояние, и т. д.
Рис. 7.5. Структура очереди процессов
Когда ЦП переключается с одного выполняющегося процесса на другой, монитор должен: 1. Запомнить машинное состояние выполняемого процесса в управляющем блоке процесса. 2. Модифицировать остальную часть блока управления процесса. 3. Взять ID следующего выполняемого процесса из указателя первого элемента. 4. Удалить процесс, только что переведенный в состояние выполнения, посредством установки указателя первого элемента равным fqp удаляемого элемента. Если текущая выполняемая программа должна быть в очереди процессов, находящихся в состоянии готовности, ее необходимо поместить в низ очереди и модифицировать указатель последнего элемента. 5. Изменить состояние процесса, только что выбранного из списка готовности, на состояние выполнения и восстановить машинное состояние данного процесса. В результате шага 5 новый выбранный процесс будет продолжаться с той точки, в которой он был приостановлен. Процесс, находящийся в системе, можно поместить в список готовности, реализуя следующие действия: 1. Сохранить ID этого процесса в ftp текущего последнего элемента (элемента, адресуемого указателем последнего элемента) и в указатель последнего элемента. 2. Сбросить fqp в элементе таблицы данного процесса. 3. Модифицировать управляющий блок этого процесса. Очень часто, особенно при обработке данных в реальном времени, необходимо назначать различным процессам приоритеты, причем процессу, требующему самого быстрого обслуживания, назначается наивысший приоритет. Нескольким процессам можно назначить один и тот же приоритет и на каждом приоритетном уровне использовать стратегию FIFO. При этом в системе потребуется приоритетная таблица. Как показано на рис. 7.4, каждый элемент в этой таблице представляет собой приоритетный уровень и имеет два поля, одно из которых содержит указатель первого элемента приоритетного уровня, а другое - последнего. При изменении приоритета процесс необходимо удалить из его приоритетной цепочки и добавить в низ цепочки, имеющей его новый приоритет. Данное действие упрощается при наличии обратного указателя очереди (bqp), который ускоряет изменения приоритетов. Для выбора следующего выполняемого процесса планировщик должен просматривать приоритетную таблицу, начиная с наивысшего приоритета, до обнаружения ненулевого указателя первого элемента, а затем удалить этот процесс из очереди готовности. Преимущество использования bpq заключается в возможности динамического изменения приоритета данного процесса. Предположим, что приоритет процесса x необходимо изменить на приоритет y. Сначала процесс x удаляется из его текуoей приоритетной цепочки с помощью следующих операций: fqp(bqp(x)) <- fqp(x),
bqp(fqp(x)) <- bpq(x)
Конечно, если процесс x является верхним или нижним элементом в его текущей приоритетной цепочке, потребуется дополнительная коррекция приоритетной таблицы. Затем процесс x добавляется в низ цепочки, соответствующей приоритетному уровню y. Это сопровождается модификацией указателя последнего элемента (а также указателя первого элемента, если цепочка была пустой) fqp текущего последнего элемента в цепочке, а также fqp и bqp добавляемого элемента. Некоторые мультипрограммные операционные системы оказываются более сложными, чем показанная на рис. 7.4, и допускают более трех основных состояний процессов. Обычно в этом случае дополнительные состояния представляют собой другие формы заблокированного состояния.
7.3. Семафорные операции
В мультипрограммных системах процессам разрешается разделять общие программные, аппаратные и информационные ресурсы. Во многих ситуациях одновременно обращаться к общему ресурсу и модифицировать его может только один процесс, а другие процессы должны ожидать завершения его операций. Такой ресурс, обычно называемый последовательно используемым, должен быть защищен от одновременного доступа и модификации двумя или более процессами. Ресурсом этого типа может быть аппаратный ресурс (принтер, сканер, сетевая плата), файл данных или разделенная область памяти. Рассмотрим, например, файл персонала, который разделяется процессами 1 и 2. Предположим, что процесс 1 выполняет введения, удаления и изменения, а процесс 2 упорядочивает файл в алфавитном порядке по фамилиям. При последовательном доступе файл либо модифицируется процессом 1, а затем сортируется процессом 2, либо наоборот, Однако, если разрешить обоим процессам одновременный доступ к файлу, результаты окажутся непредсказуемыми и почти наверняка неправильными. Решение данной задачи заключается в том, чтобы разрешить одновременно только одному процессу выполнять его критическую секцию кода, т. е. секцию кода, которая осуществляет доступ к последовательно используемому ресурсу. Предотвращение ситуации, когда два и более процессов одновременно выполняют свои критические секции при доступе к разделенному ресурсу, называется взаимным исключением. Один из способов реализации взаимного исключения - использовать флажки.
Флажок, используемый для резервирования разделенного ресурса, называется семафором, а операции запроса и освобождения ресурса обычно называются семафорными операторами Р и V:
P:xoral,al
Check:xchgal,semaphore
testal,al
jzCheck
...
...
...
V:movsemaphore,1
Если semaphore = 1 при выполнении команды xchg, он сбрасывается, а в al оказывается 1. Даже если система переключает процессы после команды xchg, новый процесс не сможет войти в свою критическую секцию, так как semaphore уже сброшен. Такое решение стало возможным благодаря загрузке и установке операнда одной командой (именно командой xchg) и может быть применено к любому числу процессов. Как видно из приведенного примера, оператор Р легко реализуется командами xor, xchg, test и jz, а оператор V - командой mov. Однако, при такой реализации, когда один процесс находится в критической секции, другие процессы, претендующие на тот же самый ресурс, будут простаивать в циклах ожидания операторов Р, что приводит к значительным потерям времени. Для лучшего использования времени ЦП операторы Р и V следует модифицировать следующим образом:
P:xoral,al
xchgal,semaphore
testal,al
jnzUse
...
...
...
jmpP
Use:...
...
...
V:movsemaphore,1
...
...
...
Если семафор сброшен, вместо повторения цикла ожидания текущий процесс переводится в заблокированное состояние, а ЦП начинает выполнять выбранный процесс, находящийся в состоянии готовности. Аналогично в операторе V после установки семафора в 1 осуществляется пересылка процессов, которые были заблокированы из-за недоступности разделенного ресурса, из списка заблокированных процессов в список процессов, находящихся в состоянии готовности. Первый из этих процессов, который возобновляет выполнение, сможет войти в свою критическую секцию. Рис. 7.6. Синхронизация процессов А и В
Рассмотренный метод не только экономит время ЦП, но может применяться для синхронизации двух процессов или для передачи сообщения от одного процесса другому. На рис. 7.6 процессы А и В должны взаимодействовать в определенных точках. Они могут выполняться в режиме с разделением времени до тех пор, пока процесс В не достигает точки РВ1, где он должен ожидать сообщения или обращаться к результатам, полученным процессом А. После точки РА1 оба процесса вновь выполняются в режиме разделения времени до достижения точки РА2. В этой точке процесс А должен получать сообщение от процесса В или синхронизироваться с ним. 7.4. Разделение общих процедур
В мультипрограммной системе желательно, чтобы несколько пользователей могли разделять процедуры. Такими процедурами, называемыми общими, обычно являются библиотечные или системные программы, например драйверы ввода-вывода, процедуры преобразований кодов и т. п. Например, несколько пользователей могут одновременно пожелать редактировать свои программы с помощью редактора текста. Если не разделять код, в память придется загрузить несколько копий редактора. При разделении кода потребуется иметь в памяти только одну копию, что дает значительную экономию объема памяти. Общую процедуру можно разделять последовательно, как и любой другой разделяемый ресурс. Обычным образом перед вызовом общей процедуры вызывающая процедура должна выполнить оператор Р, а после выхода из нее - оператор V, чтобы сделать разделенную процедуру доступной другим пользователям. При последовательном разделении главное дополнительное требование заключается в том, что все локальные переменные в процедуре должны реинициализироваться, чтобы не использовались их значения от предыдущего вызова. Следовательно, последовательно разделяемая процедура должна инициализировать сама себя в начале каждого вызова. Применение последовательно разделяемых процедур довольно ограничено, так как требуется более универсальная форма разделения, т. е. форма, в которой процедура разделяется с мультиплексированием во времени (становится параллельно используемой). Эта форма означает: процедура должна быть такой, чтобы ее смог вызвать другой процесс до завершения выполнения процедуры от предыдущего вызова. Такая процедура называется реентерабельной (реентрантной, повторно вызываемой). Реентерабельная процедура должна состоять из кода, называемого чистым, который не модифицирует сам себя. Для удовлетворения этого требования реентерабельная процедура может хранить модифицируемые данные только в ячейках памяти, которые ассоциируются с вызывающим процессом; она не может даже временно хранить такие данные в ячейках, являющихся для нее локальными. Для иллюстрации предположим, что ТЕМР является локальной переменной в реентерабельной процедуре и что она используется для хранения промежуточного результата, и рассмотрим такую последовательность событий: 1. Процесс 1 выполняется и вызывает реентерабельную процедуру. 2. Реентерабельная процедура помещает промежуточный результат в ТНМР. 3. Процесс 2 получает управление процессором. 4. Процесс 2 вызывает реентерабельную процедуру. 5. Реентерабельная процедура вновь помещает промежуточный результат в TEMP. Очевидно, в этой точке первоначальный промежуточный результат разрушается, следовательно, при возврате в процесс 1 и возобновлении реентерабельной процедуры процесс 1 сформирует неправильный результат. Чтобы решить данную задачу, все результаты, включая и содержимое регистров, должны храниться в ячейках, ассоциированных с вызывающим процессом. В приведенном примере два промежуточных результата необходимо поместить в отдельные ячейки, одна из которых ассоциирована с процессом 1, а другая - с процессом 2. Для хранения многих копий промежуточных результатов по принципу LIF0 применялся один и тот же стек, так как рекурсивные вызовы сопровождаются возвратами в обратном порядке. Здесь же информация запоминается в вызывающем процессе.
Рис. 7.7. Реентерабельная процедура, разделяемая двумя процессами
В процессорах, имеющих стек, обычный способ хранения промежуточных результатов заключается в том, чтобы ассоциировать стек с каждым процессом. На рис. 7.7 показано, как два процесса обращаются к реентерабельной процедуре. Когда процесс 1 вызывает реентерабельную процедуру, содержимое регистров SS и SP не изменяется и реентерабельная процедура запоминает любые свои результаты в стеке процесса 1. Когда происходит переключение процессов, содержимое SS и Spизменяется с тем, чтобы адресовать вершину стека, ассоциированного с процессом 2. Когда вновь вызывается реентерабельная процедура, она будет запоминать свои результаты в стеке, ассоциированном с процессом 2, а предыдущие результаты не искажаются. Так как переключение между процедурами модифицирует и содержимое регистров DS и ES, эти регистры также можно использовать для хранения информации вызывающего процесса. По существу, можно реализовать любую приемлемую связь подпрограмм с единственным требованием, что никакие, данные нельзя хранить локально в реентерабельной процедуре.
Чистый код в реентерабельной процедуре должен быть еще и позиционно-независимым, т. е, он может правильно выполняться независимо от его размещения в физической памяти или относительно вызывающих его процессов. Во всех локальных обращениях должна применяться какая-либо разновидность косвенной адресации или код должен корректировать свои локальные адреса в соответствии с текущим размещением. Лучшим методом образования позиционно-независимого кода оказывается относительная адресация, которая в ЦП реализуется с помощью сегментных регистров. Требование позиционной независимости реентерабельных процедур объясняется тем, что они разделяются несколькими процессами и обычно во время выполнения динамически связываются с различными процедурами. Такая связь упрощается, если адреса в реентерабельном коде модифицировать не нужно.
7.5. Управление памятью
Совместный набор программных единиц, которые объединены друг с другом, но не обращаются к единицам вне набора, кроме обращений через внешнюю память, называется заданием (или программой). Чтобы эффективно использовать системные ресурсы и достичь максимальной параллельности работы ЦП и ввода-вывода, желательно хранить в памяти максимальное число заданий. Следовательно, при проектировании мультипрограммной системы важное значение приобретает управление памятью так, чтобы свести к минимуму неиспользуемое пространство памяти. Простейший способ хранения в памяти нескольких заданий заключается в распределении разделов. В этом способе каждому заданию назначается смежная область памяти. Когда необходимо выполнить задание, загрузчик запрашивает необходимый объем памяти у процедуры управления памятью, которая является частью операционной системы, отвечающей за распределение памяти. Если эта процедура находит свободную смежную область, размер которой больше размера задания, она возвращает загрузчику начальный адрес этой свободной области. После коррекции необходимых относительных адресов, такой, что они превращаются в физические адреса, загрузчик помещает задание в распределенную область. Конечно, начальным состоянием задания является "готовность" и допускается, что задание начинает выполняться не сразу. Если же достаточной смежной области нет, задание должно ожидать до тех пор, когда его будет можно загрузить из внешней памяти. Способ распределения разделов требует организации в процедуре управления памятью так называемой таблицы карты памяти. Возможная реализация этой таблицы заключается в том, чтобы каждому разделу соответствовал элемент таблицы. Каждый элемент таблицы должен содержать состояние, размер и начальный адрес раздела; раздел может быть в таких состояниях: Распределен. Раздел в данное время распределен заданию. Свободен. Раздел доступен для использования. Не используется. Элемент не ассоциирован с разделом. Третье состояние может возникнуть в том случае, когда два соседних свободных раздела объединены в один. Получив запрос на распределение памяти, процедура управления памятью проверяет размер каждого свободного раздела, начиная с верха таблицы. Если обнаруживается свободный раздел, размер которого равен или больше запрошенного раздела, его состояние изменяется на "распределен" и возвращется его начальный адрес. В том случае, если запрошенный объем памяти меньше объема раздела, для учета лишнего пространства в таблицу добавляется новый свободный раздел. Данный алгоритм выбора свободного раздела называется алгоритмом первого соответствия. В другом алгоритме - алгоритме наилучшего соответствия - просматривается вся таблица для нахождения наименьшего свободного раздела, удовлетворяющего запросу. Когда задание завершено, занятая им область возвращается в систему. Процедура управления памятью модифицирует таблицу карты памяти, чтобы отразить возможное слияние соседних свободных разделов, появляющихся при освобождении памяти. Две возможные ситуации, вызывающие слияние, представлены на рис. 7.8. В случае 1 освобожденный раздел оказывается соседним с имеющейся свободной областью. После слияния два свободных раздела объединены в один большой раздел, начальный адрес которого равен меньшему из двух первоначальных свободных адресов. В случае 2 две имеющиеся свободные области разделены освобожденным разделом. В результате слияния три раздела объединяются в один. Слияние необходимо для того, чтобы иметь максимальные размеры свободных разделов. Основные достоинства способа распределения разделами - простота и отсутствие специальных аппаратных средств. Однако по мере завершения заданий и загрузки новых заданий начинают появляться все меньшие и меньшие области памяти - возникает проблема фрагментации (рис. 7.9, а) . При большом числе таких небольших свободных областей система не сможет загрузить задание, даже если общий объем доступного пространства достаточно велик; иначе говоря, значительная часть памяти не используется. Один из способов решения проблемы фрагментации заключается в том, чтобы объединить все свободные области в одну, "сжимая" или "уплотняя" находящиеся в памяти задания. как показано на рис. 7.9, б. Так реализуется способ распределения разделов с перемещением. Но для его применения компьютер должен иметь возможность корректировать каждое задание так, чтобы после его перемещения из одной области в другую можно было правильно возобновить выполнение задания. Рис. 7.8. Слияние свободных разделов Рис. 7.9. Фрагментация памяти (а)
и загрузка задания (б)
В ЦП все физические адреса формируются сложением эффективных и сегментных адресов, умноженных на 16. причем сегментные адреса берутся из сегментных регистров. Такой способ позволяет легко преобразовать программу в позиционно-независимый код и пересылать ее из одной области памяти в другую без модификации машинного кода. При выполнении перемещения монитор должен скорректировать сегментные адреса (т. е. содержимое сегментных регистров).
Чтобы обеспечить позиционную независимость, сегментными регистрами должна управлять только процедура управления памятью, а программа не должна их модифицировать. Кроме того, все вызовы процедур и переходы должны иметь тип near. В противном случае, если CS был запомнен вызовом до перемещения, а возврат осуществляется после перемещения, CS будет содержать старый сегментный адрес и программа возвратится в неправильное место. Так как переместимой программе не разрешается модифицировать сегментные регистры, задание может иметь максимум четыре сегмента (кода, данных, дополнительных данных и стека) и максимальный размер задания ограничен 4 х 64К= 256K. Так как при уплотнении операционная система должна пересылать задания из одной области памяти в другую, на уплотнение расходуется много времени и без необходимости его выполнять не следует. В способе распределения разделов с перемещением обычным образом процедура управления памятью распределяет пространство и организует таблицу карты памяти, как и в способе распределения разделов. Однако, если нельзя найти одну свободную область больше запрошенного размера, операционная система должна определить, достаточно ли всего свободного объема памяти. Если это так, инициируется процесс уплотнения, в котором корректируются базовые адреса всех заданий (они определяются запомненным содержимым сегментных регистров) и соответственно модифицируется таблица карты памяти.
Контрольные вопросы
1. Назовите и опишите классы МПС по Флинну.
2. Что такое МПС с общей памятью?
3. Что такое МПС с индивидуальной памятью?
4. Что вызывает некорректность вычислений в ВМ с общей памятью?
5. Каковы достоинства и недостатки ВМ с передачей сообщений?
6. Что такое кластер?
7. В чем состоит принципиальное отличие кластеров от систем MPP?
8. В чем заключается основное назначение мультипроцессорных систем?
9. Объясните различия в SIMD и MIMD технологиях.
10. Что такое кластер? Где используются кластеры?
11. Какие языки программирования следует использовать для ВС типа MSIMD?
12. В чем заключаются основные свойства мультипрограммной среды?
13. Что такое пропускная способность МПС?
14. Что такое процесс и в каких состояниях он может находиться?
15. Как и для чего используются семафоры?
16. Поясните работу семафорных операторов.
17. Какими свойствами должна обладать реентерабельная процедура?
18. В чем состоит проблема фрагментации?
19. Как реализуется способ распределения разделов с перемещением?
Раздел 8. Специализированные процессоры и ВМ
8.1. Процессор ввода-вывода
Для организации обмена данными в вычислительных системах обычно используются различные контроллеры, позволяющие согласовывать работу того или иного ВУ с работой системы. Примерами могут служить контроллеры ПКП и ПДП. В функции контроллеров входит анализ сигналов от ВУ, дешифрация адреса ВУ, адресация памяти (для ПДП), синхронизация обмена, согласование форматов данных, выдача управляющих сигналов и т. д. Чем шире многообразие ВУ, тем большее число различных контроллеров необходимо для их обслуживания. Специфика ВС состоит, в частности, в использовании большого числа специализированных ВУ, что заставляет каждый раз проектировать соответствующий контроллер. Кроме того, помимо функций управления ВУ и передачей данных на эти контроллеры возлагают дополнительные функции по предварительной обработке передаваемых данных (например, кодирование, декодирование, анализ условий окончания передачи). Для снижения трудоемкости проектирования и повышения эффективности системы ввода-вывода в ВС, создаваемых на основе ЦП Intel 8086, удобно использовать специализированный процессор ввода-вывода Intel 8089. Этот процессор сочетает в себе свойства универсальноro контроллера ПДП со свойствами специализированного процессора, который позволяет осуществлять различные преобразования данных во время пересылок. Рис. 8.1. Архитектура процессора ввода-вывода Intel 8089
Процессор ввода-вывода (ПВВ) имеет два канала ввода-вывода, каждый из которых может осуществлять высокоскоростные пересылки в режиме ПДП с одновременным преобразованием пересылаемых данных. ПВВ удобно рассматривать как два независимых канала, каждый из которых может находиться в одном из трех основных режимов работы: простаивать (пассивное состояние), выполнять программу канала и осуществлять пересылку в режиме ПДП. По способу "общения" ЦП с ПВВ различают два режима взаимодействия: начальная инициализация и управление. Общее устройство управления УУ обеспечивает начальную инициализацию ПВВ. По включении питания или сигналу начальной установки RESET центральный процессор подготавливает в памяти ряд связанных друг с другом блоков (рис. 8.2) с сообщениями для ПВВ. После этого ЦП выдает сигналы СА (готовность канала) и SEL (выбор канала), запрашивающие готовность каналов. По сигналу СА сопроцессор прекращает какие-либо действия и анализирует сигнал SEL, указывающий номер канала (1 или 2), которому предназначается сообщение. Когда канал выбран, ПВВ исследует слово управления каналом CCW, которое задает режим работы канала (простаивание, программа канала, пересылка с ПДП). Если управляющее слово требует запуск выполнения программы, то ПВВ загружает адреса блока параметров и блока заданий во внутренние регистры соответствующего канала, устанавливает флаг занятости BUSY и переходит к выполнению программы канала.
Рис. 8.2. Структура блоков сообщений при начальной инициализации ПВВ
Центральный процессор после выдачи сигнала СА освобождается для выполнения другой работы. После окончания выполнения программы канал сбрасывает флаг занятости BUSY в блоке управления. Таким образом, взаимодействие ЦП и ПВВ строится по схеме, показанной на рис. 8.3. При необходимости ПВВ может выдать запрос прерывания в ЦП. По способу организации ВС, включающей ЦП и ПВВ, различают два вида конфигурации системы: местную и удаленную. Местная конфигурация характеризуется тем, что ЦП и ПВВ совместно используют системные шины, в то время как при удаленной конфигурации шина ввода-вывода "удалена" от ЦП и ПВВ может обращаться к ВУ, не используя общую системную шину. Таким образом, удаленная конфигурация повышает степень параллельности работы ЦП и ПВВ и увеличивает производительность ВС. ПВВ может обращаться к элементам памяти, расположенным в двух различных пространствах адресов. Системное пространство, совпадающее с пространством памяти ЦП, может содержать до 220 = 1048676 байт. Пространство ввода-вывода, которое также может совпадать с пространством ввода-вывода ЦП или быть принадлежностью только ПВВ, содержит до 216 = 65 536 байт. Когда пространства ввода-вывода ЦП и ПВВ не совпадают, говорят, что ВС имеет удаленную конфигурацию.
Поскольку ВУ можно кодировать как адреса памяти, то в обоих пространствах могут размещаться как устройства памяти, так и ВУ. Причем ВУ, расположенные в системном пространстве, являются отображенными на память, а память, расположенная в пространстве ввода-вывода, оказывается отображенной на ввод-вывод. С точки зрения программирования оба пространства памяти ПВВ организованы как несегментированные массивы, состоящие из индивидуально адресуемых байтов. Команды и данные могут размещаться в любых адресах без выравнивания, т. е. без предпочтительного размещения младшего байта по четному адресу. ПВВ "рассматривает" системное пространство иначе, чем ЦП, с которым он совместно использует это пространство. Центральный процессор, как было ранее показано, делает различие между логическим адресом памяти, состоящим из 16-разрядного начального адреса сегмента и 16-разрядного смещения в сегменте, и ее физическим 20-разрядным адресом. ПВВ игнорирует логическую сегментированную структуру пространства памяти и пользуется только 20-разрядным физическим адресом. Память, расположенная в пространстве ввода-вывода ПВВ, рассматривается аналогично, за исключением того, что для обращения к любой ячейке требуется только 16 разрядов адреса. Схема сопроцессора (рис. 8.1) подразделена на ряд функциональных узлов, которые соединяются между собой 20-разрядной шиной, обеспечивающей максимальную скорость внутренних пересылок. Общее устройство управления. Устройство управления (УУ) координирует работу сопроцессора, определяя приоритеты каналов, синхронизируя циклы выполнения команд, пересылки с ПДП, ответы на запросы готовности канала. В частности, под управлением общего УУ выполняется начальная инициализация сопроцессор а. Арифметико-логическое устройство (АЛУ). Может выполнять арифметические операции над 8- и 16-разрядными двоичными числами, причем длина результата может доходить до 20 разрядов. Имеются арифметические команды сложения, увеличения и уменьшения на единицу, а также логические операции И, ИЛИ и НЕ. Регистры сборки-разборки. Служат для выполнения пересылки данных за минимально возможное число циклов работы с шиной, когда данные пересылаются между шинами разной разрядности. Например, при пересылке с ПДП данных от 8-разрядного ВУ в 16-разрядную память сопроцессор выполняет два цикла работы с шиной, принимая 8 разрядов за каждый цикл, собирает 16-разрядное слово, а затем пересылает это слово в память за один цикл. Регистр выборки команд. Служит для хранения команд, выбираемых из памяти для работающего канала. Команды поступают по 16-разрядной шине данных через буфер шины (БШ) и запоминаются в этом регистре в виде очереди из байтов команд. Каждый канал имеет свою собственную очередь, и работа одного канала не влияет на очередь другого канала. Преимущества использования внутренней очереди из байтов команд были показаны для ЦП. Устройство сопряжения с шиной (УСШ). Управляет всеми циклами работы с ША/Д, пересылая команды и данные между сопроцессором и памятью или ВУ. Устройство сопряжения с шиной выдает сигналы управления S2, Sl и S0, которые затем декодируются системным контроллером Intel 8288. При работе с сопроцессором контроллер вырабатывает управляющие сигналы, аналогичные тем, которые формируются при работе с ЦП. Кроме пересылок УСШ осуществляет управление совместным использованием шин СП и ЦП путем формирования и анализа сигнала RQ/GT - запроса и предоставления шины. В функции УСШ входит также формирование сигналов LOCK - захват шины и ВНЕ - разрешение старшего байта. Рассмотрим особенности организации каналов сопроцессора.
Устройство управления вводом - выводом (УУВВ) . Имеется в каждом канале, выполняет следующие функции: * если пересылка синхронная, то УУВВ ожидает поступления сигнала по
входу DRQ (запрос ПДП) перед выполнением очередного цикла чтения - записи; * если пересылка должна заканчиваться при получении внешнего сигнала, то УУВВ наблюдает за поступлением сигнала по входу ЕХТ (внешнее окончание); * между циклами чтения и записи, когда данные находятся в ПВВ, канал может подсчитать, перекодировать и проанализировать данные, причем УУВВ может прекратить пересылку на основании результатов этих операций; * УУВВ имеет выход SINTR (системное прерывание), который может быть активизирован программно для передачи запроса прерывания в ЦП. 8.2. Программная модель процессора ввода-вывода
Как известно, к программной модели любого процессора относят те узлы, которые доступны для использования из программы. В первую очередь такими узлами являются регистры.
Регистры канала. На рис. 8.3 представлены программно доступные регистры канала и указано их стандартное назначение. Использование каждого из этих регистров при выполнении каналом программы или пересылок в режиме ПДП указано в табл. 8.1.
Регистры GA, GB и GC могут использоваться программой в качестве регистров общего назначения или регистров базы. При организации ПДП до начала пересылки регистр GA (GB) должен быть загружен адресом источника или приемника данных. Регистры GA и GB функционально взаимозаменяемы. Если при ПДП регистр GA указывает на источник, то регистр GB указывает на приемник и наоборот. Регистр GC при ПДП применяется в том случае, когда пересылаемая информация должна быть перекодирована. Для этого регистр GC до начала пересылки должен быть загружен начальным адресом таблицы перекодировки.
Рис. 8.3. Регистры канала процессора ввода-вывода
Указатель задания ТР играет ту же роль, что и указатель команд IP в центральном процессоре. Первоначально указатель задания ТР загружается при начальной инициализации ПВВ. Далее, во время выполнения программы, значение ТР автоматически изменяется для указания на следующую команду, которая должна быть выполнена. Указатель задания является полностью программно доступным, однако, использовать его, например, в качестве РОН или регистра базы не рекомендуется, поскольку это нарушит требуемую последовательность выполнения команд.
Указатель параметров РР загружается начальным адресом блока параметров, прежде чем начнет работу программа канала. Это происходит во время инициализации процессора. Программа канала не может изменять содержимое этого регистра, однако его применяют в качестве базового регистра для доступа к данным, содержащимся в блоке параметров. В режиме ПДП регистр РР не используется.
Индексный регистр IX может быть использован в качестве РОН при работе программы канала. Кроме того, его удобно использовать как индексный регистр для адресации операндов, расположенных в памяти. Регистр IX может быть, при желании, автоматически инкрементирован в конце выполнения каждой команды, что является удобным средством пошаговой обработки массивов (или строк). При ПДП индексный регистр не используется. Таблица 8.1
РегистрИспользование регистраВ программе каналаПри пересылке с ПДПGAРОН либо базовый регистрУказатель источника/приемникаGBРОН либо базовый регистрУказатель приемник/источникGCРОН либо базовый регистрУказатель таблицы перекодировкиТРУказатель заданияУказывает причину окончанияРРБазовыйНе используетсяIXРОН с автоинкрементомНе используетсяВС РОНСчетчик байтовМС РОНРегистр сравнения с маскированиемССНе используетсяЗадает вид обработки Счетчик байтов ВС во время работы программы канала используется как РОН. В режиме ПДП его применяют как счетчик числа переданных байтов данных. Для этого до начала пересылки в регистр ВС необходимо загрузить количество байтов, которое необходимо переслать. Во время выполнения пересылки содержимое регистра ВС декрементируется при пересылке каждого байта независимо от того, было указано на остановку при передачи определенного количества байтов или нет. Когда содержимое регистра ВС станет равным нулю, пересылка прекращается только в том случае, если было дано указание на остановку по нулевому отсчету. Если такого указания не было, то следующим значением регистра ВС будет значение 0FFFFh и декрементирование продолжится. Рис. 8.4. Пример выполнения операции сравнения с маскированием
Регистр маскирования/сравнения МС может быть использован как РОН. Кроме того, этот регистр может быть использован программой канала или во время пересылок с прямым доступом к памяти для выполнения сравнений с одновременным маскированием однобайтовых величин. Для такого использования регистра МС программа канала загружает число, с которым будет производиться сравнение, в младший байт регистра, а маску - в старший байт. Значение "0" в маске исключает соответствующий разряд загруженного числа и он не влияет на результат сравнения (рис. 8.4).
Регистр СС служит для управления каналом. Перед началом работы программа канала загружает этот регистр необходимыми значениями в соответствии с управляющими полями, представленными на рис. 8.5. Все указанные поля, за исключением разряда 8 (поле С), служат для управления каналом при пересылках с ПДП. Поле С - разряд непрерывности, относится к выполнению программы. Если этот разряд сброшен в нуль (С=0), то программа канала выполняется с нормальным приоритетом, если он установлен в единицу, то приоритет программы поднимается до уровня приоритета пересылок с прямым доступом к памяти.
Рис. 8.5. Структура регистра управления каналом
Хотя программа канала может использовать регистр СС в качестве РОН, такое использование не рекомендуется, поскольку оно может повлиять на состояние разряда непрерывности и изменить приоритет программы канала. Поэтому использование регистра СС программой обычно ограничивается загрузкой управляющих значений при подготовке пересылок с ПДП, а также установкой и сбросом разряда непрерывности. Назначение полей регистра СС. Поле функции F определяет источник и приемник данных при ПДП как память или устройства ввода-вывода (порты) в соответствии с табл. 8.2. Во время выполнения пересылки канал декрементирует регистры указателей адресов источника (приемника), относящиеся к памяти, для того, чтобы данные помещались в последовательные ячейки. Указатели, относящиеся к устройствам ввода-вывода, остаются без изменения во время ПДП.
Таблица 8.2
Поле FФункцияПоле SYNСинхронизация00Порт - Порт00Асинхронно01Память - Порт01От источника10Порт - Память10От приемника11Память - Память11Не используется
Разряд перекодировки ТL управляет перекодировкой данных. Если значение TL=1, то каждый передаваемый байт перекодируется с помощью таблицы, начальный адрес которой указан в регистре GC. Значение TL=0 соответствует пересылке без перекодировки. Важно отметить, что перекодировка определена только для пересылок байтов, т. е. логическая ширина шины приемника должна составлять 8 разрядов. Поле синхронизации SYN указывает, что синхронизируется пересылка в соответствии с табл. 8.2. Асинхронные пересылки обычно используются при пересылках память - память. Синхронизация от источника выбирается обычно в тех случаях, когда источником является ВУ, а приемником - память. Внешнее устройство начинает очередной цикл пересылки, подавая сигнал на вход РЩ канала. Тогда канал выполняет один цикл пересылки и вновь ожидает сигнал DRQ. Синхронизация от приемника чаще всего осуществляется тогда, когда источником является память, а приемником - ВУ. Как и в предыдущем случае, ВУ управляет частотой пересылок с помощью сигнала DRQ, подавая его, когда оно готово к получению очередного байта или слова. Разряд S определяет, какой из регистров GA или GB содержит адрес источника данных при ПДП. Значение S=O соответствует случаю, когда GA указывает на источник; S=1, когда GB указывает на источник. Разряд L управляет выдачей сигнала LOCK (блокировка шин) во время ПДП. При L=0 сигнал LOCK не выдается, при L=1 устанавливается активный сигнал LOCK=0. Если пересылка синхронизируется от источника, то сигнал LOCK находится в активном состоянии с момента получения первого запроса ПДП (сигнал DRQ) и до тех пор, пока канал не приступит к выполнению программы завершения пересылок. Если пересылка синхронизируется от приемника, то сигнал LOCK будет находиться в активном состоянии от момента первого считывания (который предшествует первому запросу ПДП) и до тех пор, пока канал не перейдет к выполнению завершающей программы. Разряд непрерывности С не используется при пересылках. Как отмечалось выше, установка этого разряда в "1" повышает приоритет программы канала до уровня ПДП. Разряд остановки по передаче одного символа TS используется для указания каналу на выполнение всего одного цикла пересылки. Когда значение TS=1, то после пересылки одного байта (или слова) сразу возобновляется программа канала, причем все другие условия окончания, которые задаются следующими тремя полями (ТХ, ТВС и ТМС), в этом случае игнорируются.
Таблица 8.3
Поле TXОкончание по EXTПоле TBCОкончание по BC = 000Нет00Нет01Со смещением 001Со смещением 010Со смещением 410Со смещением 411Со смещением 811Со смещением 8
Три младших поля регистра управления ТХ, ТВС и ТМС указывают каналу условие окончания пересылки: ТХ - по внешнему сигналу, ТВС - по счетчику байтов и ТМС - по сравнению с маскированием. Эти условия могут быть указаны по отдельности или в любых комбинациях. Внешнее окончание позволяет устройству ввода - вывода (обычно тому, которое синхронизирует пересылку) прекратить пересылку, подавая сигнал на вход ЕХТ (внешняя остановка) канала. Если выбрано окончание по счетчику байтов, то канал остановится, когда ВС=0. Если указано окончание по сравнению с маскированием, то канал остановится, обнаружив байт, равный или не равный (возможны два варианта) младшему байту регистра МС, на который наложена маска, содержащаяся в старшем байте. Байт, останавливающий пересылку, тоже пересылается. После окончания пересылки с ПДП канал прибавляет величину, называемую смещением окончания, к содержимому указателя заданий ТР и возобновляет выполнение программы канала с этой точки. Смещение окончания может принимать значения 0, 4 или 8. Окончание однократной пересылки (по TS = 1) всегда приводит к смещению окончания, равному нулю. Кодирование полей управления окончанием приведено в табл. 8.3 - 8.4. Таблица 8.4
Поле TМСОкончание по маскированному сравнениюПоле TМCОкончание по маскированному сравнению000Нет100Нет011По совпадению, смещение 0101По несовпадению, смещение 0010По совпадению, смещение 4110По несовпадению, смещение 4011По совпадению, смещение 8111По несовпадению, смещение 8
Поскольку допускается совместное использование различных условий окончания, то возможно, что два или даже три условия окончания будут выполнены одновременно. В таком случае каналом будет автоматически выбрано окончание по условию, имеющему наибольшую величину смещения.
Кроме перечисленных выше регистров в каждом канале имеется регистр, который содержит слово-состояние программы PSW (рис. 8.6, а). Программа канала не имеет доступа к PSW. Слово-состояние программы хранит состояние канала с тем, чтобы его работа могла быть приостановлена и позже возобновлена. Когда ЦП выдает команду приостановить работу канала, канал сохраняет содержимое PSW, указатель задания ТР и разряд-этикетку TAG указателя задания в первых четырех байтах блока параметров канала, как показано на рис. 8.6, б. Получив в дальнейшем команду возобновить работу канала, канал восстанавливает содержимое регистра PSW, регистра ТР и разряда-этикетки TAG из блока параметров и возобновляет свою работу. Рис. 8.6. Структура слова-состояния PSW (а) и размещения информации в памяти по команде приостановить работу канала (б)
Разряды-этикетки TAG (см. рис. 8.3) связаны с каждым из четырех регистров GA, GB, GC и ТР. Напомним, что все пространство адресов удобно рассматривать как совокупность системного пространства (1М байт) и пространства ввода-вывода (64К байт). Поскольку регистры GA, GB, GC и ТР могут использоваться в качестве указателей и базовых регистров, то связанный с каждым из них разряд-этикетка TAG определяет, указывает ли регистр на адрес в системном пространстве (TAG=O) или в пространстве ввода-вывода (TAG=1). Общее УУ устанавливает или сбрасывает этикетку регистра ТР в зависимости от того, в каком пространстве записана программа канала. Программа канала изменяет состояния разрядов-этикеток регистров GA, GB, GC, используя различные команды загрузки регистров (подробно они описаны ниже). Команда загрузка указателя сбрасывает разряд-этикетку, а команда пересылка устанавливает разряд-этикетку. Когда разряд-этикетка указывает на системное пространство, то используются все 20 разрядов ША, что позволяет прямо адресоваться к 1М байт памяти. Если разряд-этикетка указывает на пространство ввода-вывода, то состояние четырех старших разрядов ША не определено, а 16 младших разрядов обеспечивают доступ к любому адресу в пределах 64К байт.
Таблица 8.5
Действия каналаПриоритет Пересылка с ПДП1 (высший) Программа завершения пересылки с ПДП1 Программа канала (непрерывная)1 Программа ответа на запрос готовности2 Программа канала3 Пассивное состояние4
Для организации совместной работы каналов ПВВ имеет встроенный механизм приоритетов. Этот механизм учитывает, что некоторые виды работ (например, прямой доступ к памяти) более важны, чем другие. Каждый вид действий, выполняемых каналом, имеет приоритет, отражающий его относительную важность (табл. 8.5). После окончания каждого внутреннего цикла работы сопроцессора общее УУ позволяет либо одному, либо другому каналу выполнять очередной внутренний цикл в соответствии с этими приоритетами. Когда пересылка с ПДП заканчивается, канал выполняет короткую внутреннюю программу завершения пересылки с ПДП. Она изменяет содержимое регистра ТР так, чтобы программа канала (пользователя) возобновила работу с команды, указанной при запуске пересылки с ПДП. Аналогично, при подтверждении запроса готовности канал выполняет внутреннюю программу, которая формирует ответ на запрос. Обе эти программы состоят из стандартных команд ПВВ, которые считываются из внутреннего ПЗУ. Напомним, что программа канала может работать с приоритетом 3 или с приоритетом 1. Приоритет программы канала задается разрядом непрерывности С в регистре управления каналом СС. Если разряд С=0, то программа работает с нормальным приоритетом 3, а если С=1, то программа называется непрерывной и работает с тем же приоритетом, что и пересылка с ПДП. Таким образом, разряд непрерывности позволяет поднять приоритет тех программ (или отдельных частей программы) канала, которые критичны по времени выполнения. Общее УУ позволяет работать каналу с более высоким приоритетом, а в тех случаях, когда приоритеты одинаковы, оно сравнивает разряды приоритета в слове-состояния программы PSW. Если значения этих разрядов не равны, то работает канал с P= l. В случае равенства разрядов приоритета у обоих каналов они работают попеременно под управлением общего УУ. 8.3. Система команд процессора ввода-вывода
Система команд, используемых для написания программ канала, включает 53 команды, которые предназначены специально для повышения эффективности ввода-вывода данных. На рис. 8.7 приведен формат типичной команды ПВВ. Команды имеют длину от 2 до 6 байт. Первые два байта присутствуют в любой команде и обычно имеют поля, показанные на рис. 8.7.
Рис. 8.7. Обобщенный формат команд сопроцессора ввода - вывода
Поле R/В/Р - регистр/бит/указатель - позволяет кодировать либо регистр, либо разряд, либо регистр-указатель в зависимости от конкретной команды, как показано в табл. 8.6. Таблица 8.6
Код в поле R/B/PРегистрРазрядРегистр-
указатель000GA0GA001GB1GB010GC2GC011ВС3-100ТР4ТР101IX5-110СС6-111МС7-
Поле WB показывает, сколько байтов смещения/данных (рис. 3.24) присутствует в команде, как показано в табл. 8.7.
Байты смещения используются для передачи управления: байт для коротких передач, в пределах от + 127 до - 128, и 2 байт - для передач в пределах 64К. Байты данных применяются в командах, оперирующих с непосредственными данными (константами).
Таблица 8.7
Код в поле WBИнтерпретация00Нет байтов смещения/данных011 байт смещения/данных102 байт смещения/данных11Только в команде TSL
Поле АА задает режим адресации, который должен быть использован ПВВ при вычислении исполнительного адреса операнда. Всего имеется четыре режима адресации, выисление исполнительного адреса при каждом из них показано на рис. 8.9. Поле w используется, как обычно, для указания размерности операнда, с которым оперирует команда. Код операции, в сочетании с полем w, идентифицирует команду, например, (КОП) = 111011 обозначает операцию "декремент", при w=0 - она соответствует мнемокоду DECB, а при w=1 - мнемокоду DEC. Поле ММ показывает, какой регистр используется в качестве базового при формировании исполнительного адреса ЕА. Кодирование поля ММ показано на рис. 8.9.
Систему команд ПВВ удобно разбить на пять групп: команды пересылки данных; арифметические команды; логические команды и команды обработки отдельных разрядов; команды передачи управления; команды управления сопроцессором.
Рис. 8.9. Схемы формирования исполнительного адреса при различных режимах адресации
Команды пересылки данных. Выполняют пересылки между памятью и регистрами канала. Поскольку команды не различают адреса памяти и адреса ВУ, они могут быть использованы также для чтения и записи в устройство ввода - вывода. В этой группе имеются команды обычных пересылок байтов и слов (включая пересылки из памяти в память), а также специальные команды, загружающие адреса в регистры-указатели и выполняющие модификацию разрядов-этикеток. Рис. 8.10. Форматы операндов в команде MOV
Команда MOV пересылает байт или слово из источника в приемник: память - регистр, регистр - память, память - память (отметим, что нет пересылки типа регистр - регистр). Имеется четыре мнемокода команды: MOV - переслать слово, MOVB - переслать байт, MOVI - переслать 16-разрядную константу (данные, представленные непосредственно в команде), MOVBI - переслать 8-разрядную константу. На рис. 8.10 показано, как эти команды воздействуют на операнды, содержащиеся в регистрах: Т - разряд пересылается в операнд-приемник; R - разряд замещается операндом-источником; S - разряд является знаковым расширением старшего переданного разряда; Х - разряд игнорируется.
Следует подчеркнуть, что когда в качестве приемника назначается регистр-указатель, например MOVI GB,27F0h его разряд-этикетка TAG устанавливается в "1". Поэтому команда MOV используется для загрузки адресов, относящихся к пространству ввода - вывода. Команда MOVP - переслать указатель - пересылает 20-разрядный физический адрес между регистром-указателем и памятью. Если источником является регистр-указатель, то его содержимое и разряд-этикетка преобразуется в указатель физического адреса.
Рис. 8.11. Примеры преобразования содержимого регистра-указателя в указатель адреса
На рис. 8.11,а показано размещение значения указателя 265F3h в памяти по адресу 100h.
Если источником является память, то три байт памяти преобразуются в 20-разрядный физический адрес и значение этикетки TAG загружается в регистр-указатель и его разряд-этикетку. Эта команда обычно используется для сохранения и восстановления содержимого регистров-указателей. Команда LPD загрузить указатель двойным словом - преобразует двойное слово указателя в 20-разрядный физический адрес и загружает его в регистр-указатель. На рис. 8.11,б показано хранение указателя в памяти по адресу 200h, которому соответствует базовый адрес 3B4Ch и смещение 65h.
Этикетка регистра-указателя всегда сбрасывается в "0", указывая на адрес в системном пространстве. Имеется разновидность команды LPDI - загрузка указателя 32-разрядной константой. Таким образом, центральный процессор может передать в ПВВ любой адрес из своего пространства памяти в форме указателя (база, смещение), длина которого составляет двойное слово. Программа канала, используя команду LPD, может загрузить этот адрес в свой регистр-указатель. Арифметические команды. Интерпретируют все операнды как двоичные числа без знака, имеющие длину 8, 16 или 20 разрядов. Числа со знаком могут быть представлены в дополнительном коде, однако ПВВ не фиксирует переполнения в знаковый (старший) разряд. Он выполняет арифметические операции над 20-разрядными числами следующим образом. Операнды, имеющие длину 8 и 16 разрядов, дополняются расширением знака (т. е. старшего разряда) до 20 разрядов, как было описано ранее. Затем выполняется операция, и 20-разрядный результат возвращается в операнд-приемник, при этом старшие разряды усекаются так, чтобы длина результата соответствовала числу разрядов приемника. На рис. 8.12, а показано, как арифметические команды влияют на содержимое регистров, указанных в качестве операндов-источников и операндов-приемников. Рис. 8.12. Форматы операндов в арифметических (а) и логических (б) командах
Команда ADD суммирует операнды источника и приемника: память+ регистр=память, регистр+память=регистр. Существуют четыре мнемокода команды сложить: ADD - сложение слов, ADDB - сложение байтов, ADDI - сложение с 16-разрядной константой, ADDBI - сложение с 8-разрядной константой.
Команда INC увеличивает на "1" содержимое указанного в ней регистра или слова памяти. Команда INCB увеличивает на "1" байт памяти. Команда DEC уменьшает на "1" содержимое указанного в ней регистра или слова памяти. Команда DECB уменьшает на "1" байт памяти. Логические команды и команды обработки разрядов. Первые реализуют булевские операции И, ИЛИ, НЕ и позволяют установить в "1" или сбросить в "0" произвольный разряд в байте, расположенном в регистре или памяти. Как показано на рис. 8.12, б, в результате выполнения логических операций четыре старших разряда 20-разрядного регистра-приемника остаются неопределенными. Отметим также, что если регистр является приемником при операциях над байтами, то значения разрядов 8 - 15 заполняются значением старшего седьмого разряда результата. Команда AND выполняет поразрядное логическое умножение операндов источника и приемника, размещая результат на место приемника. Имеются следующие команды логического умножения: AND - логическое И для слов; ANDB - логическое И для байтов; ANDI - логическое И с 16-разрядной константой; ANDBI - логическое И с 8-разрядной константой. Команда OR выполняет поразрядное логическое сложение операндов источника и приемника, размещая результат на место операнда приемника. Имеется четыре типа команды логического сложения: OR - логическое ИЛИ для слов; ORB - логическое ИЛИ для байтов; ОК1 - логическое ИЛИ с 16-разрядной константой; ORBI - логическое ИЛИ с 8-разрядной константой. Команда NOT инвертирует все разряды в операнде. В командах может быть указан либо один, либо два операнда. Если указан единственный операнд, то инвертированный результат размещается на месте этого операнда в памяти или регистре. Если указаны два операнда, то инвертируемые разряды источника пересылаются на место приемника (который должен быть регистром), а источник сохраняет первоначальное значение. Для байтов и слов имеются отдельные мнемокоды: NOT - логическое НЕ слова; NOTB - логическое НЕ байта. Напомним, что команда NOT в сочетании со следующей за ней командой INC позволяет получить двоичный дополнительный код отрицательного числа. Команды установки разрядов SETB и сброса CLR имеют формат вида: SETB-приемник, номер разряда и CLR-приемник, номер разряда. Номер разряда от 0 до 7, указанный в этих командах, устанавливается в "1> или "0" соответственно. Команды передачи управления. Служат для изменения значения указателя задания TP путем прибавления к его содержимому смещения со знаком. Величина смещения содержится в команде передачи управления и ее длина может равняться 8 или 16 разрядам. Так 8-разрядное смещение обеспечивает передачу управления в пределах от -128 до + 127 байт, а 16-разрядное - в пределах от - 32768 до +32767 байт. Команда с 8-разрядным смещением называется короткой, а команда с 16-разрядным смещением называется длинной командой перехода и ее мнемокод начинается с буквы L. Ниже приведены все команды передачи управления:
JMP/LJMP label - безусловный переход
CALL/LCALL addr ret, label - вызов подпрограммы
JZ/LJZ src, 1аbе1 - переход по нулю слова
JZB/LJZB src, label - переход по нулю байта
JNZ/LJNZ src, label - переход по не нулю слова
JNZB/LJNZB src, label - переход по не нулю байта
JMCE/LJMCE src, label - переход по равно при сравнении
JMCNE/LJMCNE src, label - переход по не равно при сравнении
JBT/LJBT src, bit, label - переход по равенству разряда "1"
JNBT/LJNBT src, bit,1аbе1- переход по равенству разряда "0"
Команда JMP (LJMP) вызывает безусловный переход по указанному адресу. Команда САLL (LCALL) служит для перехода на подпрограмму с одновременным сохранением текущего значения регистра TP по указанному в команде адресу сохранения. Для возврата из подпрограммы в ней может быть использована команда MOVP TP,addr, возвращающая в регистр TP сохраненное ранее значение. Следует отметить, что средства разработки программ в ПВВ менее гибкие, чем в центральном процессоре. Основное отличие состоит в том, что ПВВ не имеет встроенного стекового механизма. Программы ПВВ могут реализовать стек, используя базовый регистр в качестве указателя стека. С другой стороны, поскольку работа программы канала не подвержена прерываниям, для большинства программ канала стек не требуется. Команды условных переходов вызывают передачу управления по указанному в них адресу, если для операнда источника выполняется указанное условие, в противном случае выполняется следующая команда. В качестве источника может использоваться как память, так и регистр. Если операндом-источником является регистр, то опрашиваются только 16 младших разрядов, а старшие 4 разряда игнорируются. Для опроса младшего байта регистра следует обнулить разряды с 8-ro по 15-й, а затем использовать команду, предназначенную для слов. Отметим, что команды JMCE/LJMCE и JMCNE/LJMCNE требуют предварительной загрузки регистра МС сравниваемым числом и маской (см. рис. 8.4). Команды управления процессором ввод-вывода. Позволяют программам каналов управлять ПВВ с помощью сигналов LOCK, SINTRl, SINTR2, задавать требуемую ширину шин и активизировать пересылки с ПДП. Команда TSL addr, data, label - опрос и установка с монополизацией, используется для организации доступа к общей базе данных в многопроцессорных системах. Значение addr указывает адрес ячейки памяти, выполняющей функции семафора, значение data соответствует константе, запрещающей доступ к общей базе данных, а значение label указывает адрес перехода в случае, когда доступ запрещен. Операции, выполняемые по команде TSL, проиллюстрированы на рис. 8.13.
Если значение label совпадает с адресом команды TSL, то она выполняется циклически до тех пор, пока содержимое ячейки памяти с адресом addr не станет равным нулю. Таким образом, программа канала будет ожидать разрешения доступа к общей базе данных.
Команда WID - установка ширины логической шины, изменяет состояние нулевого и первого разрядов в слове-состоянии программы PSW. Она задает ширину логических шин для пересылки с ПДП. Формат команды следующий: WID - ширина шины источника, ширина шины приемника, где операнды могут указывать как 8, так и 16 разрядов. Единственное ограничение состоит в том, что логическая ширина шины не может превосходить ее физическую ширину. После подачи сигнала RESET ширина логических шин не определена, вследствие этого перед первой пересылкой должна быть выполнена команда WID. После этого логическая ширина шин остается неизменной вплоть до выполнения следующей команды WID или до очередной подачи сигнала RESET на ПВВ. Рис. 8.13. Операции выполняемые по команде TSL
Команда XFER - вхождение в режим пересылки с ПДП после выполнения следующей (за XFER) команды. Эта команда не имеет операндов и служит для подготовки канала к операциям пересылки с ПДП. При синхронизованной пересылке команда, следующая за XFER, может подготовить синхронизующее устройство, например послать команду пуск или последний из серии параметров. За командой XFER может следовать любая команда, включая WID, кроме команды, изменяющей содержимое регистров GA, GB или GC. Команда SINTR устанавливает разряд обработки прерываний в слове-состояния программы PSW и активизирует сигнал SINTR соответствующего канала, если разряд обработки прерываний в PSW был установлен. Если разряд управления прерываниями был сброшен (прерывания от этого канала были запрещены), то разряд обработки прерываний устанавливается в "1", а сигнал SINTR не активизируется. Программа канала может использовать эту команду для запроса прерываний у ЦП. Команда HLT завершает программу канала. По этой команде канал сбрасывает флаг занятости и переходит в пассивное состояние. Команда NOP соответствует пустой операции и выполняется в течение четырех тактов.
В заключение напомним, что все команды, работающие с операндами, не делают различий между адресами памяти и адресами ВУ. Поэтому они могут оперировать данными как из системного пространства, так и из пространства ввода-вывода.
Сочетание скорости контроллера ПДП, набора команд, ориентированного на ввод-вывод, а также гибкости организации шин делает ПВВ универсальной системой ввода-вывода.
8.4. Процессор операционной системы
По мере совершенствования технологии производства микросхем появилась возможность размещать на кристалле системные средства, необходимые для реализации высокопроизводительных специализированных ВМ. Примером такой микросхемы является Intel 80130, которая совместно с ЦП, работающим в максимальном режиме образует то, что фирма Intel называет процессором операционной системы. Архитектура этой микросхемы представлена на рис. 8.14.
Рис. 8.14. Архитектура микросхемы Intel 80130
В этой ОС имеются три заблокированных состояния: пассивное, приостановленнос и пассивно-приостановленное. Система характеризуется тем, что управляет событиями, а временная зависимость заключается в том, что процесс может быть переведен в пассивное состояние на определенное время. Изменения состояний вызываются программными приказами, которые называются системными вызовами и реализуются с помощью программных прерываний или автоматически после возникновения определенных событий.
Рис. 8.15. Состояния процессов
Возможные изменения показаны стрелками и дугами, причем номера стрелок на рис. 8.15 соответствуют номерам следующих действий:
1. Процесс входит в систему, когда он создается системным вызовом CREATE TASK. 2. Процесс переводится из состояния готовности в состояние выполнения, когда: его приоритет выше приоритета выполняемого процесса; выполняемый процесс переводится в пассивное или приостановленное состояние, если приоритет процесса в состоянии готовности столь же высок, как и приоритет любого другого процесса в состоянии готовности, но сам процесс находился в очереди готовности дольше любого процесса с равным приоритетом. 3. Процесс переводится из состояния выполнения в состояние готовности, когда выполняемый процесс должен уступить ЦП процессу с большим приоритетом, находящимся в состоянии готовности. 4. Процесс переводится из состояния выполнения в пассивное состояние, если выполняемый процесс встречает системный вызов SLEEP или должен ожидать информации, которую он запросил, но которая пока недоступна. В первом случае временное ограничение указывается в вызове SLEEP а во втором процесс должен выразить готовность ожидать запрошенную информацию (через системный вызов). 5. Процесс переходит из пассивного состояния в состояние готовности или из пассивно-приостановленного состояния в приостановленное, когда истекает интервал ожидания, указанный в вызове SLEEP, или когда удовлетворяется запрос процесса. б. Процесс переходит из состояния выполнения в приостановленное состояние, когда выполняемый процесс приостанавливает себя, выполняя системный вызов SUSPEND TASK. Кроме того, глубина приостановки для процесса устанавливается равной 1. 7. Процесс переводится из состояния готовности в приостановленное состояние или из пассивного состояния в пассивно-приостановленное, когда другой процесс определяет его в системном вызове SUSPEND TASK. Кроме того, его глубина приостановки устанавливается равной 1. 8. Состояние приостановленного или пассивно-приостановленного процесса не изменяется, но производится инкремент его глубины приостановки, когда выполняемый процесс реализует вызов SUSPEND TASK, определяющий процесс. Аналогично осуществляется декремент глубины приостановки приостановленного процесса, когда реализуется вызов RESUME TASK. 9. Приостановленный (пассивно-приостановленный) процесс переводится в состояние готовности (в пассивное состояние), если его глубина приостановки становится равной О. 10. Процесс выходит из системы, если он указан в системном вызове DELETE TASK. Отметим, что в данной ОС приоритеты имеют не только процессы, находящиеся в состоянии готовности. Процессам, находящимся в приостановленном или пассивно-приостановленном состоянии, также назначаются приоритеты в соответствии с их глубинами приостановки. На рис. 8.16 показано выполнение процессов 1, 2 и 3 под управлением операционной системы. Предполагается, что все три процесса находятся в системе, причем процесс 1 имеет наивысший приоритет, а процессы 2 и 3 имеют одинаковые, но меньшие приоритеты. Предполагается также, что первоначально процесс 2 находился в состоянии готовности дольше процесса 3. Сплошные линии показывают, какой процесс находится в состоянии выполнения. Рис. 8.16. Действия под управлением ОС
Кроме управления состояниями процессов системные вызовы используются для создания и удаления различных объектов, выполнения операций, необходимых для многозадачных приложений. Ниже приведены примеры подобных системных вызовов.
Объекты: задачи (TASK), задания (JOB) , сообщения (MAILBOX), области памяти (REGION), сегменты памяти (SEGMENT). Операции: создать (CREATE), удалить (DELETE), послать (SEND), установить (SET), разрешить (ENABLE) и т. д.
Между процессами с помощью системных вызовов можно реализовать три способа взаимодействия: • обмен информацией (MAILBOX): CREATE MAILBOX, DELETE MAILBOX, SEND MESSAGE, RECEIVE MESSAGE;
• взаимоисключения (SUSPEND): SUSPEND TASK , RESUME TASK, SET PRIORITY;
• синхронизация (SEND CONTROL), SLEEP, SEND CONTROL, RECEIVE CONTROL, ACCEPT CONTROL, WAIT INTERRUPT, SIGNAL INTERRUPT.
Для выполнения операций динамического выделения памяти можно использовать: CREATE SEGMENT, DELETE SEGMENT, CREATE REGION, DELETE REGION, SEND CONTROL, RECEIVE CONTROL.
Для управления прерываниями: INTERRUPT ENABLE, INTERRUPT DISABLE, SET LEVEL, GET LEVEL, WAIT INTERRUPT, RESET INTERRUPT, EXIT INTERRUPT, SIGNAL INTERRUPT.
Как уже упоминалось, системные вызовы реализованы с помощью программных прерываний и параметры передаются в вызванную процедуру прерывания и из нее через стек. Фрагмент для удаления задачи имеет следующий вид:
push TASK_NO push EXCPT_PTR mov bp, sp lea si, ss[bp+ 2] mov ax,201h int 184.
Здесь 201h и 184 представляют собой соответственно код входа и тип прерывания, соответствующие системному вызову DELETE TASK. Число 184 обозначает выполняемую процедуру прерывания, а код входа показывает этой процедуре, что необходимо произвести удаление. Предполагается, что TASK_N0 содержит номер удаляемого процесса, а ЕХСРТ_PTR - указатель процедуры, которая выполняется, если при удалении возник особый случай. Процедура прерывания для доступа к стеку использует регистры bp и si. Контрольные вопросы
1. В чем заключается основное назначение процессора ввода-вывода?
2. Опишите назначение регистров сборки-разборки.
3. Какие поля образуют регистр управления каналом и как они используются для управления пересылкой ПДП?
4. Каким образом ЦП осуществляет взаимодействие с каналами ПВВ для передачи заданий на обработку ввода-вывода?
5. Какие регистры образуют программную модель ПВВ? Приведите пример использования каждого регистра.
6. Какой тип пересылок не могут осуществлять каналы ПВВ?
7. В чем основные отличия языка ASM-89 от ASM-86?
8. Какая команда осуществляет старт пересылки ПДП и в чем особенность ее исполнения?
9. Объясните особенности переходов между состояниями задачи в ОС реального времени.
10. Опишите структуру управления каналами ввода-вывода.
11. Назовите назначение внешних сигналов SINTR, EXT и DRQ.
12. Как осуществляется начальная инициализация канала?
13. Какая команда удобна для реализации семафора? Приведите пример ее использования.
14. Для чего используется маскированное сравнение?
15. Почему у регистра РР нет соответствующего ему разряда TAG?
16. Для чего служит TAG регистр?
17. Объясните назначение полей регистра управления каналом СС.
18. Как можно осуществлять пересылку ПДП с одновременным перекодированием?
19. Для чего служит слово-состояние программы PSW?
20. Как реализуются переходы по окончании ПДП для разных причин окончания?
21. Что понимается под процессором операционной системы?
22. Что такое внешнее событие?
23. Какой узел служит для обработки большого числа внешних событий?
24. Чем отличаются пассивное и приостановленное состояния процесса?
25. Назовите директивы используемые для координации процессов.
26. С какой целью используется директива DELETE?
27. При каком условии процесс может выйти из приостановленного состояния?
Раздел 9. Назначение и топология сетей
9.1. Особенности и назначение сетей различных типов
Организация и топология компьютерной сети непосредственно зависят от ее назначения. Наиболее очевидны различия в организации сетей разных масштабов. Принято различать сети:
* домашние (квартира, коттедж) - HAN (Home Area Net),
* локальные (комната, здание, комплекс зданий) - LAN (Local Area Net),
* муниципальные (город, область) - MAN (Metropolitan Area Net),
* глобальные (страна, материк) - GAN (Global Area Net).
Для сетей разных масштабов свойственны разные способы организации. Одна из главных причин - качество линий передачи данных - с увеличением масштаба сети диапазон используемых скоростей передачи смещается вниз. Кроме того, в случае локальных сетей, высокие скорости передачи данных позволяют использовать такие варианты организации и режимы работы сети, которые не применимы в глобальных сетях, по крайней мере, на сегодняшний день. Так, из двух основных режимов передачи данных - широковещательного и "точка-точка", первый широко используется в локальных сетях, а второй - в глобальных.
Особенности локальных сетей.
Важной особенностью локальных сетей является обязательное наличие администратора сети. Среди задач администратора следует выделить четыре основных:
• надежное функционирование сети (Reliability);
• защита от сбоев электропитания (использование UPS);
• защита данных (использование Disk Arrays);
• разграничение прав доступа (назначение Privileges).
Под топологией (компоновкой, конфигурацией, структурой) сети обычно понимается физическое расположение компьютеров сети друг относительно друга и способ соединения их линиями связи. Важно отметить, что понятие топологии относится прежде всего к локальным сетям, в которых структуру связей можно легко проследить. Топология определяет требования к оборудованию, тип используемого кабеля (или спектра сигнала), возможные и наиболее удобные методы управления обменом, надежность работы, возможности расширения сети.
Существует три "классических" топологии сети:
* шина (bus), при которой все компьютеры параллельно подключаются к одной линии связи и информация от каждого компьютера одновременно передается всем остальным компьютерам; * звезда (star), при которой к одному центральному компьютеру присоединяются остальные периферийные компьютеры, причем каждый из них использует свою отдельную линию связи;
* кольцо (ring), при которой каждый компьютер передает информацию всегда только одному компьютеру, следующему в цепочке, а получает информацию только от предыдущего в цепочке компьютера, и эта цепочка замкнута в "кольцо".
Каждая из топологий поддерживается необходимым оборудованием, имеет свои преимущества и недостатки.
Топология "шина".
Топология "шина" своей структурой предполагает идентичность сетевого оборудования компьютеров и равноправие всех абонентов сети. При таком соединении компьютеры могут передавать данные только по очереди. При одновременной передаче информация будет искажаться в результате наложения (коллизии). Поэтому здесь реализуется режим полудуплексного (half duplex) обмена (в обоих направлениях, но по очереди, а не одновременно).
Этой топологии не страшны отказы отдельных компьютеров, так как все остальные компьютеры сети могут нормально продолжать обмен, однако из-за особенностей распространения электрических сигналов по линиям связи при повреждении кабеля прекращается обмен даже между теми компьютерами, которые остались соединенными между собой. Короткое замыкание в любой точке кабеля шины выводит из строя всю сеть. При прохождении по линии связи сети с топологией "шина" информационные сигналы ослабляются, поэтому для увеличения длины сети часто используют несколько сегментов, соединенных между собой с помощью специальных восстановителей сигналов - репитеров, или повторителей.
Топология "звезда".
"Звезда" - это топология с выделенным центром, к которому подключаются все остальные абоненты сети. Весь обмен информацией идет только через центральный компьютер и его сетевое оборудование сложнее, чем оборудование периферийных абонентов. Никакие конфликты в сети с топологией "звезда" в принципе невозможны, так как управление полностью централизовано. Ясно, что выход из строя периферийного компьютера никак не отразится на функционировании оставшейся части сети, зато любой отказ центрального компьютера делает сеть полностью неработоспособной. В данной топологии на каждой линии связи находятся только два абонента: центральный и один из периферийных. Обычно, для их соединения используется две линии связи, каждая из которых передает информацию только в одном направлении. Таким образом, на каждой линии связи имеется один приемник и один передатчик. Звезда, показанная на рис. 9.1, носит название пассивной звезды, где в центре помещается не компьютер, а концентратор (hub), выполняющий ту же функцию, что и репитер. Фактически здесь мы имеем дело с шинной топологией, так как информация от каждого компьютера одновременно передается ко всем остальным компьютерам, а центрального абонента не существует. В последнее время пассивная звезда все больше вытесняет истинную шину.
Рис. 9.1. Топология пассивная "звезда"
Для локальных сетей в качестве кабельных сред передачи данных используются коаксиальный кабель, витая пара или оптоволоконный кабель. При этом кроме повторителей и концентраторов может использоваться следующее сетевое оборудование:
* мосты (bridge) - для объединения локальных сетей и изоляции внутреннего трафика подсетей;
* коммутаторы (switch) - для высокоскоростного одновременного соединения нескольких пар абонентов;
* маршрутизаторы (router) - для управления путями передачи данных в сегментированных сетях.
Ethernet - самая распространенная технология используемая при создании локальных сетей. Технологии Ethernet, Fast Ethernet, Gigabit Ethernet обеспечивают скорость передачи данных соответственно 10, 100 и 1000 Мбит/с. Все технологии используют один метод доступа - CSMA/CD (Carrier Sense Multiply Access with Collision Detection), одинаковые форматы кадров, работают в полу- и полнодуплексном режимах. Метод предназначен для среды, разделяемой всеми абонентами сети. Для реализации беспроводных сред передачи данных Wi-Fi (Wireless Fidelity) используется стандарт RadioEthernet IEEE 802.11, при котором абоненты также имеют равноправный доступ к общему каналу передач. Подобно проводному Ethernet, стандарт определяет протокол использования единой среды передачи CSMA/CD. Вероятность коллизий беспроводных узлов минимизируется путем предварительной посылки короткого сообщения, называемого ready to send (RTS), оно информирует другие узлы о продолжительности предстоящей передачи и адресате. Это позволяет другим узлам задержать передачу на время, равное объявленной длительности сообщения. Приемная станция должна ответить на RTS посылкой clear to send (CTS). Это позволяет передающему узлу узнать, свободна ли среда и готов ли приемный узел к приему. После получения пакета данных приемный узел должен передать подтверждение (ACK) факта безошибочного приема. Если ACK не получено, попытка передачи пакета данных будет повторена. Особенности глобальных сетей. На рис. 9.2 изображена структура глобальной сети, включающей в свой состав маршрутизаторы и линии связи, а также объединяющая отдельные узлы, локальные и муниципальные сети. Фактически, глобальная сеть образована оборудованием, которое на рис. 9.2 выделено в подсеть.
Рис. 9.2. Структура глобальной сети
Отдельные компьютеры (узлы GAN) принято называть хостами. Задачей подсети является передача сообщений от хоста к хосту. Большинство глобальных сетей содержит большое количество линий связи, соединяющих между собой маршрутизаторы. Сообщения разбиваются на отдельные части - пакеты (или дейтаграммы), которые пересылаются по адресу получателя. Когда пакет пересылается через несколько промежуточных маршрутизаторов, он получается каждым промежуточным маршрутизатором и хранится на нем, пока требуемая линия связи не освободится. Подсеть, работающая так, называется подсетью с промежуточным хранением (store-and-forward) или подсетью с коммутацией пакетов (packet-switched). Продвижением потока пакетов занимаются маршрутизаторы и каждый "сам" решает куда направить очередной пакет. Используемый метод принятия такого решения называется алгоритмом маршрутизации. Существует большое число алгоритмов маршрутизации.
Не все глобальные сети используют коммутацию пакетов. Можно соединять маршрутизаторы глобальной сети с использованием радиосвязи, в частности через спутники.
9.2. Кодирование информации
Используемый способ кодирования информации зависит в первую очередь от среды передачи информации. Существуют следующие среды:
• коаксиальные кабели (coaxial cable); • кабели на основе витых пар (twisted pair) - экранированные (shielded twisted pair, STP) и неэкранированные (unshielded twisted pair, UTP);
• оптоволоконные кабели (fiber optic);
• бескабельные каналы передачи информации. Кодирование передаваемой по сети информации имеет самое непосредственное отношение к соотношению максимально допустимой скорости передачи и пропускной способности используемой среды передачи. Например, при разных кодах предельная скорость передачи по одному и тому же кабелю может отличаться в два раза. От выбранного кода прямо зависят также сложность сетевой аппаратуры и надежность передачи информации. В табл. 9.1 приведены типы кабелей для организации одной из наиболее популярной в настоящее время топологии Fast Ethernet (100 Мбит/сек).
Таблица 9.1
НазваниеТипДлина сегментаОсобенности100Base-T4Витая пара100 мИспользование неэкранированной витой пары категории 3
100Base-TХВитая пара100 мПолный дуплекс при 100 Мбит/сек (витая пара категории 5)
100Base-FXОпто-волокно2000 мПолный дуплекс при 100 Мбит/сек; большая длина сегмента
Некоторые коды, используемые в сетях, показаны на рис. 9.3. Код NRZ (Non Return to Zero - без возврата к нулю) - это простейший код, к достоинствам которого относится простая реализация и минимальная среди других кодов пропускная способность линии связи, требуемая при данной скорости передачи. Недостатком кода NRZ является возможность потери синхронизации приемником при приеме слишком длинных пакетов. Приемник может привязывать момент начала приема только к первому (стартовому) биту пакета, а в течение приема пакета он может пользоваться только внутренним тактовым генератором.
Манчестерский код, получил наибольшее распространение в локальных сетях и относится к самосинхронизирующимся кодам. Логическому нулю соответствует положительный переход в центре периода (то есть первый полупериод - низкий уровень, второй - высокий), а логической единице соответствует отрицательный переход в центре периода. Именно наличие перехода в центре периода обеспечивает самосинхронизацию, что дает возможность передавать информацию сколь угодно большими пакетами без потерь из-за рассинхронизации. Рис. 9.3. Распространенные коды передачи информации
Достоинство манчестерского кода - отсутствие постоянной составляющей (половину периода сигнал положительный, половину - отрицательный). Если же один из уровней сигнала в манчестерском коде нулевой (как, например, в сети Ethernet), то величина постоянной составляющей в течение передачи будет равна примерно половине амплитуды сигнала. Это позволяет легко фиксировать столкновения пакетов в сети (коллизию) по отклонению величины постоянной составляющей. При манчестерском кодировании очень просто определить, идет передача или нет, то есть детектировать занятость сети. Для этого достаточно контролировать, происходит ли изменение сигнала в течение битового интервала. Обнаружение несущей частоты необходимо, например, для определения момента начала и конца принимаемого пакета, а также для предотвращения начала передачи в случае занятости сети (когда передает какой-то другой абонент). Код RZ (Return to Zero - с возвратом к нулю), в отличие от рассмотренных, является трехуровневым: после значащего уровня сигнала в первой половине периода следует возврат к "нулевому" уровню в середине каждого периода. Логическому нулю, таким образом, соответствует положительный импульс, логической единице - отрицательный в первом полупериоде. Благодаря наличию перехода в центре периода, код RZ также является самосинхронизирующимся.
Недостаток кода RZ состоит в том, что для него требуется вдвое большая полоса пропускания канала при той же скорости передачи по сравнению с NRZ (так как здесь на один бит приходится два изменения уровня напряжения). Код RZ применяется не только в сетях на основе электрического кабеля, но и в оптоволоконных сетях. Поскольку в них не существует положительных и отрицательных уровней сигнала, используется три уровня: отсутствие света, "средний" свет, "сильный" свет. Это очень удобно: даже когда нет передачи информации, свет все равно присутствует, что позволяет легко определить целостность оптоволоконной линии связи. Для увеличения пропускной способности канала связи с узкой полосой пропускания, например по телефонным линиям в глобальных сетях, применяется модуляция информационными импульсами высокочастотного аналогового сигнала. При прохождении по каналу связи аналогового сигнала (синусоидального) не искажается форма сигнала, а только уменьшается его амплитуда, а в случае цифрового сигнала еще и искажается форма сигнала.
К самым простым видам аналогового кодирования относятся: * амплитудная модуляция (AM), при которой логической единице соответствует наличие сигнала, а логическому нулю - его отсутствие (или сигнал меньшей амплитуды), частота сигнала остается постоянной; * частотная модуляция (ЧМ), при которой логической единице соответствует сигнал более высокой частоты, а логическому нулю - сигнал более низкой частоты (или наоборот), амплитуда сигнала остается постоянной; * фазовая модуляция (ФМ), при которой смене логического нуля на логическую единицу и логической единицы на логический нуль соответствует резкое изменение фазы синусоидального сигнала одной и той же частоты и амплитуды. Чаще всего аналоговое кодирование используется в глобальных сетях. В локальных сетях оно применяется редко из-за необходимости использования кодирующего и декодирующего оборудования.
9.3. Назначение и структура пакетов
Сообщения в сетях, передаются не целиком, а отдельными частями, называемыми пакетами (кадрами, блоками). Использование пакетов позволяет разделить во времени сеть между передающими информацию абонентами. Длина пакета зависит от типа сети, но обычно она составляет от нескольких десятков байт до нескольких килобайт. Существует некоторая оптимальная длина пакета (или оптимальный диапазон длин пакетов), при которой скорость обмена информацией по сети будет максимальна. Оптимальная длина не является неизменной величиной, она зависит от уровня помех, метода управления обменом, количества абонентов сети, характера передаваемой информации и многих других факторов. Структура пакета зависит от аппаратурных особенностей сети, ее топологии, среды передачи информации и определяется используемым протоколом. Существуют некоторые общие принципы формирования пакета, определяемые характерными особенностями обмена информацией по любым сетям, типовая структура представлена на рис. 9.4.
Рис. 9.4. Типичная структура пакета
Стартовая комбинация обеспечивает настройку сетевого адаптера на прием и обработку пакета. Это поле может отсутствовать или сводиться к одному-единственному стартовому биту. Адрес приемника позволяет принимающему абоненту распознать пакет, адресованный ему лично (передача точка-точка), группе, которую он адресует, или всем абонентам сети одновременно (широковещательная передача). Адрес источника информирует принимающего абонента, откуда пришел данный пакет.
Управляющая информация является служебной и указывает на тип пакета, его номер, размер, формат, маршрут доставки, на то, что с ним надо делать приемнику и т.п. Данные содержат непосредственно часть того сообщения, которое требуется передать. Существуют специальные управляющие пакеты, которые не имеют поля данных и используются как сетевые команды. В отличие от управляющих, пакеты включающие поле данных, называются информационными пакетами. Контрольная сумма пакета - это кодовая комбинация, формируемая передатчиком по определенным правилам и содержащая в сжатом виде информацию о пакете. Приемник, повторяя вычисления, сделанные передатчиком, с принятым пакетом, сравнивает их результат с контрольной суммой и делает вывод о правильности или ошибочности передачи пакета. Стоповая комбинация служит для информирования сетевого адаптера приемника об окончании пакета, обеспечивает выход аппаратуры приемника из состояния приема.
Часто в структуре пакета выделяют всего три поля: * заголовок (стартовая комбинация, адрес приемника, адрес источника, управляющая информация);
* данные;
* трейлер (контрольная сумма, стоповая комбинация).
В процессе сеанса обмена информацией по сети между передающим и принимающим абонентами происходит обмен информационными и управляющими пакетами по установленным правилам, называемым протоколом обмена. Рис. 9.5. Обмен пакетами при сеансе связи
Пример простейшего протокола показан на рис. 9.5 и в табл. 9.2. Сеанс связи начинается с запроса готовности сервера на соединение. В случае готовности он посылает в ответ управляющий пакет "Подтверждение соединения". Затем начинается передача данных. При этом на каждый полученный от клиента "Запрос данных" сервер выдает соответствующий "Ответ". Заканчивается сеанс управляющими пакетами "Разрыв соединения". Существует множество стандартных протоколов, которые используют как передачу с подтверждением (с гарантированной доставкой пакета), так и передачу без подтверждения (без гарантии доставки пакета). Таблица 9.2
Системный вызов Оказываемое действие LISTEN (ожидание) Блок ожидает входящего соединения CONNECT (соединение) Установление соединения RECEIVE (прием) Блок ожидает входящего сообщения SEND (отправка) Отправка сообщения DISCONNECT (разрыв) Разрыв соединения При реальном обмене по сети используются многоуровневые протоколы, каждый из которых предполагает свою структуру кадра (свою адресацию, свою управляющую информацию, свой формат данных и т.д.).
Рис. 9.6. Многоуровневое вложение (инкапсуляция) пакетов
Все пакеты более высоких уровней последовательно вкладываются в передаваемый пакет, точнее, в поле данных передаваемого пакета (рис. 9.6). Каждый следующий вкладываемый пакет содержит свой собственный заголовок и трейлер.
9.4. Методы управления обменом
Сеть объединяет несколько абонентов, каждый из которых имеет право передавать свои сообщения, разделенные на пакеты. Но по одному кабелю не может одновременно передаваться даже два пакета, произойдет коллизия, которая приведет к потере обоих пакетов. Для устранения коллизий в любой сети применяется метод управления обменом (метод доступа, метод арбитража), разрешающий или предотвращающий конфликты между абонентами. От выбранного метода зависит скорость обмена информацией и нагрузочная способность сети. Методы управления обменом делятся на две группы.
* Централизованные методы, при которых все управление сосредоточенно в одном месте. Недостатки: неустойчивость к отказам центра, малая гибкость управления. Достоинство - отсутствие конфликтов. * Децентрализованные методы, при которых отсутствует центр управления. Главные достоинства: высокая устойчивость к отказам и большая гибкость. Недостаток - возможны конфликты. В свою очередь децентрализованные методы можно также разделить на две группы.
* Случайные методы подразумевают случайное чередование передающих абонентов. В этом случае возможность конфликтов подразумевается, но предлагаются способы их разрешения. Случайные методы работают хуже, чем детерминированные, при больших информационных потоках в сети (при большом трафике сети) и не гарантируют абоненту величину времени доступа (это интервал между возникновением желания передавать и получением возможности передать свой пакет). Пример случайного метода - CSMA/CD. * Детерминированные методы определяют четкие правила, по которым чередуются захватывающие сеть абоненты. При этом, как правило, конфликты полностью исключены (или маловероятны). К детерминированным методам относится, например, маркерный доступ, при котором право передачи передается по эстафете от абонента к абоненту. Суть централизованных методов состоит в том, что один, центральный компьютер предоставляет право передачи пакетов абонентам сети. Способ, с помощью которого центральный компьютер узнает о "желании" передать пакет конкретным абонентом, может быть различным. Либо абоненты посылают центру свои запросы на передачу, либо центр в определенной очередности опрашивает абонентов о "желании" передать. В любом случае никаких конфликтов не происходит, Если все абоненты очень активны и заявки на передачу поступают интенсивно, то все они будут передавать по очереди. При случайном децентрализованном управлении решение о том, когда можно передавать свой пакет, принимается каждым абонентом, исходя только из анализа состояния сети. В данном случае существует конкуренция между абонентами за захват сети и, следовательно, возможны конфликты между ними и искажения передаваемых данных из-за наложения пакетов. Суть всех случайных методов управления обменом довольно проста. Пока сеть занята, то есть по ней идет передача пакета, абонент, желающий передавать, ждет освобождения сети. Ведь в противном случае неминуемо исказятся и пропадут оба пакета. После освобождения сети абонент, желающий передавать, начинает свою передачу. Если одновременно с ним начали передачу еще несколько абонентов, то возникает коллизия (конфликт, столкновение пакетов). Конфликт этот детектируется всеми абонентами, передача прекращается, и через некоторое время предпринимается повторная попытка передачи. При этом не исключены повторные коллизии и новые попытки передать свой пакет. И так продолжается до тех пор, пока пакет не будет передан без коллизий. Существует несколько разновидностей случайных методов управления обменом. В некоторых из них каждый абонент начинает свою передачу после освобождения сети не сразу, а выдержав свою, строго индивидуальную задержку. Примером может служить ненастойчивый метод управления обменом CSMA/CD, используемый в самой популярной сети Ethernet. Протокол CSMA с настойчивостью p применяется в дискретных каналах и работает следующим образом. Когда абонент готов передать пакет, он опрашивает канал. Если канал свободен, он начинает передачу с вероятностью p. С вероятностью q = 1 - p он отказывается от передачи и ждет следующего такта. Этот процесс повторяется до тех пор, пока пакет не будет передан или какой-либо другой абонент не начнет передачу. В последнем случае абонент ведет себя так же, как в случае коллизии. Он ждет в течение случайного интервала времени, после чего начинает все снова.
Понятно, что все подобные методы будут хорошо работать только при не слишком большой интенсивности обмена по сети. Считается, что приемлемое качество связи обеспечивается только при нагрузке не выше 30-40% (то есть сеть занята не более 30-40% всего времени). Рис. 9.7. Протокол с двоичным обратным отсчетом
Детерминированные методы используют протоколы, позволяющие абонентом "договориться" между собой о порядке использования линии и, тем самым, избежать коллизий. Примером может служить протокол с двоичным обратным отсчетом (рис. 9.7). Каждой рабочей станции назначается некоторый двоичный виртуальный адрес. В период конкуренции за канал, в каждый отсчет времени объединяются по ИЛИ соответствующие разряды виртуального адреса, начиная со старшего разряда. Если результатом является "1", то все станции, у которых в данном разряде "0" - сдаются и в дальнейшей конкуренции не участвуют. На рис. 9.4 у таких станций проставлен прочерк. Во втором отсчете времени сдалась станция 1001 и победителем стала станция с наибольшим виртуальным номером 1010. Она и осуществляет передачу пакета, после чего начнется новый цикл торгов. Для того, чтобы приоритет в предоставлении линии не зависел от номера n станции можно после каждой удачной передачи пакета, присвоить ей новый виртуальный номер 0, а приоритеты всех станций с приоритетами меньшими n сдвинуть на единицу.
9.5. Эталонные модели
Прообразом самой популярной сети Интернет послужила разработка, начатая Министерством обороны США (DoD - Department of Defence) еще в 1957 году. Перед управлением перспективного планирования научно-исследовательских работ (ARPA - Advanced Research Project Agency) была поставлена задача разработать архитектуру высоконадежной распределенной сети. В то время военные телекоммуникации базировались на общественной телефонной сети, которая была сочтена слишком уязвимой. Уязвимость заключалась в том, что потеря всего одного коммутатора или междугородной станции (рис. 9.8) разделила бы сеть на разрозненные участки.
Рис. 9.8. Структура телефонной сети и архитектура распределенной сети
Экспериментальную сеть ARPPANET, объединяющую четыре университета, удалось запустить только в 1969 году. После ее запуска было выяснено, что имеющиеся протоколы были непригодны. В результате дополнительных экспериментальных и теоретических исследований были изобретены модели и протоколы TCP/IP для управления обменом пакетами по интерсетям, которые по сути являются основными в Интернет. На базе ARPANET объединение сетей происходило высокими темпами. Достаточно сказать, что высокий прирост абонентов сети в 80-е годы заставил разработать службу именования доменов DNS (Domain Name System), которая также по сей день обслуживает Интернет.
Эталонная модель TCP/IP включает протоколы, которые активно используются сейчас. Верхний уровень занимают протоколы:
* Telnet - Протокол передачи символьных данных;
* FTP - File Transfer Protocol - Протокол передачи файлов;
* SMTP - Simple Mail Transfer Protocol - Простой протокол пересылки почты;
* DNS - Domain Name System - Служба именования доменов;
на следующем уровне расположены:
* TCP - Transmission Control Protocol - Протокол управления передачей;
* UDP - User Datagram Protocol - Пользовательский протокол дейтаграмм;
и, наконец, на нижнем:
* IP - Internet Protocol - Межсетевой протокол.
Эталонная модель OSI.
В настоящее время наибольшее распространение получила эталонная модель обмена информацией открытой системы OSI (Open System Interchange). Под термином "открытая система" в данном случае понимается незамкнутая в себе система, имеющая возможность взаимодействия с какими-то другими системами (в отличие от закрытой системы). Модель OSI была предложена Международной организацией стандартов ISO (International Standards Organization) в 1984 году. С тех пор ее используют (более или менее строго) все производители сетевых продуктов. Все сетевые функции в модели разделены на 7 уровней (рис. 9.9). Вышестоящие уровни выполняют более сложные задачи, для чего используют в своих целях нижестоящие уровни, а также управляют ими. Цель нижестоящего уровня - предоставление услуг вышестоящему уровню, причем вышестоящему уровню не важны детали выполнения этих услуг. Нижестоящие уровни выполняют более простые функции. Каждый уровень взаимодействует только с теми, которые находятся рядом с ним (выше него и ниже него). Самый верхний уровень соответствует прикладной задаче, а самый нижний - непосредственной передаче сигналов по каналу связи. Функции, входящие в показанные на рис. 9.9 уровни, реализуются каждым абонентом сети. При этом каждый уровень на одном абоненте работает так, как будто он имеет прямую связь с соответствующим уровнем другого абонента, то есть между одноименными уровнями абонентов сети существует виртуальная связь. Реальную же связь абоненты одной сети имеют только на самом нижнем, первом, физическом уровне.
Рис. 9.9. Уровни модели OSI
В передающем абоненте информация проходит все уровни, начиная с верхнего и заканчивая нижним. В принимающем абоненте полученная информация совершает обратный путь: от нижнего уровня к верхнему.
Прикладной уровень (Application), или уровень приложений, самый верхний уровень модели. Он обеспечивает услуги, непосредственно поддерживающие приложения пользователя, например программные средства передачи файлов, доступа к базам данных, средства электронной почты, службу регистрации на сервере. Этот уровень управляет остальными шестью уровнями. Уровень представления (Presentation), или представительский уровень, определяет и преобразует форматы данных и их синтаксис в форму, удобную для сети, то есть выполняет функцию переводчика. Здесь же выполняется шифрование и дешифрирование данных, а при необходимости - их сжатие. Сеансовый уровень (Session), или сессионный уровень, управляет проведением сеансов связи (то есть устанавливает, поддерживает и прекращает связь). Этот же уровень распознает логические имена абонентов, контролирует предоставленные им права доступа. Транспортный уровень (Transport) обеспечивает доставку пакетов без ошибок и потерь, в нужной последовательности. Здесь же производится разбивка передаваемых данных на блоки, помещаемые в пакеты, и восстановление принимаемых данных. Сетевой уровень (Network) отвечает за адресацию пакетов и перевод логических имен в физические сетевые адреса (и обратно), а также за выбор маршрута, по которому пакет доставляется по назначению (если в сети имеется несколько маршрутов). Канальный уровень (Data link), или уровень управления линией передачи, отвечает за формирование пакетов стандартного вида. Здесь же производится управление доступом к сети, обнаруживаются ошибки передачи и производится повторная пересылка ошибочных пакетов. Физический уровень (Physical) - это самый нижний уровень модели. Он отвечает за кодирование передаваемой информации и ее обратное декодирование при приеме. Здесь же определяются требования к соединителям, разъемам, электрическому согласованию, заземлению, защите от помех и т.д. Большинство функций двух нижних уровней модели (1 и 2) обычно реализуются аппаратно (часть функций уровня 2 - программным драйвером сетевого адаптера). Именно на этих уровнях определяется скорость передачи и топология сети, метод управления обменом и формат пакета, то есть то, что имеет непосредственное отношение к типу сети. Более высокие уровни не работают напрямую с конкретной аппаратурой, хотя уровни 3,4 и 5 еще могут учитывать ее особенности. Уровни 6 и 7 вообще не имеют к аппаратуре никакого отношения. Замены аппаратуры сети на другую они просто не заметят. В канальном уровне часто выделяют два подуровня:
* верхний подуровень (LLC - Logical Link Control) осуществляет управление логической связью, то есть устанавливает виртуальный канал связи (часть его функций выполняется программой драйвера сетевого адаптера);
* нижний подуровень (MAC - Media Access Control) осуществляет непосредственный доступ к среде передачи информации (каналу связи). Он напрямую связан с аппаратурой сети. Эталонная модель IEEE Project 802.
Помимо рассмотренных, существует также модель IEEE Project 802, принятая в феврале 1980 года (отсюда и число 802 в названии). Стандарты, определяемые этой моделью (так называемые 802-спецификации), делятся на категории, каждой из которых присвоен свой номер. Наиболее популярные в настоящее время перечислены ниже:
* 802.3 - Локальная сеть (Ethernet). * 802.11 - Беспроводная сеть (WiFi). * 802.15 - Персональные сети (Bluetooth).
* 802.16 - Широкополосные беспроводные сети (WiMAX)
* 802.20 - Глобальные сети.
В заключение раздела отметим организации имеющие самое непосредственное отношение к становлению и развитию компьютерных сетей различного класса - они представлены в табл. 9.3.
Таблица 9.3
ОрганизацияРазработкиDoD - Department of Defence
Министерство обороны СШАСтек протоколов TCP/IPISO - International Standards Organization
Международная Организация по СтандартизацииЭталонная модель OSIIEEE - Institute of Electrical and Electronics Engineers
Институт инженеров по электротехнике и электроникеСтандарты
IEEE Project 802ISOC - Internet Society
Сообщество, занимающееся развитием сети InternetДокументы
RFC
Документы RFC (Request For Comments) - запрос на комментарии - включают в себя огромное число материалов описывающих особенности и стандарты работы сетей. Там, в частности, описаны протоколы стека TCP/IP, сетевые службы, принципы их реализации и другие сопутствующие вопросы. Исходно это были действительно документы, предназначенные для обсуждения, но впоследствии сформировавшиеся стандарты также оформлялись в виде RFC. RFC-документу может быть присвоено одно из состояний стандартизации:
* Утвержденный стандарт (Standard),
* Предложенный к рассмотрению,
* Экспериментальный,
* Устаревший.
Все документы RFC можно получить, например, с Web-узла http://www.ripn.net/nic/archive.html
Контрольные вопросы
1. Опишите преимущества и недостатки трех классических топологий локальных сетей.
2. В чем особенность полудуплексного режима передачи данных?
3. Назовите основные задачи администратора локальной сети.
4. В чем заключается особенность работы подсети с коммутацией пактов?
5. Какой способ кодирования используется в сетях Ethernet и почему?
6. Опишите типовую структуру пакета и назначение полей.
7. Где применяется и как работает протокол CSMA с настойчивостью p?
8. В чем преимущество распределенной архитектуры сети над телефонной сетью?
9. Назовите протоколы эталонной модели TCP/IP и объясните их назначение.
10. Перечислите уровни модели OSI и охарактеризуйте их назначение.
11. Объясните топологию "пассивная" звезда. Где она применяется?
12. Как и для чего используются маршрутизаторы?
13. Объясните принцип работы метода доступа CSMA/CD.
14. В чем состоит основная особенность манчестерского кода?
15. Как сетевые платы могут обнаруживать коллизию?
16. Для чего служит и как формируется контрольная сумма пакета?
17. В чем состоит особенность инкапсуляции пакетов и для чего она используется?
18. Опишите протокол с двоичным обратным отсчетом и его назначение.
19. В чем основное различие протоколов UDP и FTP?
20. Какой протокол, кроме SMTP, необходим для электронной пчты?
21. Какие задачи решаются на транспортном уровне протокола OSI?
22. Сравните две эталонные модели TCP/IP и OSI по числу и назначению уровней.
23. Назовите основные технические характеристики сети WiFi.
24. В чем главное назначение технологии WiMAX? Раздел 10. Практическая реализация сетей
10.1. Адресация в сетях
Эталонная модель TCP/IP пользуется тремя разновидностями адресов: локальными (MAC-адресами - в случае локальной сети), сетевыми (IP-адресами) и символьными именами (доменными именами, DNS-именами).
Локальные адреса используются для доставки пакетов в пределах подсети, сетевые адреса - для маршрутизации пакетов между подсетями, а символьные имена - для более простого и запоминания имен хостов. МАС-адреса.
Для узлов, входящих в локальные сети используется МАС-адрес сетевого адаптера или порта маршрутизатора, например, 11-А0-17-3D-BC-01. Эти адреса назначаются производителями оборудования и являются уникальными адресами, так как управляются централизовано. Для всех существующих технологий локальных сетей МАС-адрес имеет формат 6 байтов: старшие 3 байта - идентификатор фирмы производителя, а младшие 3 байта назначаются уникальным образом самим производителем.
IP-адреса.
Сетевой уровень стека TCP/IP передает пакеты между сетями, опираясь на IP-адреса (RFC 990 и RFC 997). IP-адрес состоит из 32 бит (4 байт). Как правило, IP-адрес записывают как четыре десятичных числа (значения отдельных байтов), разделенные точками, например: 123.45.67.89. Адрес состоит из двух частей: номера подсети и номера узла, причем номер узла не зависит от его MAC-адреса (или другого локального адреса). Распределение номеров подсетей для Internet осуществляется централизованно, а для внутренних подсетей, не связанных напрямую с Internet, может назначаться администратором сети.
Таблица 10.1
КлассДиапазон значений
первого байтаВозможное количество сетейВозможное количество узловA
B
C
D
E1 - 126
128-191
192-223
224-239
240-247126
16382
2097150
-
-16777214
65534
254
228
227 Все IP-адреса разделены на 5 классов (от A до E), задающих разные соотношения между количеством подсетей и количеством узлов в них (см.
табл. 10.1). Некоторые IP-адреса интерпретируются специальным образом:
* адрес, все биты которого равны нулю, обозначает адрес того узла, который выдал этот пакет;
* адрес, в поле номера сети которого стоят только нули, считается относящимся к той же сети, что и узел, выдавший этот пакет;
* адрес, все биты которого равны единице, означает, что данный пакет должны получить все узлы подсети, к которой относится узел, выдавший этот пакет (ограниченное широковещательное сообщение - limited broadcast);
* адрес, в котором все биты поля номера узла равны единице, а поле номера сети задает определенную сеть (не все нули и не все единицы), то такой пакет должен рассылаться всем узлам указанной подсети (широковещательное сообщение - broadcast).
Таким образом, ни номер подсети, ни номер узла не может состоять из
одних нулей или одних единиц. Кроме того, выделяется группа адресов, первый байт которых равен 127. Эти адреса используются для передачи данных между процессами на одном компьютере или для тестирования. Данные, отправленные по такому адресу, рассматриваются, как только что принятые из сети, в результате чего образуется как бы "петля" (loopback). Обычно используется адрес 127.0.0.1, но для этих целей можно использовать любой адрес вида 127.x.x.x.
При создании сети нужно получить один или несколько официальных IP-адресов. Полученный уникальный сетевой адрес даст гарантию, что в будущем при включении в Интернет или при подключении к сети другой организации не возникнет конфликта адресов. DNS-адреса.
Служба именования доменов (DNS, Domain Name System) предназначена для установления глобального соответствия между символическими имена узлов и их IP-адресами. На ранних этапах развития TCP/IP сетей (ARPANET) нужды в распределенной службе имен не было: существовал один текстовый файл, в котором были перечислены все имена узлов и их IP-адреса. Однако с ростом количества узлов такое решение стало неприемлемым. DNS использует иерархическую схему выделения имен, позволяя децентрализовать управление отдельными участками пространства имен. DNS-сервер домена должен поддерживать таблицу соответствий IP-адресов и символических имен для всех узлов, входящих в домен. Каждый узел домена должен знать только IP-адрес своего сервера домена и направлять ему все запросы на преобразование символических имен узлов в IP-адреса. Если сервер домена не может самостоятельно ответить на запрос (например, запрошен IP-адрес узла, принадлежащего к другому домену), он может обратиться к корневому DNS-серверу, узнать он него IP-адрес сервера требуемого домена, а затем обратиться уже к этому серверу домена. Естественно, DNS-сервер может запоминать результаты подобных поисков и при повторном обращении за той же информацией не повторять весть путь, а сразу выдавать кэшированные данные. DNS-сервер хранит, в первую очередь, пары "символическое имя - IP-адрес" для всех узлов своего домена. Кроме того, в базе данных DNS-сервера имеется информация об адресах всех DNS-серверов данного домена (для повышения надежности поддерживается, как правило, не менее двух DNS-серверов для каждого домена, причем все они должны располагаться в разных IP-подсетях), списки псевдонимов (один и тот же узел может иметь несколько символических имен), а также список почтовых серверов данного домена.
10.2. Основные службы Internet
Если говорить об основных сервисах, которые предоставляет Internet, то в первую очередь надо упомянуть три службы:
• Электронная почта (SMTP, POP3)
• Пересылка файлов (FTP, UDP, RTP)
• Всемирная паутина (HTTP)
Электронная почта.
На рис. 10.1 приведена схема соединения хоста-отправителя и хоста-приемника для передачи сообщений по электронной почте с использованием протокола SMTP. Хост-отправитель - клиент, хост-приемник - сервер. Рис.10.1. ТСР-соединение с портом 25 хоста-приемника Отправленное сообщение сможет быть принято получателем только тогда, когда он будет подключен к машине провайдера. После подключения (рис. 10.2) пользовательский агент осуществляет ТСР-соединение с портом 110 и используя протокол РОР3 осуществляет получение всех сообщений. Машина провайдера - сервер, клиентский ПК - клиент.
Рис.10.2. ТСР-соединение с портом 110 агента передачи сообщений Пересылка файлов.
При передачи файлов с использованием протокола FTP используются, так называемые ТСР-сокеты - гнезда или конечные точки обменивающихся хостов. Адрес сокета - это ни что иное, как IP-адрес хоста и 16-битный номер порта. Номера портов ниже 1024 - популярные, зарезервированы различными сервисами (табл. 10.2).
Таблица 10.2
ПортПротоколИспользование21FTPПередача файлов23TelnetДистанционный вход в систему25SMTPЭлектронная почта69TFTPПростейший протокол передачи данных79FinderПоиск информации о пользователе80HTTPМировая паутина (гипертексты)110POP3Удаленный доступ к электронной почте119NNTPГруппы новостей
Для обслуживания передачи мультимедийных файлов используется протокол RTP - Real-Time Transport Protocol - транспортный протокол реального масштаба времени (рис. 10.3). RTP занимает несколько странное положение в стеке протоколов. Он принадлежит пользовательскому пространству и работает поверх UDP. Мультимедийное приложение может состоять из нескольких аудио-, видео-, текстовых и некоторых других потоков. RTP уплотняет потоки и записывает их в пакеты, которые отправляются в сокет. На другом конце сокета, в ядре операционной системы, генерируются UDP пакеты, которые инкапсулируются в IP-пакеты, передаваемые по сети.
Рис. 10.3. Основная функция RTP - уплотнение нескольких потоков реального масштаба времени в единый поток пакетов UDP.
Пользовательский дейтаграммный протокол UDP - обслуживает отправку инкапсулированных IP-дейтаграмм без установления соединений. UDP не занимается контролем потока, контролем ошибок, повторной передачей после приема испорченного пакета. Этим должен заниматься пользовательский процесс. UDP широко используется в клиент-серверных приложениях и службе имен доменов (DNS).
Всемирная паутина.
Служба WWW предоставляет пользователям содержимое сайтов по введенным адресам. Обслуживает запросы пользователей web-сервер по протоколу НТТР. Содержимое сайтов представляет из себя одну или несколько страниц гипертекста.
10.3. Особенности web-дизайна
Современный web-дизайн включает в себя разработку сайтов, реализующих различные "сценарии" обслуживания их посетителей.
CGI (Common Gateway Interface) - технология, позволяющая запускать на web-сервере программы, могущие получать данные от посетителей сайтов, поддерживаемых этим web-сервером, и, в свою очередь, выдавать им обработанные данные в виде web-страниц или других файлов. Для использования технологии CGI программа web-сервер должна удовлетворять определенным критериям - "поддерживать CGI". CGI-сценарий (CGI-скрипт) - программа (в текстовом виде), предназначенная для исполнения на web-сервере. Для создания CGI-скриптов можно использовать любой язык программирования - важно лишь, чтобы на том web-сервере, где предполагается эту программу запускать, имелся интерпретатор этого языка. Язык разработки.
Одним из самых популярных языков программирования, используемых в настоящее время при разработке сайтов является язык РНР (PHP Hypertext Preprocessor) пи-эйч-пи препроцессор гипертекста. Отметим, что здесь препроцессор означает - программу, работающую совместно с web-сервером, которая просматривает все или некоторые файлы, выдаваемые web-сервером посетителя, и выполняет над ними определенные действия в зависимости от содержащихся в этих файлах инструкций.
Чтобы понять, почему РНР стал на сегодняшний день столь популярным рассмотрим кратко его возможности, по сравнению с другими языками.
Все языки программирования, используемые при разработке web-сайтов, можно разделить на две большие группы. К первой относятся те, код которых выполняется на компьютере посетителя сайта - в его браузере. Например, JavaScript и VBScript. Программы на этих языках встраиваются в код web-страниц (или выносятся в отдельный файл с вызовом из web-страниц, но браузер все равно обрабатывает такие вынесенные программы как если бы они были встроены в код страницы. Во вторую входят языки, программы на которых выполняются на том компьютере, где расположен web-сервер. РНР относится ко второй группе - программа на РНР исполняется на web-сервере. От других CGI-языков РНР отличается в лучшую сторону прежде всего своей простотой. Механизм действия РНР более правильно называть не "CGI-языком", а препроцессором - что и отражено в его названии. В то время как CGI-приложение просто выдает некие данные в браузер посетителя, препроцессор просматривает все или некоторые файлы, выдаваемые web-сервером посетителю, и ищет в них определенные команды, которые и выполняет. Именно такой способ работы и позволяет встраивать код программ на РНР непосредственно в текст web-страниц. Еще одним достоинством РНР является возможность работы с серверами баз данных. Для работы с подавляющим большинством типов баз данных в РНР есть встроенные функции, поэтому достаточно лишь установить на web-сервере программу работы с базой данных (наиболее часто используется бесплатная MySQL - http://www.mysql.com).
Среда разработки.
Для web-дизайна с использованием языка РНР требуется специальный пакет программ, включающий, по крайней мере, интерпретатор РНР. Наиболее популярным пакетом является проект "Денвер" (Джентельменский Набор Вэб Разработчика), который включает последние версии следующих программ: • web-сервер Apache;
• интерпретатор языка РНР;
• интерпретатор языка Perl;
• СУБД MySQL. Загрузить последнюю версию "Денвера" можно с сайта http://www.denwer.ru. Сценарии.
Кроме основных служб Интернета, упомянутых в разделе 10.2, сейчас пользователям предлагается огромное количество сервисов. В частности, Интернет широко используется для общения (чаты, конференции, IP-телефония), электронного бизнеса (Интернет-магазины, доступ к финансам, "блошиные" рынки), интерактивных развлечений (игры-симуляторы, интерактивные фильмы), электронные образовательные программы. Для реализации подобных услуг необходимо разрабатывать удобные для пользователя "интерфейсы" взаимодействия с услугами. Эти "интерфейсы" часто называют сценариями.
На языке РНР достаточно просто реализовать практически все необходимые сценарии. В частности, РНР позволяет реализовать такие необходимые элементы перечисленных услуг, как:
* Авторизация доступа.
* Система оценки материалов сайта.
* Счетчик посещений.
* Чат.
* Работа с базами.
* Прайс-лист.
Одним из важных и часто используемых элементов web-дизайна является cookie.
Cookies
Cookie - это файл в специальном формате, который присылается сервером браузеру посетителя сайта. Браузер, если он поддерживает cookie (и эта поддержка в нем не отключена), помещает его в особое место и впоследствии отправляет назад на сервер при поступлении от него запроса. Cookie позволяет серверу хранить свою информацию на компьютерах посетителей и считывать ее оттуда при необходимости.
Установив cookie на одной из страниц сайта, вы можете использовать записанные в него данные на всех остальных страницах сайта (расположенные на том же Интернет-узле, т. е. с тем же доменным именем). Установка cookie производится командой SetCookie и при установке ему дается определенное имя. Впоследствии сценариям на всех страницах этого Интернет-узла браузер посетителя передает при заходе на них данные этого cookie. Одновременно можно устанавливать как один, так и несколько cookies. Данный способ подойдет тогда, когда данные, введенные на одной странице, могут потребоваться на прямо не связанной с ней другой. Ограничения же связаны с особенностями cookie: количество информации в cookie не может превышать 4 кбайт, cookie может похитить с компьютера посетителя любой, кто за него сядет. Кроме того, некоторые пользователи Интернета отключают cookie при путешествиях по сети, что не дает возможности использовать данный способ абсолютно для всех посетителей. Помните, что отправка и чтение cookie должны производиться до какого бы то ни было вывода в документ.
Сессии
Передача информации между страницами возможна с помощью механизма работы с сессиями. Сессия - несколько абстрактное понятие, означающее нечто вроде законченного периода работы с сайтом. Например, в сессию могут входить такие действия, как "приход на сайт - загрузка данных - уход с сайта". Иногда определения сессии разнятся в своей формулировке, но суть примерно такая. С помощью команд "поддержки сессий" PHP можно при заходе посетителя на сайт запоминать какие-либо переменные и потом эти переменные считывать или изменять на других страницах этого сайта. При этом-обратите внимание - в браузер посетителя передаются отнюдь не сами эти переменные, а некий пароль, по которому сервер впоследствии этот браузер узнает и восстановит именно те значения переменных, которые были установлены для данного посетителя. Иными словами, - работа механизма сессий в PHP происходит так. Когда посетитель заходит на сайт и для него устанавливаются какие-либо переменные (сам ли он их вводит, или, скажем, они берутся из базы данных), то команды начала и регистрации сессии сохраняют эти переменные в определенном месте на самом сервере.
10.4. Особенности и тенденции развития Internet
Практическое развитие сети Internet опережает все прогнозы и нарушает все намечавшиеся ранее тенденции. Поэтому, этот раздел может показаться ненужным. Однако здесь остановимся только на тех особенностях и тенденциях, которые используются и входят все шире в обиход пользователей глобальной сети. Большой практический интерес прежде всего вызывают беспроводные технологии, которые реально обеспечивают мобильный доступ в Интернет. WiMAX - протокол широкополосной радиосвязи (Worldwide Interoperability for Microwave Access), разработанный консорциумом (WiMAX Forum) в июне 2001 года, и принятого в январе 2003 под стандартом IEEE 802.16e. Так как сети стандарта IEEE 802.16 используют тот же LLC (Logical Link Control) уровень (стандарт IEEE 802.2) как и другие LAN и МAN, то они могут прямо взаимодействовать между собой. В отличие от сетей WiFi (IEEE 802.11x), где доступ клиентам предоставляется случайным образом, в WiMAX каждому клиенту отводится четко регламентированный промежуток времени. Кроме того, WiMAX поддерживает ячеистую топологию (рис. 10.4).
WiMAX относится к технологии WMAN (Wireless Metropolian Network), которая может соединяться с точками доступа стандарта IEEE 802.11 (WiFi). WiMAX является альтернативой прокладки кабеля, или линии DSL при организации "последней мили". Стандарт IEEE 802.16e позволяет покрыть сигналом площадь радиусом до 112.6 километров, без прямой видимости. Пропускная способность WiMAX по стандарту составляет порядка 70 Мбит/с.
Рис. 10.4. Использование технологии WiMAX
На данный момент выпускаемое оборудование для сетей WiMAX поддерживает три основных диапазона: 2,5-2,7; 3,4-3,6 и 5-6 ГГц. Введение этого разбиения на диапазоны внутри стандарта было сделано специально для упрощения лицензирования в различных странах, однако, в отличие от большинства европейских стран, где частотный диапазон 3,5 ГГц свободен, в России этот диапазон используется наземными и спутниковыми радиосистемами, в том числе военного назначения. Диапазон 2,5-2,7 ГГц занят спутниковым телевидением. Таким образом, свободным диапазоном, пригодным для стандарта WiMAX, остается только 5,725-5,850 ГГц.
Новая версия стандарта WiMAX, работу над которым начали специалисты IEEE, получила название 802.16m. Ожидается, что пропускная способность сетей IEEE 802.16m будет достигать 1 Гбит/с. При этом сохранится обратная совместимость с существующим оборудованием WiMAX. В продуктах стандарта 802.16m будут применяться антенны MIMO (Multiple Input Multiple Output), а также технология широкополосной многочастотной ортогональной модуляции OFDM (Orthogonal Frequency Division Multiplexing). Владельцы мобильных устройств, соответствующих стандарту 802.16m, как ожидается, смогут принимать по беспроводным сетям видео высокого качества, загружать из Интернета большие объемы информации, просматривать телевизионные программы и так далее. Не исключено, что именно стандарт 802.16m будет выбран в качестве основы для сотовых сетей следующего поколения. Первые черновые варианты стандарта 802.16m появились в конце 2007 года. На протяжении 2008 года спецификация будет дополняться и корректироваться. Ратификация стандарта беспроводной связи 802.16m запланирована на 2009 год.
Контрольные вопросы
1. Перечислите разновидности имен узлов сети и основное назначение каждого имени.
2. К какому классу относятся IP-имена локальных сетей?
3. Объясните предназначение службы именования доменов (DNS).
4. Перечислите основные службы Интернет и соответствующие им протоколы.
5. Как и для каких целей используется протокол РОР3?
6. В чем заключается особенность реализации протокола RTP?
7. Что включает среда разработки "Денвер" и для чего она используется?
8. Объясните назначение сookie. Где и как он формируется?
9. Что позволяет технология WiMAX и где она используется?
10. Поясните понятие архитектуры сети.
11. Чему присваивается МАС адрес и почему эти адреса уникальны?
12. В чем отличие IP и DNS адреса?
13. Что такое широковещательное сообщение?
14. К какому классу относятся IP-адреса глобальной сети?
15. Приведите пример IP-адреса муниципальной сети.
16. Назовите стек протоколов модели TCP/IP.
17. Перечислите основные службы Интернет и их протоколы.
18. Что такое сокет и для чего он используется?
19. Опишите особенности протокола RTP.
20. Что такое CGI-технология и где она используется?
21. Объясните, что такое "сценарий" и какие CGI-сценарии используются в современном web-дизайне?
22. Назовите особенности языка РНР.
23. Назовите основные техническое характеристики технологии WiFi.
24. Приведите примеры использования WiFi-техологии в Санкт-Петербурге.
25. Назовите основные технические характеристики технологии WiMAX.
26. В чем заключаются сложности использования WiMAX в России?
Глоссарий
Русские сокращения
АЛУ- арифметико-логическое устройство АП- арифметический процессор
БСШ- блок сопряжения с шиной ВВФ - внутренний вещественный формат ВИС - высокоимпедансное состояние ВМ - вычислительная машина
ВС - вычислительная система ВУ - внешнее устройство ГТИ - генератор тактовых импульсов ДВФ - длинный вещественный формат ЗУ - запоминающее устройство ИБ - исполнительный блок КВФ - короткий вещественный формат МПС- многопроцессорная система
ПВВ- процессор ввода-вывода
ПДП - прямой доступ в память
ПКП - программируемый контроллер прерываний
ПСТ- программируемый системный таймер
РЗП - регистр запроса прерываний
РКИ - регистры команд инициализации
РМП - регистр масок прерываний
РОП - регистр обслуживаемых прерываний
РРК - регистр рабочих команд
УВВ- устройство ввода-вывода
УУ- устройство управления
ЦП - центральный процессор
ША - шина адреса
ШД - шина данных
ШУ - шина управления
Английские сокращения
AD - address-data - адрес-данные
ADI - address interval - адресный интервал
AEN - address enable - разрешение адреса
AF - auxiliary flag - флаг вспомогательного переноса
ALE - address latch enable - разрешение фиксации адреса
В - base - база
ВС - byte counter - счетчик байтов
ВНЕ - bus high enable - разрешение старшего байта шины
ВР - base pointer - указатель базы
СА - channel activity - готовность канала
CAS - cascade - каскадирование
СС - channel control - управление каналом
CEN - command enable - разрешение команды
CF - carry flag-флаг переноса
CLK - clock - такты, тактовые импульсы
CLR - clear - сброс
CR - control register - регистр управления
CS - chip select - выбор микросхемы
CSMA/CD - Carrier Sense Multiply Access with Collision Detection - множественный доступ с контролем несущей и определением коллизий
CSYNC - clock syncronization - тактовая синхронизация
D - data - данные
d - destination - место назначения (приемник)
DE - denormalized-operand exeption - исключительная ситуация, связанная с ненормализованным операндом
DEN - data enable - разрешение данных
DF- direction flag- флаг направления
DI - destination index - индекс места назначения
disp - displacement - смещение
DS - data segment - сегмент данных
DSP - display - дисплей
DT/R - data transmitted/received - данные передаются/принимаются
EA - effective address - исполнительный адрес
EFI - external frequency input - вход внешней частоты
EOI - end of interrupt - окончание прерывания
ЕР - exceptional pointer - указатель исключительных ситуаций
ES - extra segment - дополнительный сегмент
ESC - escape - поручить сопроцессору
FTP- file transfer protocol - протокол передачи файлов
F/C - frequency/crystal - внешняя частота/кварц
GAN- global area net - глобальная сеть
H - high - старший
HAN- home area net - домашняя сеть
HLDA - hold acknowledgment - подтверждение захвата
HOLD - hold - запрос захвата
HTML - hyper text makeup language - язык разметки гипертекста
HTTP- hyper text transfer protocol - протокол передачи гипертекта
IС - infinity control - управление бесконечностью
ICW - initialization control word - команда инициализации
IE - invalid-operation exception - исключительная ситуация,связанная с недействительным операндом
IEM - interrupt enable mask - маска разрешения прерывания
IF - interrupt flag-флаг разрешения прерывания
INTR (INT) -interrupt request - запрос прерывания
INTA - interrupt acknowledgement - подтверждение прерывания
IOВ - input-output bus - шина ввода-вывода
IORC - input-output read command - команда чтения из ВУ
IOWC - input-output write command - команда записи в ВУ
IP - instruction pointer - указатель команд
IP - internet protocol - внутресетевой протокол
IRC- internet relay chart - беседа через интернет
IX - index - регистр индекса
L - low - младший
LAN- local area net - локальная сеть
LOCK - lock - монополизация (захват) шины
m (mem) -memory - память
MAN- metropolitan area net - муниципальная сеть
MC - mask compare - сравнение с маской
M/IO - memory/input-output - память/ввод-вывод MN/MX -minimum/maximum - минимальный/максимальный
mod - mode - режим
MRDC - memory read command - команда чтения из памяти
M/S - master/slave - ведущий (основной)/ведомый (подчиненный)
MWTC - memory write command - команда записи в память
NAN - not a number -не число
NMI - non-maskable interrupt - немаскируемое прерывание
NRZ- non return to zero - без возврата к нулю
OCW- operation control word - рабочая команда
ОЕ - output enable-разрешение выхода
OF - overflow flag-флаг переполнения
OSC - oscillation - колебания (синусоидальной формы)
PC - precision control - управление точностью
PCLK - perifery clock - такты для ВУ
РЕ - precision exception - исключительная ситуация, связанная с потерей точности
PF - parity flag - флаг паритета (четности)
POP3 - post office protocol - протокол почтового офиса
РР - parameter pointer - указатель параметров
PSW - processor state word- слово-состояние процессора
PTR - pointer - указатель
QS - queue state - состояние очереди
г (reg) - register - регистр
RC - round control - управление округлением
RQ/GT - request/grant - запрос/предоставление
RZ- return to zero - возврат к нулю
S - state - состояние
SEL -selection - выбор (канала)
SF - sigh flag-флаг знака
SFNM - special full-nested mode - специальный режим полной вложенности
SI - source index - индекс источника
SMM - special mask mode - режим специального маскирования
SMTP - simple mail transfer protocol - простой протокол пересылки почты
SNGL - single - один-единственный
SP - stack pointer - указатель стека
SR - state register - регистр состояния
SS - stack segment - стековый сегмент
STB - strobe - строб
SYNC - syncronization - синхронизация
SYSBUS - system bus - системная шина
TANK - tank - колебательный контур
TCP- transmission control protocol - протокол управления передачей
TF - trap flag-флаг пошагового режима
ТР - task pointer - указатель задания
TR- tag register - регистр этикеток
UE - underflow exception - исключительная ситуация, связанная с денормализацией
w - word - слово
WAIT - wait - ожидание
WID - width - ширина
Wi-Fi - wireless fidelity - беспроводная связь
WWW - world wide web - всемирная паутина
ZE - zero-divide exception - исключительная ситуация, связанная с делением на нуль
ZF - zero flag-флаг нулевого результата
Русско-английские термины
авария - abort Исключение, не позволяющее осуществить рестарт программы и точно локализовать команду, вызвавшую это исключение. Исключения типа "авария" генерируются при обнаружении серьезных ошибок, таких как неразрешенные или несовместимые значения в системных таблицах или аппаратные сбои. аппаратное прерывание - hardware interrupt Прерывание от (внешнего) периферийного устройства, по которому процессор узнает о возникновении асинхронного события. аппаратный сброс - hardware reset Перевод системы в предопределенное (исходное) состояние. ввод-вывод с отображением в память - memory-mapped I/O Способ управления периферийными устройствами, при котором управляющие регистры устройств рассматриваются как ячейки оперативной памяти и могут считываться и изменяться с использованием обычных операций запоминания и выборки. вектор прерывания - interrupt vector 1. Номер прерывания или исключения. 2. В реальном режиме: элемент IDT, представляющий собой адрес обработчика прерывания или исключения. виртуальная память - virtual memory Система, в которой рабочее адресное пространство процесса превышает размер фактически имеющейся в системе оперативной памяти, при этом недостаток быстродействующей оперативной памяти заполняется за счет внешней более медленной или более дешевой памяти (винчестер, флэш-память и т.п.) При обращении процесса к ячейкам виртуального адресного пространства срабатывает механизм подкачки. вложение задач - task nesting Способ переключения с одной задачи на другую, при котором предыдущая задача приостанавливается, но обеспечивается ее корректное возобновление с прерванного места после выполнения новой задачи. Новая задача считается вложенной в приостановленную. выравнивание - alignment Способ размещения многобайтных слов в памяти, при котором слова размещаются по адресу, кратному их разрядности: 16-битные слова - по четным адресам, 32-битные слова - по адресам, кратным четырем и т.п. Такой способ размещения позволяет сократить количество циклов обращения к памяти. дескриптор - descriptor Структура, используемая механизмом сегментации в защищенном режиме, содержит характеристики сегмента или определенного системного объекта: базовый адрес в линейном адресном пространстве, предел, тип, права доступа и др. задача - task Объект, содержащий поток инструкций для процессора, который процессор может выполнять, приостанавливать и осуществлять над ним диспетчеризацию. В качестве задачи может выполняться прикладная программа, сервис операционной системы, ядро операционной системы, обработчик прерывания или исключения и др. Все команды процессора выполняются в контексте той или иной задачи. запрашиваемый уровень привилегий - requested privilege level (RPL) Уровень привилегий, требующийся программе для доступа к тому или иному сегменту. С помощью RPL программа может только понизить свои привилегии при доступе к какому-либо сегменту. исключение - exception Непредопределенное (обычно синхронное) событие в процессе, возникающее при попытке осуществления процессом неизвестного или запрещенного действия. При этом исполнение текущей последовательности команд приостанавливается, а вместо нее начинает выполняться другая последовательность, соответствующая данному исключению. контроль с функциональной избыточностью - functional redundancy checking (FRC) Способ организации вычислений, при котором процессоры многопроцессорной системы для обеспечения надежности системы дублируют операции, производимые основным процессором. кэш - cache Запоминающее устройство, используемое в качестве буфера между процессором и самой памятью. Ячейки оперативной памяти являются менее быстродействующими устройствами, чем регистры процессора и сам процессор. Кэш предназначен для выравнивания степени доступности устройств этих двух типов за счет временного хранения содержимого ячеек оперативной памяти. кэш с обратной записью - write-back cache Кэш, в котором алгоритм кэширования позволяет для увеличения производительности откладывать и группировать операции записи в память. кэш со сквозной записью - write-through cache Кэш, в котором используется алгоритм немедленного отображения изменений в памяти, вызванных операциями записи. Таким образом обеспечивается постоянное соответствие данных в памятью с их образом в кэше. линейное адресное пространство - linear address space Непрерывное адресное пространство программы в системе со сплошной моделью памяти. линейный адрес - linear address Адрес, необходимый для указания ячейки при использовании сплошной модели памяти, представляет собой смещение в линейном адресном пространстве. ловушка - trap Исключение, возникающее на границе команд сразу же после команды, вызвавшей это исключение. Значения регистров CS и EIP, заносимые в стек обработчика, указывают на очередную команду. логический адрес - logical address Адрес, необходимый для указания ячейки при использовании сегментированной модели памяти, состоящий из двух элементов: селектора сегмента и смещения. многозадачность - multitasking Метод управления компьютерной системой, когда отдельные задачи выполняются так, как если бы они выполнялись параллельно на отдельных процессорах с общей памятью. За исключением пауз для взаимодействия или синхронизации с другими задачами, каждая задача работает параллельно с другими задачами. модель режима реального адреса - real-address mode model Частный случай сегментированной модели памяти, реализованный в ЦП 8086, при котором программа работает в адресном пространстве, представляющем собой непрерывный массив сегментов фиксированной длины. нарушение (отказ) - fault Исключение, которое обнаруживается либо перед исполнением, либо во время исполнения команды. При этом процессор переходит в состояние, позволяющее осуществить рестарт команды. В качестве адреса возврата в стек обработчика заносится адрес вызвавшей исключение команды. обработчик прерывания/исключения - interrupt/exception handler Программная секция, которой передается управление при возникновении прерывания или исключения и которая определяет дальнейшие действия. параграф - paragraph Выровненный 16-байтный блок памяти в модели режима реального адреса. переключение стека - stack switch Механизм, обеспечивающий защиту данных в стеках разных уровней привилегий. Этот механизм срабатывает при переходе процессора с одного уровня привилегий на другой (при передаче управления через шлюз вызова или при вызове обработчика прерывания или исключения). подкачка - swapping Метод управления использованием виртуальной памяти на основе перезаписи информации из оперативной памяти во внешнюю вспомогательную память в те периоды, когда эта информация не используется, и перемещении информации обратно в основную память, когда в ней снова возникает необходимость. подчиняемый сегмент кода - conforming code segment Сегмент кода, который вне зависимости от уровня привилегий своего дескриптора выполняется с привилегиями вызвавшего его кода. полудуплекс - half duplex Режим обмена информацией (в обоих направлениях, но по очереди, а не одновременно).
порт ввода-вывода - I/O port Функциональный блок периферийного устройства типа регистр, сопрягаемый с системной шиной микропроцессорной системы. Порт может работать либо только в режиме ввода, либо только в режиме вывода, либо в двунаправленном режиме. Каждому порту ввода-вывода сопоставляется уникальный адрес в специальном адресном пространстве микропроцессора. предел сегмента - segment limit Максимальное смещение в сегменте (адрес последнего байта). прерывание - interrupt Сигнал, по которому процессор узнает о возникновении асинхронного события. При этом исполнение текущей последовательности команд приостанавливается, а вместо нее начинает выполняться другая последовательность, соответствующая данному прерыванию. префикс - prefix Опциональная часть кода команды, добавляющая определенные особенности выполнения команды: повторение инструкции (rep), блокировку шины (lock) при выполнении инструкции, явное использование определенного сегментного регистра, смену размера операнда или адреса. Несколько префиксов могут использоваться совместно. программное прерывание - software interrupt Предопределенное (обычно синхронное) событие в процессе, при котором процесс обращается к тому или иному сервису операционной системы. пространство портов ввода-вывода - I/O port address space Адресное пространство, предназначенное для работы с портами ввода-вывода. В этом адресном пространстве каждая ячейка может представлять какой-либо порт того или иного периферийного устройства. Сигналы на шине микропроцессора позволяют отличать адреса в пространстве портов ввода-вывода от адресов, формируемых при обращении к оперативной памяти. процессор с сокращенным набором команд - reduced instruction set computer (RISC) Тип архитектуры микропроцессоров, в которой из-за относительно небольшого набора встроенных команд и, как следствие, увеличения скорости декодирования команд обеспечивается существенное улучшение быстродействия и производительности. сегмент - segment Блок виртуальной памяти, который представляется программе независимым адресным пространством с определенными свойствами: типом, размером, правами доступа и др. сегмент состояния задачи - task state segment (TSS) Сегмент памяти, предназначенный для хранения контекста процессора при приостановке задачи. TSS содержит также дополнительные элементы, обеспечивающие вложение задач и различные механизмы защиты. сегментированная модель - segmented memory model Способ организации памяти, при котором программа оперирует группой независимых адресных пространств, каждое из которых называется сегментом. Обычно для кода, данных и стека используются отдельные сегменты. селектор сегмента - segment selector Идентификатор, однозначно указывающий на сегмент при использовании сегментированной модели памяти. симметричная многопроцессорная обработка - symmetric multiprocessing (SMP) Способ организации вычислений, при котором и операционная система, и прикладные программы могут использовать любой процессор многопроцессорной системы. системная ("фасадная") шина - front-side bus (FSB) Внешняя шина микропроцессора, по которой происходит обмен с памятью и внешними устройствами. смещение - offset Относительный адрес от начала некоторого блока данных (сегмента, страницы, таблицы и т.п.) спекулятивное выполнение - speculative execution Способность процессора выполнять операции за ветвлением, которое еще не обработано, и, в конечном итоге, собирать результаты в порядке следования инструкций. Т.е. в исполнительных блоках команды обрабатываются не в том порядке, в каком они расположены в программе. сплошная модель памяти - flat memory model Способ организации памяти, при котором программа оперирует с единым непрерывным адресным пространством, называемом линейным адресным пространством. Код, данные и стек программы размещаются в этом пространстве. страница - page Блок виртуальной памяти фиксированного размера, которым оперирует механизм страничной трансляции. суперскалярная архитектура - superscalar architecture Архитектура, на основе двух и более исполнительных конвейеров (в отличие от скалярной - одноконвейерной архитектуры). таблица векторов прерываний - interrupt vector table Таблица адресов обработчиков прерываний и исключений для Intel 8086. текущий уровень привилегий - current privilege level (CPL) Уровень привилегий, с которым связан выполняемый в данный момент сегмент кода. уровень привилегий - privilege level (PL) Состояние процессора, определяющее характеристики разграничения доступа к тем или иным объектам виртуальной памяти или выполнения специальных инструкций. уровень привилегий ввода-вывода - I/O privilege level (IOPL) Необходимый уровень привилегий для выполнения операций в пространстве портов ввода-вывода и операций с флагом прерываний. уровень привилегий дескриптора - descriptor privilege level (DPL) Уровень привилегий, с которым связан описываемый данным дескриптором сегмент и системный объект. физический адрес - physical address Адрес ячейки в физической памяти, выставляемый процессором на системную шину при обращении к оперативной памяти. шлюз вызова - call gate Системный дескриптор, указывающий на точку входа в определенную процедуру. Обеспечивает переключение уровней привилегий или взаимодействие 16-битного и 32-битного кода. шлюз задачи - task gate Системный дескриптор, используемый для переключения на другую задачу. шлюз ловушки - trap gate Системный дескриптор, указывающий на точку входа в обработчик прерывания или исключения (при вызове обработчика состояние флага IF не меняется). шлюз прерывания - interrupt gate Системный дескриптор, указывающий на точку входа в обработчик прерывания (при вызове обработчика флаг IF сбрасывается, блокируя обработку маскируемых прерываний). эффективный уровень привилегий - effective privilege level (EPL) Уровень привилегий, предоставляемый программе для доступа к тому или иному сегменту, вычисляется как наибольшее значение между CPL и RPL. Литература
1. Гук, М. Аппаратные средства IBM PC. Энциклопедия. 3-е изд./М.Гук, - СПб.: Питер, 2006.
2. Юров, В. Assembler. Учебник./В.Юров, - СПб.: Питер, 2001.
3. Таненбаум, Э. Компьютерные сети. 4-е изд./Э.Таненбаум, - СПб.: Питер, 2006.
4. Остерлок, Х. Маршрутизация в IP-сетях. Принципы, протоколы, настройка./Х.Остерлок, - СПб.: ООО "ДиаСофтЮП", 2002.
5. Казаринов, Ю.М. Применение микропроцессоров и микроЭВМ в радиотехнических системах. Учебное пособие для вузов./Ю.М.Казаринов, В.Н.Номоконов, Ф.В.Филиппов, - М.: Высш.шк., 1998.
6. Бродин, В.Б. Микропроцессор i486. Архитектура, программирование, интерфейс./В.Б.Бродин, И.И.Шагурин, - М.: Диалог-"МИФИ", 1993.
7. Лю, Ю., Гибсон Г. Микропроцессоры семейства 8086/8088. Архитектура, программирование и проектирование микрокомпьютерных систем./Ю.Лю, Г.Гибсон, - М.: Радио и связь, 1987.
8. Велихов, С. Справочник по HTML 4.0. Серия книг "Руководство по работе: Советы, хитрости, трюки и секреты"/С.Велихов, - М.: Бук_пресс, 2006.
9. Шпаковский, Г.И. Руководство по работе на вычислительном кластере. Пособие для студентов естественнонаучных специальностей. / Г. И. Шпаковский, А. Е. Верхотуров, Н. В. Серикова, - Минск: БГУ, 2004.
10. Орлов,А.А. РНР: Полезные советы./А.А.Орлов, - М.: Горячая линия-
Телеком, 2006.
197
Автор
Kazaam
Документ
Категория
Методические пособия
Просмотров
1 227
Размер файла
2 872 Кб
Теги
система, сети, вычислительной, машина
1/--страниц
Пожаловаться на содержимое документа