ОБЗОРНАЯ ЛЕКЦИЯ по курсу «ЭВМ и программирование» доцента кафедры ИВТ, к. т. н. Ливак Е.Н. на тему Архитектура современных ЭВМ Основные понятия, факты Понятие архитектуры. Общие архитектурные свойства и принципы. Архитектурные особенности компьютеров. Режимы работы микропроцессора. Набор регистров микропроцессора. Пользовательские регистры. Организация оперативной памяти. Система прерываний. Навыки и умения Применение знаний об архитектуре ЭВМ для разработки эффективных программ. Использование пользовательских регистров микропроцессора. Работа с прерываниями. ПОДРОБНЕЕ СМ. 1. Юров В., Хорошенко С. Assembler: учебный курс. – СПб: Питер Ком, 1999. – С. 21-53. 2. Системное программное обеспечение / А.В. Гордеев, А.Ю. Молчанов. – СПб.: Питер, 2001. – С. 76 – 128. 3. Волчок В.А. Микропроцессоры: Избранные лекции. – Гродно: ГрГУ, 1997. – 89 с. Понятие архитектуры Совокупность всех программно доступных аппаратных средств процессора принято называть архитектурой. Понятие архитектуры ЭВМ является комплексным и включает в себя [1]: структурную схему ЭВМ; средства и способы доступа к элементам структурной схемы ЭВМ; организацию и разрядность интерфейсов ЭВМ; набор и доступность регистров; организацию и способы адресации памяти; способы представления и форматы данных ЭВМ; набор машинных команд; форматы машинных команд; обработку нештатных ситуаций (прерываний). Таким образом, понятие архитектуры включает в себя практически всю необходимую для программиста информацию о компьютере. Все современные ЭВМ обладают некоторыми общими и индивидуальными свойствами архитектуры. Общие архитектурные свойства и принципы [1] Эти свойства и принципы присущи всем современным машинам фоннеймановской архитектуры. Принцип хранимой программы. Согласно этому принципу, код программы и ее данные находятся в едином адресном пространстве в оперативной памяти. С точки зрения процессора нет принципиальной разницы между данными и командами. Принцип микропрограммирования. В состав процессора входит блок микропрограммного управления. Этот блок для каждой машинной команды имеет набор действий-сигналов, которые нужно сгенерировать для физического выполнения требуемой машинной команды. Линейное пространство памяти. Оперативная память (ОП) организована как совокупность ячеек памяти (байтов), которым последовательно присваиваются номера (адреса) 0, 1, 2 … Последовательное выполнение программ. Процессор выбирает из памяти команды строго последовательно. Для изменения прямолинейного хода выполнения программы или осуществления ветвления необходимо использовать специальные команды условного и безусловного перехода. Безразличие к целевому назначению данных. Машине все равно, какую логическую нагрузку несут обрабатываемые ею данные. Индивидуальные архитектурные принципы микропроцессоров Intel ( i486 и Pentium) Суперскалярная архитектура. В микропроцессоре i486 появился важный элемент архитектуры – КОНВЕЙЕР – специальное устройство, реализующее такой метод обработки команд внутри микропроцессора, при котором исполнение команды разбивается на несколько этапов. Например, i486 имеет пятиступенчатый конвейер с такими этапами обработки команд: выборка команды их кэш-памяти или ОП; декодирование команды; генерация адреса (определение операндов в памяти); выполнение операции с помощью арифметико-логического устройства; запись результата. Таким образом, на конвейере может находиться одновременно пять команд на различной стадии выполнения существенно возрастает скорость вычислений. Микропроцессоры, имеющие один конвейер, называются скалярными (например, i486). Микропроцессоры, имеющие более одного конвейера, называются суперскалярными. Например, суперскалярными являются микропроцессоры Pentium (2 конвейера), Pentium Pro (3 конвейера по 14 ступеней) и последующие модели. Раздельное кэширование кода и данных Кэширование – способ увеличения быстродействия системы за счет хранения часто используемых данных и кодов в «кэш-памяти 1-го уровня» (быстрой памяти), находящейся внутри микропроцессора. Так, i486 содержит 1 блок встроенной кэш-памяти размером 8 Кбайт, который используется для кэширования и кодов, и данных. Pentium содержит уже 2 блока кэш-памяти: один для кода, один для данных (по 8 Кб) увеличивается скорость работы компьютера за счет одновременного быстрого доступа к коду и данным. Предсказание правильного адреса перехода Под переходом здесь понимается запланированное алгоритмом изменение последовательного характера выполнения программы. Статистика показывает, что типичная программа на каждые 6-8 команд содержит 1 команду перехода (условные операторы, операторы цикла, оператор безусловного перехода и т.д.) через каждые 6-8 команд необходимо очищать и заполнять заново конвейер теряются преимущества конвейеризации. Поэтому в архитектуру микропроцессоров (Pentium) был введен механизм предсказания переходов. Суть этого механизма заключается в следующем. Вводится специальный буфер адресов перехода, который хранит информацию о последних переходах (для Pentium – о 256 переходах). Для команды, управляющей ветвлением, в буфере запоминаются сама команда, адрес перехода и предположение о том, какая ветвь программы будет выполнена следующей. Например, в ходе выполнения цикла принимается решение о выходе из цикла либо о переходе на его начало. Блок предсказания адреса перехода прогнозирует решение программы. При этом он основывается на предположении, что ветвь, которая была пройдена, будет использоваться снова (т.е. прогнозируется переход на начало цикла), и загружает соответствующую команду на конвейер. Если предсказание верно, переход осуществляется без задержки увеличение скорости работы. Вероятность правильного предсказания составляет около 80%. Усовершенствованный блок вычислений с плавающей точкой. Выполняет одну команду с плавающей точкой за один такт микропроцессора. Вычисления с плавающей точкой – неотъемлемая часть видеоприложений (CAD, 3D-графика и т.п.) Так, i486DX впервые был интегрирован на одной подложке с математическим сопроцессором. Предыдущие семейства процессоров использовали внешний математический сопроцессор. В Pentium обычные математические функции вычислений с плавающей точкой (+, *, / ) реализованы аппаратно (целочисленная конвейеризация дополнена четырехтактовыми конвейерными командами вычислений с плавающей точкой). Расширенная 64-битовая (Pentium) шина данных Шина данных является главной магистралью, которая передает информацию между процессором и подсистемой памяти. Увеличение разрядности шины данных существенно повышает скорость передачи данных. Режимы работы микропроцессора Реальный режим Защищенный режим Режим виртуального 8086 Реальный режим Это режим работы первых 16-битовых микропроцессоров. Наличие его обусловлено тем, что необходимо обеспечить в новых моделях микропроцессоров функционирование программ, разработанных для старых моделей. Любой современный микропроцессор, находясь в реальном режиме, очень мало отличается от старого (первого) i8086. Это лишь его более быстрый аналог с увеличенным (до 32 бит) размером всех регистров, кроме сегментных. Чтобы получить доступ ко всем остальным архитектурным и функциональным новшествам микропроцессора, необходимо перейти в защищенный режим. Основные характеристики реального режима объем адресуемой памяти - 1 Мб (=2**20, у них 20-разрядная шина адреса) поддерживается выполнение всего одной программы нет потребности в организации защиты программ от взаимного влияния поддерживается сегментированная модель памяти сегмент имеет длину не более 64 Кбайт адрес сегмента располагается в одном из сегментных регистров отсутствуют аппаратные средства контроля доступа к сегменту любая программа может обратиться к любому адресу в памяти. формирование физического адреса происходит по правилам реального режима: для определения физического адреса команды содержимое сегментного регистра CS умножается на 16 за счет добавления справа к младшим битам) четырех нулей, после чего к полученному значению прибавляется содержимое указателя команд (регистр IP). Получается двадцатибитовое значение (20-разрядная шина адреса). Защищенный режим (protected mode) Позволяет полностью использовать все возможности, предоставляемые микропроцессором. Все современные многозадачные ОС работают в этом режиме. Защищенный режим создан прежде всего для работы нескольких независимых программ. Для обеспечения совместной работы нескольких задач необходимо защитить их от взаимного влияния, взаимодействие задач должно регулироваться. Физический адрес формируется по принципам защищенного режима (отличны от принципов формирования адреса в реальном режиме работы!). Кроме сегментированной модели оперативной памяти возможна поддержка страничной организации памяти. Программы, разработанные для реального режима, не могут функционировать в защищенном режиме. Режим виртуального 8086 Возможна одновременная работа нескольких программ разработанных для i8086. Возможно работа программ реального режима. Физический адрес формируется по правилам реального режима. Переход в этот режим возможен, если микропроцессор уже находится в защищенном режиме. Организация оперативной памяти Физическая память, к которой микропроцессор имеет доступ по шине адреса, называется оперативной памятью (или оперативным запоминающим устройством - ОЗУ). ОП организована как последовательность байтов. Каждому байту соответствует уникальный адрес (его номер), который называется физическим адресом. Диапазон значений адресов зависит от разрядности шины адреса микропроцессора. Для i486 и Pentium он находится в диапазоне от 0 до 2**32-1 = 4 Гбайт (32разрядная шина адреса). Механизм управления памятью полностью аппаратный, т.е. программа сама не может сформировать физический адрес памяти на адресной шине. Микропроцессор аппаратно поддерживает несколько моделей использования оперативной памяти: сегментированную модель страничную модель Понятие о сегментированной модели памяти Память для программы делится на непрерывные области памяти, называемые сегментами. Сегменты - это логические элементы программы. Сама программа может обращаться только к данным, которые находятся в этих сегментах. Сегмент представляет собой аппаратном уровне блок памяти. независимый, поддерживаемый на Сегментация - механизм адресации, обеспечивающий существование нескольких независимых адресных пространств как в пределах одной задачи, так и в системе в целом для защиты задач от взаимного влияния. Замечание. Программист может либо самостоятельно разбивать программу на фрагменты (сегменты), либо автоматизировать этот процесс и возложить его на систему программирования. Для микропроцессоров Intel принят особый подход к управлению памятью. Каждая программа в общем случае может состоять из любого количества сегментов, но непосредственный доступ она имеет только к 3 основным сегментам: кода, данных и стека и к дополнительным сегментам данных (всего 3). Операционная система (а не сама программа) размещает сегменты программы в ОП по определенным физическим адресам, а значения этих адресов записывает в определенные места, в зависимости от режима работы микропроцессора: в реальном режиме адреса помещаются непосредственно в сегментные регистры (cs, ds, ss, es, gs, fs); в защищенном режиме - в специальную системную дескрипторную таблицу (Элементом дескрипторной таблицы является дескриптор сегмента. Каждый сегмент описывается дескриптором сегмента (8 байт). Существует три дескрипторные таблицы. Адрес каждой таблицы записывается в специальный системный регистр). Для доступа к данным внутри сегмента обращение производится относительно начала сегмента линейно, т.е. начиная с 0 и заканчивая адресом, равным размеру сегмента. Этот адрес называется смещением (offset). Таким образом, для обращения к конкретному физическому адресу ОП необходимо определить адрес начала сегмента и смещение внутри сегмента. Физический адрес принято записывать парой этих значений, разделенных двоеточием segment : offset Например, 0040:001Ch; 0000:041Ch; 0020:021Ch; 0041:000Ch. Каждый сегмент описывается дескриптором сегмента. ОС строит для каждого исполняемого процесса соответствующую таблицу дескрипторов сегментов и при размещении каждого из сегментов в ОП или внешней памяти в дескрипторе отмечает его текущее местоположение (бит присутствия). Дескриптор содержит поле адреса, с которого сегмент начинается и поле длины сегмента. Благодаря этому можно осуществлять контроль 1) размещения сегментов без наложения друг на друга 2) обращается ли код исполняющейся задачи за пределы текущего сегмента. В дескрипторе содержатся также данные о правах доступа к сегменту (запрет на модификацию, можно ли его предоставлять другой задаче) защита. Достоинства: 1) общий объем виртуальной памяти превосходит объем физической памяти 2) возможность размещать в памяти как можно больше задач (до определенного предела) увеличивает загрузку системы и более эффективно используются ресурсы системы Недостатки: 1) увеличивается время на доступ к искомой ячейке памяти, т.к. должны вначале прочитать дескриптор сегмента, а потом уже, используя его данные, можно вычислить физический адрес (для уменьшения этих потерь используется кэширование - дескрипторы, с которыми работа идет в данный момент размещаются в сверхоперативной памяти - в специальных регистрах процессора); 2) фрагментация; 3) потери памяти на размещение дескрипторных таблиц 4) потери процессорного времени на обработку дескрипторных таблиц. Сегментированная модель памяти поддерживается и в реальном, и в !защищенном режимах работы микропроцессора. Понятие о страничной модели памяти Это надстройка над сегментной моделью. Вся оперативная память делится на блоки фиксированного размера 4 Кб (должно быть число, кратное степени двойки, чтобы операции сложения можно было бы заменить на операции конкатенации). Каждый такой блок называется страницей. Их число 1.048.576 4 Гб адресуемой памяти. Основное применение этой модели связано с организацией виртуальной памяти. Для того, чтобы использовать для работы программ пространство памяти большее, чем объем физической памяти используется механизм виртуальной памяти. Суть его заключается в том, что у микропроцессора существует возможность по обмену страницами памяти с жестким диском. Если программа требует памяти больше, чем объем физической памяти, редко используемые страницы памяти записываются на жесткий диск в специальный файл виртуальной памяти (файл обмена, или страничный файл, или файл подкачки, чаще swap-файлом, подчеркивая, что страницы этого файла замещают друг друга в ОП). Замечание. В некоторых ОС выгруженные страницы располагаются не в файле, а в специальном разделе диска, например, в ОС UNIX есть специальный раздел, но могут использоваться и файлы, если не достаточно объема раздела. В настоящее время файл подкачки может динамически изменять свой размер в зависимости от потребностей системы. Для i486 и Pentium размер возможной виртуальной памяти может достигать 4 Тб (терабайт). Обратим внимание на то, что программа также разбивается на фрагменты страницы. Все фрагменты программы одинаковой длины, кроме последней страницы. Говорят, что память разбивается на физические страницы, а программа - на виртуальные страницы. Трансляция (отображение) виртуального адресного пространства задачи на физическую память осуществляется с помощью таблицы страниц. Для каждой текущей задачи создается таблица страниц. Диспетчер памяти для каждой страницы формирует соответствующий дескриптор. Дескриптор содержит так называемый бит присутствия. Если он = 1, это означает, что данная страница сейчас размещена в ОП. Если он = 0, то страница расположена во внешней памяти. Защита страничной памяти основана на контроле уровня доступа к каждой странице. Каждая страница снабжается кодом уровня доступа (только чтение; чтение и запись; только выполнение). При работе со страницей значение кода разрешенного уровня доступа сравнивается с фактически требуемым. При несовпадении работа программы прерывается. Страничная модель памяти поддерживается только в защищенном режиме !работы микропроцессора. Основное достоинство страничного способа распределения памяти минимально возможная фрагментация (эффективное распределение памяти). Недостатки: 1) потери памяти на размещение таблиц страниц 2) потери процессорного времени на обработку таблиц страниц (диспетчер памяти). 3) Программы разбиваются на страницы случайно, без учета логических взаимосвязей, имеющихся в коде межстраничные переходы осуществляются чаще, чем межсегментные + трудности в организации разделения программных модулей между выполняющими процессами Чтобы избежать недостатка №3 был предложен сегментно-страничный способ распределения памяти. Сегментно-страничный способ распределения памяти Программа разбивается на сегменты. Адрес, по-прежнему, состоит из двух частей - сегмент + смещение. Но смещение относительно начала сегмента может состоять из двух полей: виртуальной страницы и индекса. Для доступа к памяти необходимо: 1) вычислить адрес дескриптора сегмента и причитать его; 2) вычислить адрес элемента таблицы страниц этого сегмента и извлечь из памяти необходимый элемент; 3) к номеру (адресу) физической страницы приписать номер (адрес) ячейки в странице. Задержка в доступе к памяти (в три раза больше, чем при прямой адресации). Чтобы избежать этого вводится кэширование (кэш строится по ассоциативному принципу). Плоская модель памяти Если считать, что задача состоит из одного сегмента, который, в свою очередь, разбит на страницы, то фактически мы получаем только один страничный механизм работы с виртуальной памятью. Это подход называется плоской памятью. Достоинства: При использовании плоской модели памяти упрощается создание и ОС, и систем программирования; уменьшаются расходы памяти на поддержку системных информационных структур В абсолютном большинстве современных 32-разрядных микропроцессоров Intel) используется плоская модель памяти. ОС (для Набор регистров микропроцессора Набор регистров микропроцессора содержит 32 регистра в той или иной мере доступных для использования программистом. Данные регистры подразделяются на две большие группы: •16 пользовательских регистров; •16 системных регистров. В программах на языке ассемблера регистры используются очень интенсивно. Большинство регистров имеют определенное функциональное назначение. Пользовательские регистры Пользовательскими регистры называются потому, что программист может использовать их при написании своих программ. К этим регистрам относятся: • восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (их еще называют регистрами общего назначения): • eax/ax/ah/al; • ebx/bx/bh/bl; • edx/dx/dh/dl; • ecx/cx/ch/cl; • ebp/bp; • esi/si; • edi/di; • esp/sp. • шесть сегментных регистров: cs, ds, ss, es, fs, gs; • регистр состояния (регистр флагов) eflags/flags; • регистр управления (указателя команды) eip/ip. Здесь наклонной разделительной чертой обозначены части одного большого 32разрядного регистра. Их можно использовать в программе как отдельные объекты. Заметим, что использовать для самостоятельной адресации можно только младшие 16 и 8-битные части этих регистров. Старшие 16 бит этих регистров как самостоятельные объекты недоступны. Так сделано для обеспечения работоспособности программ, написанных для младших 16разрядных моделей микропроцессоров фирмы Intel, начиная с i8086. Микропроцессоры i486, Pentium и выше имеют в основном 32-разрядные регистры. Их количество, за исключением сегментных регистров, такое же, как и у i8086, но размерность больше, что и отражено в их обозначениях — они имеют приставку e (Extended). Регистры общего назначения Все регистры этой группы позволяют обращаться к своим “младшим” частям. Так как эти регистры физически находятся в микропроцессоре внутри арифметикологического устройства (АЛУ), то их еще называют регистрами АЛУ: • eax/ax/ah/al (Accumulator register) — аккумулятор. Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно; • ebx/bx/bh/bl (Base register) — базовый регистр. Применяется для хранения базового адреса некоторого объекта в памяти; • ecx/cx/ch/cl (Count register) — регистр-счетчик. Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды. К примеру, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx; • edx/dx/dh/dl (Data register) — регистр данных. Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно. Следующие два регистра используются для поддержки так называемых цепочечных операций (операций со строками), то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит: • esi/si (Source Index register) — индекс источника. Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике; • edi/di (Destination Index register) — индекс приемника (получателя). Этот регистр в цепочечных операциях содержит текущий адрес в цепочкеприемнике. В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком в системе команд микропроцессора есть специальные команды, а в программной модели микропроцессора для этого существуют специальные регистры: • esp/sp (Stack Pointer register) — регистр указателя стека. Содержит указатель вершины стека в текущем сегменте стека. • ebp/bp (Base Pointer register) — регистр указателя базы кадра стека. Предназначен для организации произвольного доступа к данным внутри стека. Некоторые команды действительно используют фиксированные регистры для выполнения своих действий. Использование жесткого закрепления регистров для некоторых команд позволяет более компактно кодировать их машинное представление. Но на самом деле, большинство из регистров могут использоваться при программировании для хранения операндов практически в любых сочетаниях. Сегментные регистры В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs. Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Соответственно, такая организация памяти называется сегментной. !!! Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, в этих регистрах содержатся адреса памяти с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов: 1. Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр cs (code segment register) — сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (то есть эти команды загружаются в конвейер микропроцессора). 2. Сегмент данных. Содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр ds (data segment register) — сегментный регистр данных, который хранит адрес сегмента данных текущей программы. 3. Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) — сегментный регистр стека, содержащий адрес сегмента стека. 4. Дополнительные сегменты данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds. Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers). Регистры состояния и управления В микропроцессор включены несколько регистров, которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся: • регистр флагов eflags/flags; • регистр указателя команды eip/ip. Используя эти регистры, можно получать информацию о результатах выполнения команд и влиять на состояние самого микропроцессора. Регистр флагов Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086. Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы: • 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд. Флаги состояния регистра eflags отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов и вызовов подпрограмм. Например, cf - Флаг переноса (Carry Flag) pf - Флаг паритета (Parity Flag) zf - Флаг нуля (Zero Flag) sf - Флаг знака (Sign Flag) of - Флаг переполнения (Overflow Flag) и другие. • 1 флаг управления - df (Directory Flag). Используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1). • 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086. !!! Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это приведет к прерыванию работы программы. Например, tf - Флаг трассировки (Trace Flag) Предназначен для организации пошаговой работы микропроцессора. if - Флаг прерывания (Interrupt enable Flag) Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний (прерываний по входу INTR): 1 — аппаратные прерывания разрешены; 0 — аппаратные прерывания запрещены и другие. Регистр-указатель команд Регистр eip/ip имеет разрядность 32/16 бит и содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. !!! Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip. ********************************************************************* ************ ДОПОЛНИТЕЛЬНЫЙ МАТЕРИАЛ Системные регистры микропроцессора Они выполняют специфические функции в системе. Использование системных регистров жестко регламентировано. Именно они обеспечивают работу защищенного режима. Системные регистры подразделяются на три группы: • четыре регистра управления; • четыре регистра системных адресов; • восемь регистров отладки. Регистры управления В группу регистров управления входят 4 регистра: cr0, cr1, cr2, cr3. Эти регистры предназначены для общего управления системой. !!! Регистры управления доступны только программам с уровнем привилегий 0. Хотя микропроцессор имеет четыре регистра управления, доступными являются только три из них — исключается cr1, функции которого пока не определены (он зарезервирован для будущего использования). Регистр cr0 содержит системные флаги, управляющие режимами работы микропроцессора и отражающие его состояние глобально, независимо от конкретных выполняющихся задач. Назначение некоторых системных флагов: • pe (Protect Enable), бит 0 — разрешение защищенного режима работы. Состояние этого флага показывает, в каком из двух режимов — реальном (pe=0) или защищенном (pe=1) — работает микропроцессор в данный момент времени. • mp (Math Present), бит 1 — наличие сопроцессора. Всегда 1. • ts (Task Switched), бит 3 — переключение задач. Процессор автоматически устанавливает этот бит при переключении на выполнение другой задачи. • cd (Cache Disable), бит 30, — запрещение кэш-памяти. С помощью этого бита можно запретить (cd = 1) или разрешить (cd = 0) использование внутренней кэш-памяти (кэш-памяти первого уровня). • pg (PaGing), бит 31, — разрешение (pg = 1) или запрещение (pg = 0) страничного преобразования. Флаг используется при страничной модели организации памяти. Регистры cr2 и cr3 используются при страничной организации памяти. Регистры системных адресов Эти регистры еще называют регистрами управления памятью. Они предназначены для защиты программ и данных в защищенном режиме работы микропроцессора. При работе в защищенном режиме микропроцессора адресное пространство делится на: • глобальное — общее для всех задач; • локальное — отдельное для каждой задачи. Этим разделением и объясняется присутствие в архитектуре микропроцессора следующих системных регистров: • регистра таблицы глобальных дескрипторов gdtr (Global Descriptor Table Register); • регистра таблицы локальных дескрипторов ldtr (Local Descriptor Table Register); • регистра таблицы дескрипторов прерываний idtr (Interrupt Descriptor Table Register); • регистра задачи tr (Task Register). Этот дескриптор описывает текущий сегмент состояния задачи (TSS — Task Segment Status). Этот сегмент создается для каждой задачи в системе, имеет жестко регламентированную структуру и содержит контекст (текущее состояние) задачи. Основное назначение сегментов TSS — сохранять текущее состояние задачи в момент переключения на другую задачу. Регистры отладки Это группа регистров, предназначенных для аппаратной отладки. Средства аппаратной отладки впервые появились в микропроцессоре i486. Аппаратно микропроцессор содержит восемь регистров отладки, но реально из них используются только 6. Регистры dr0, dr1, dr2, dr3 предназначены для задания адресов четырех точек прерывания. Используемый при этом механизм следующий: любой формируемый текущей программой адрес сравнивается с адресами в регистрах dr0...dr3, и при совпадении генерируется исключение отладки с номером 1. Регистр dr6 называется регистром состояния отладки. Биты этого регистра устанавливаются в соответствии с причинами, которые вызвали возникновение последнего исключения с номером 1. Регистр dr7 называется регистром управления отладкой. В нем для каждого из четырех регистров контрольных точек отладки имеются поля, с помощью которых можно уточнить место регистрации контрольной точки (только в текущей задаче или в любой задаче) и тип доступа, по которому инициируется прерывание (только при выборке команды, при записи или при записи/чтении данных). Заметим, что большинство из системных регистров программно доступны. Система прерываний Прерывание означает временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызываемых работой аппаратуры или программы. Т.е. это процесс, временно переключающий микропроцессор на выполнение другой программы (так называемый обработчик прерывания) с последующим возвратом к прерванной программе. Адрес программы-обработчика прерывания вычисляется по таблице векторов прерываний. Механизм прерываний поддерживается на аппаратном уровне. В зависимости от источника, прерывания делятся на аппаратные - возникают как реакция микропроцессора на физический сигнал от некоторого устройства (клавиатура, системные часы, клавиатура, жесткий диск и т.д.), по времени возникновения эти прерывания асинхронны, т.е. происходят в случайные моменты времени; программные - вызываются искусственно с помощью соответствующей команды из программы (int), предназначены для выполнения некоторых действий операционной системы., являются синхронными; исключения - являются реакцией микропроцессора на нестандартную ситуацию, возникшую внутри микропроцессора во время выполнения некоторой команды программы. По другой классификации прерывания делятся на внешние - вызываются внешними по отношению к микропроцессору событиями (по существу - это группа аппаратных прерываний) Вложенных прерываний нет! внутренние - возникают внутри микропроцессора во время вычислительного процесса (по существу - это исключительные ситуации и программные прерывания). Замечание!!! В реальном и защищенном режиме работы микропроцессора обработка прерываний осуществляется принципиально разными методами. Система прерываний - это совокупность программных и аппаратных средств, реализующих механизм прерываний. К аппаратным средствам системы прерываний относятся: выводы микропроцессора (INTR, INTA, NMI) программируемый контроллер прерываний 8259А (предназначен для фиксирования сигналов прерываний от восьми различных внешних устройств; он выполнен в виде микросхемы; обычно используют две последовательно соединенные микросхемы, поэтому кол-во возможных источников внешних прерываний до 15 плюс одно немаскируемое прер.; именно он формирует номер вектора прерывания и выдает его шину данных); внешние устройства К программным средствам системы прерываний Реального режима относятся: таблица векторов прерываний. Первый килобайт ОП (адреса 00000h-003FFh) занимает таблица векторов прерываний. Она содержит адреса (векторы) обработчиков прерываний и состоит из 256 (0..255) элементов по 4 байта каждый. два флага в регистре флагов flags/eflags: IF (Interrupt Flag) - флаг прерывания. Предназначен для маскирования (запрещения) аппаратных прерываний. Если IF=1, микропроцессор обрабатывает внешние прерывания, если = 0, то игнорирует; TF(Trace Flag) - флаг трассировки. Если он=1, то микропроцессор переходит в режим покомандной работы. В этом режиме в микропроцессоре генерируется внутреннее прерывание с номером 1; машинные команды микропроцессора: int, into, iret, cli, sti Обработка прерывания в реальном режиме производится в три этапа: 1) прекращение выполнения текущей программы; Должно произойти так, чтобы потом вернуться и продолжить работу. Для этого необходимо сохранить содержимое регистров, так как они являются ресурсами, разделяемыми между программами. Обязательными для сохранения являются регистры cs, ip, flags (пара CS:IP содержит адрес команды, с которой необходимо начать выполнение после возврата, flags - состояние флагов после выполнения последней команды прерванной программы). !!! Эти регистры сохраняются микропроцессором автоматически. Сохранение остальных регистров - должно обеспечиваться программистом !!! Наиболее удобным местом хранения регистров является стек. После сохранения регистров в стеке микропроцессор сбрасывает бит флага IF (т.е.=0) (!!! В стеке при этом записан регистр flags с еще установленным IF!!!) Этим предотвращается возможность возникновения вложенных внешних прерываний и порча регистров исходной программы вследствие неконтролируемых действий со стороны программы - обработчика вложенного прерывания. После того как необходимые действия по сохранению контекста завершены, обработчик аппаратного прерывания может разрешить вложенные прерывания командой sti. 2) переход к выполнению и выполнение программы обработки прерывания; Здесь определяется источник прерывания и вызывается соответствующий обработчик прерывания. В реальном режиме микропроцессора допускается 256 источников - по кол-ву элементов таблицы векторов прерываний. Структура элемента: 2 байта - значение смещения начала программы-обработчика прерывания от начала кодового сегмента 2 байта - значение базового адреса сегмента, в котором находится программа-обработчик. Как определить адрес, по которому находится вектор прерывания с номером N ? смещение эл-та таблицы векторов прерываний = N * 4 Полный размер таблицы ? 4*256=1024 Итак на втором этапе микропроцессор 1. По номеру источника прерывания определяет смещение в таблице векторов прерываний 2. Помещает первые два байта в регистр IP 3. Помещает вторые два байта в регистр CS 4. Передыет управление по адресу CS:IP Далее выполняется сама программа обработки прерывания. (Она тоже может быть прервана поступлением запроса от более приоритетного источника. Все источники прерывания имеют приоритеты.) 3) возврат управления прерванной программе. Необходимо привести стек в состояние, в котором он был сразу после передачи управления данной процедуре. Для этого программист должен указать необходимые действия по восстановлению регистров и очистке стека. !! Этот участок необходимо защитить от возможного искажения содержимого регистров (в результате появления аппаратного прерывания) с помощью команды cli. Последние команды в в обработчике прерывания - sti, iret sti - разрешить аппаратные прерывания (устанавливает флаг IF=1, не имеет операндов). iret - извлечь последовательно три слова из стека и поместить их соответственно в регистры ip, cs, flags. Аппаратные прерывания могут быть инициированы программно командой микропроцессора int n ; где n - номер ап. прер. в соответствии с табл.векторов прер. Программные прерывания Обработка машинной команды int n - это программное прерывание. С помощью программных прерываний программист может обратиться в нужное для него время за обслуживанием своих запросов либо к ОС, либо к BIOS, либо к собственным обработчикам прерываний. В качестве примера напомним работу с функциями прерывания 21h (DOS) Прерывание 21h (DOS) предназначено для предоставления программисту различных услуг со стороны DOS. Этими услугами является набор функций. 00h - завершение работы программы 01h - ввод символа с ожиданием и эхосопровождением. На выходе в AL - ACSII-код символа. 02h - вывод символа. На входе в DL - ACSII-код символа 05h - вывод символа на принтер. На входе в DL - ACSII-код символа 07h ввод символа с ожиданием и эхосопровождением. 08h На выходе в AL - ACSII-код символа. 08h при вводе проверяет, не нажато ли CTRL+BREAK 09h - вывод строки на экран. На входе - ds:dx =адресу строки с символом $ на конце 0ah - ввод строки с клавиатуры. На входе ds:dx =адрес буфера с форматом: 1 байт - размер буфера для ввода (формирует пользователь) 2 байт - число фактически введенных символов (заполняет с-ма по окончанию ввода-нажатию Enter (0dh), этот символ не считает) 3 байт и далее - введенная строка с символом 0dh на конце На выходе - введенная строка в буфере 0bh - проверка состояния буфера клавиатуры На выходе AL=0 - буфер пуст AL=offh - в буфере есть символы Последовательность действий при использовании этих функций: 1. Поместить номер функции в регистр AH 2. Поместить передаваемые функции параметры в определенные регистры (для каждой ф-ции соответствующие) 3. Вызвать прерывание командой int 21h 4. Извлечь рез-ты работы функции из определенных регистров Пример1. Вывод строк на экран masm model small .stack 100h .data message1 db 'Это первая строка’,’$' message2 db 'Это вторая строка $' .code start: mov ax,@data mov ds,ax mov ah,09h end mov int mov int mov int start dx,offset message1 21h dx,offset message2 21h ax,4c00h ; стандартный выход - ah=00h 21h Пример2. Ввод двух символов с клавиатуры main : ... mov ah,1h ; номер функции в необх.регистр int 21h ; ввод первого символа mov dl,al ; освобождаем al для ввода второго символа ... ; обрабатываем первый символ, если необходимо int 21h ; ввод второго символа ... mov ax,4c00h ;пересылка 4c00h в регистр ax int 21h ;вызов прерывания с номером 21h end main ;конец программы с точкой входа main ДОПОЛНИТЕЛЬНЫЙ МАТЕРИАЛ Обработка прерываний в защищенном режиме Обработка прерываний в защищенном режиме отличается от обработки в реальном режиме так же сильно, как и защищенный режим отличается от реального. Потому что: 1. В защищенном режиме немного изменено распределение номеров векторов прерываний. (Можно самостоятельно посмотреть по таблицам, например, в книге Аssembler Юрова, Хорошенко на стр. 439-441) 2. Принципиально иным является механизм обработки прерываний. Классификация прерываний в защищенном режиме Прерывания и исключения можно разделить на несколько групп: 1) сбой; 2) ловушка; 3) аварийное завершение. Это деление производится в соответствии со следующими признаками: какая информация сохраняется о месте возникновения прерывания (исключения)? возможно ли возобновление прерванной программы? Исходя из этих признаков, можно дать следующие характеристики вышеперечисленным группам: Сбой (ошибка) — прерывание или исключение, при возникновении которого в стек записываются значения регистров cs: ip, указывающие на команду, вызвавшую данное прерывание. Это позволяет, получив доступ к сегменту кода, исправить ошибочную команду в обработчике прерывания и, вернув управление программе, фактически осуществить ее рестарт (вспомните, что в реальном режиме при возникновении прерывания в стеке всегда запоминается адрес команды, следующей за той, которая вызвала это прерывание). Ловушка — прерывание или исключение, при возникновении которого в стек записываются значения регистров cs: ip, указывающие на команду, следующую за командой, вызвавшей данное прерывание. Так же, как и в случае ошибок возможен рестарт программы. Для этого необходимо лишь исправить в обработчике прерывания соответствующие код или данные, послужившие источником ошибки. После этого перед возвратом управления нужно скорректировать значение ip в стеке на длину команды, вызвавшей данное прерывание. Механизм ловушек похож на механизм прерываний в реальном режиме, хотя не во всем. Здесь есть один тонкий момент. Если прерывание типа ловушки возникло в команде передачи управления jmp, то содержимое пары cs: ip в стеке будет отражать результат этого перехода, то есть соответствовать команде назначения. Аварийное завершение — прерывание, при котором информация о месте его возникновения недоступна или неполна и поэтому рестарт практически невозможен, если только данная ситуация не была запланирована заранее. соответствующие программы-обработчики ошибок, ловушек и аварий будут отличаться алгоритмами работы. Микропроцессор жестко определяет, какие прерывания являются ошибками, ловушками и авариями. Таблица дескрипторов прерываний IDT Вместо таблицы векторов прерываний система прерываний имеет дело с таблицей дескрипторов прерываний (IDT, interrupt descriptor table) Таблица IDT связывает каждый вектор прерывания с дескриптором процедуры или задачи, которая будет обрабатывать это прерывание. Элементами таблицы IDT являются дескрипторы - Размер дескриптора = 8 байтам. Дескрипторы в таблице прерываний обычно называются шлюзами (иногда коммутаторами). Шлюзы предназначены для указания точки входа в программу обработки прерывания. В дескрипторной таблице прерываний IDT могут содержаться шлюзы трех типов: шлюз ловушки; шлюз прерывания; шлюз задачи. Физически микропроцессор отличает шлюзы по содержимому полей. Адрес и длина таблицы IDT содержатся в системном регистре idtr. Заметим, что в реальном режиме регистр idtr также содержит адрес таблицы прерываний, но при этом каждый вектор занимает 4 байта и содержит 32-разрядный адрес в формате CS:IP. Начальное значение этого регистра равно нулю, но внего можно занести и другое значение. Возможно произвольное размещение в памяти этой таблицы не только в защищенном режиме, но и реальном. Обобщенная схема обработки прерывания в защищенном режиме При возникновении прерывания от источника с номером п микропроцессор, находясь в защищенном режиме, выполняет следующие действия: 1. Определяет местонахождение таблицы IDT, адрес и размер которой содержится в регистре idtr. 2. Складывает значение адреса, по которому размещена IDT, и значение n*8. По данному смещению в таблице IDT должен находиться 8-байтовый дескриптор, определяющий местоположение процедуры обработки прерывания. 3. Переключается на процедуру обработки прерывания.