- •Предисловие
- •Введение
- •1. Системный анализ задачи - выделяются процессы и функции, реализация которых будет возложена на мк или ип.
- •Алгоритмизация процессов и функций - разрабатываются алгоритмы решения задачи.
- •Области использования мк
- •Глава 1основы микропроцессорной техники
- •1.1. Классификация микропроцессоров, основные варианты их архитектуры и структуры
- •1.2. Общая структура и принципы функционирования микропроцессорных систем
- •1.3. Система команд и способы адресации операндов
- •Начиная с младшего байта («Little-Endian»);
- •Начиная со старшего байта («Big-Endian»).
- •1.4. Интерфейсы микропроцессорных систем
- •1.4.1. Основные понятия
- •1.4.2. Магистраль vme
- •Verbs находит широкое применение в:
- •VmEbus обеспечивает наилучшее соотношение цена - производительность для системы в целом и предоставляет практически неограниченные возможности наращивания всех ресурсов.
- •1.5. Шина usb
- •На их основе
- •2.1. Структура и функционирование процессоров intel p6
- •2.1.1. Суперскалярная архитектура и организация конвейера команд
- •2.1.2. Режимы работы процессора и организация памяти
- •2.1.3. Регистровая модель
- •1. Функциональные основные регистры:
- •Iopl -уровень привилегий ввода/вывода, задает максимальную величину уровня привилегий текущей программы, при котором разрешается выполнение команд ввода/вывода;
- •2.3 Режимы работы процессора
- •2.1.4. Внутренняя кэш-память
- •8 Зон по 64 Кбайт, занимающих диапазон адресов 0-7fffFh (512 Кбайт);
- •16 Зон по 16 Кбайт, занимающих диапазон адресов 80000h-8ffffh (256 Кбайт);
- •8 Зон размером от 4 Кбайт до максимального размера физической памяти, которые могут размещаться в любой позиции адресного пространства.
- •2.1.5. Форматы команд и способы адресации
- •Содержимого базового регистра евр (вр) или евх (вх);
- •Содержимого индексного регистра esi (si) или edi (di);
- •Disp команды (см. Рис. 2.11).
- •2.2. Система команд: операции над целыми числами
- •Пересылка данных и адресов
- •Xchg - Обмен между регистрами или памятью и регистром
- •Xlat-Преобразование кодов
- •Imul-Знаковое (целочисленное) умножение аам- ascii-коррекция результата умножения
- •Idiv-Знаковое (целочисленное) деление
- •2.2.1. Команды пересылки
- •2.2.2. Команды арифметических операций
- •2.2.3. Команды логических операций и сдвигов
- •2.2.4. Команды битовых и байтовых операций
- •2.2.5. Команды операций со строками символов
- •2.3. Система команд: операции управления
- •Управление программой
- •Прерывания
- •Int3 - Прерывание в контрольной точке
- •Iret-Возврат из подпрограммы обслуживания прерывания
- •2.3.1. Команды управления программой
- •2.3.3. Команды организации защиты памяти
- •2.3.4. Команды управления процессором
- •2.3.5. Префиксные байты
- •2.4. Система команд: операции над числами с плавающей точкой
- •2.4.3. Команды пересылки данных
- •2.4.4. Команды арифметических операций
- •2.4.6. Команды специальных операций
- •2.4.7. Команды управления fpu
- •Команды преобразования
- •Арифметические команды
- •Inub'- Нахождение меньшего значения (беззнаковые байты) Команды сравнения
- •Команды логических операций
- •2.5.1. Форматы представления данных и выполнение операций
- •2.5.2. Команды пересылки и преобразования данных
- •1 2.5.3. Команды арифметических операций '
- •2.5.4. Команды логических операций и сдвигов
- •2.5.5. Команды сравнения и нахождения максимума/минимума
- •2.6. Система команд: операции sse
- •Команды пересылки данных
- •Команды преобразования данных
- •Арифметические команды
- •Команды нахождения максимума и минимума.
- •Команды преобразования формата чисел.
- •Команды управления
- •2.6.1. Форматы представления данных и выполнение операций
- •2.6.2. Команды пересылки и преобразования данных
- •2.6.3. Команды арифметических операций
- •2.6.6. Команды преобразования формата чисел
- •2.6.7. Команды управления
- •2.6.8. Команды пересылки данных с управлением кэшированием
- •2.7. Работа процессора в защищенном и реальном режимах
- •2.7.1. Сегментация памяти в защищенном режиме
- •2.7.2. Страничная организация памяти
- •2.7.3. Защита памяти
- •2.7.4. Поддержка многозадачного режима
- •2.7.5. Реализация режима виртуального 8086 (v86)
- •2.7.6. Функционирование процессора в реальном режиме
- •2.8. Реализация прерываний и исключений. Обеспечение тестирования и отладки
- •2.8.1. Виды прерываний и исключений, реализация их обслуживания
- •2.8.2. Причины возникновения исключений
- •2.8.3. Средства обеспечения отладки
- •2.8.4. Реализация тестирования и контроля функционирования
- •2.9. Risc-микропроцессоры и risc-микроконтроллеры семейств powerpc (мрс60х, мрс50х)
- •2.9.1. Risc-микропроцессоры семейства мрс60х (powerpc)
- •I (invalid) - недостоверное (аннулированное) содержимое строки.
- •2.9.2. Risc-микроконтроллеры семейства мрс5хх ( power pc)
- •3.1. Общие принципы организации кэш-памяти
- •3.1.1. Понятия тега, индекса и блока
- •3.1.2. Механизм кэш-памяти с прямым отображением данных
- •3.1.3. Механизм кэш-памяти
- •3.1.4. Обновление информации в кэш-памяти
- •1.5. Согласованность кэш-памяти
- •3.2.2. Внутренние кэш-памяти команд и данных
- •3.2.3. Алгоритм кэш-замещений
- •3.2 4. Состояния кэш-памяти данных
- •1.При блокированном чтении:
- •3.2.5. Согласованность внутренних кэш-памятей
- •1) Хранить таблицы страниц и директорий в не копируемой в кэш-память области основной памяти или использовать режим сквозной записи страниц;
- •Процессор может быть заменен (возможен upgraded) без изменения памяти и других подсистем мп вс;
- •Без особого снижения общих характеристик системы могут быть использованы более медленные и менее емкие устройства памяти и устройства ввода/вывода.
- •3.3. Функционирование памяти
- •1) Трансляция сегмента, при которой логический адрес, состоящий из селектора сегмента и смещения (относительного адреса внутри сегмента), преобразуется в линейный адрес.
- •3.3.1. Трансляция сегментов
- •Глобальной таблице дескрипторов (gdt);
- •Локальной таблице дескрипторов (ldt).
- •3.3.2. Адресация физической памяти
- •3.3.4. Комбинирование сегментной и страничной трансляции
- •3.4. Защита памяти
- •3.4.1. Зачем нужна защита?
- •Устанавливает различие между разными форматами дескрипторов;
- •Специфицирует функциональное назначение сегмента.
- •1 Поле предела называют также полем границы.
- •2 Байты сегмента размещены в оп в порядке возрастания адресов памяти или в обратном порядке. Такое размещение также называют соответственно по принципу «младший» и «старший крайний».
- •Cpl (текущий уровень привилегий);
- •Rpl (уровень привилегий источника обращений к сегменту) из селектора, используемый для спецификации сегмента назначения;
- •3)Dpl дескриптора сегмента назначения.
- •Загрузить регистр сегмента данных селектором несогласованного, с разрешением чтения кодового сегмента;
- •Загрузить регистр сегмента данных селектором кодового сегмента, который является согласованным и разрешенным для чтения;
- •Использовать префикс переопределения cs, чтобы прочитать разрешенный для чтения кодовый сегмент, селектор которого уже загружен в cs регистр.
- •Для команды call (или для команды jmp для согласованного сегмента) должны быть выполнены следующие правила привилегий:
- •Привилегированные команды, которые нужны для систем управления вычислительным процессом;
- •Чувствительные команды (Sensitive Instructions), которые используются для ввода/вы вода и для действий, связанных с вводом/выводом.
- •1) Проверка того, имеет ли назначение, специфицированное указателем право доступа к
- •Проверка того, соответствует ли тип сегмента заданному использованию;
- •Проверка указателя на соответствие границе сегмента.
- •Verw (Verify for Writing) - проверка доступности по записи обеспечивает те же самые возможности, что и verr для проверки доступности по чтению.
- •3.4.4. Уровень защиты страниц
- •1) Ограничение адресуемой области; 2) проверка типа страницы.
- •3.4.5. Комбинирование защиты сегментов и страниц
- •Глава 4
- •4.1. Структура современных 8-разрядных микроконтроллеров
- •4.1.1. Модульный принцип построения
- •Tiny avr - mk в 8-выводном корпусе низкой стоимости;
- •Classic avr - основная линия мк с производительностью до 16 mips, Flash память программ объемом до 8 Кбайт и статическим озу данных 128. ..512 байт;
- •Mega avr - мк для сложных приложений, требующих большого объема памяти (Flash пзу до 128 Кбайт), озу до 4 Кбайт, производительностью до 6 mips.
- •4.1.4. Резидентная память мк
- •4.1.5. Порты ввода/вывода
- •Однонаправленные порты, предназначенные в соответствие со спецификацией мк только для ввода или только для вывода информации.
- •Двунаправленные порты, направление передачи которых (ввод или вывод) определяется в процессе инициализации системы.
- •4.1.6. Таймеры и процессоры событий
- •Импульсную последовательность с выхода управляемого делителя частоты fBijs;
- •Внешнюю импульсную последовательность, поступающую на один из входов мк.
- •Простое увеличение числа модулей таймеров; этот путь характерен для части мк компаний «Pfilips» и «Atmel» со структурой msc-51, для мк компаний «Mitsubishi» и «Hitachi».
- •Изменение логического уровня с 0 на 1 (нарастающий фронт сигнала);
- •Изменение логического уровня с 1 на 0 (падающий фронт сигнала);
- •Любое изменение логического уровня сигнала.
2.7.4. Поддержка многозадачного режима
Многозадачностью называется такой способ организации работы системы, при котором в ее памяти одновременно содержатся программы и данные для выполнения нескольких процессов обработки информации (задач). При этом должна обеспечиваться взаимная защита программ и данных, относящихся к различным задачам, а также возможность перехода от выполнения одной задачи к другой (переключение задач). Процессоры семейства Р6 имеют эффективные средства поддержки многозадачного режима, реализующие защиту и быстрое переключение задач. В качестве таких средств используется специальная структура данных, организованная в виде сегмента, который называется сегментом состояния задачи TSS. Аппаратными средствами для поддержки многозадачности служит 16-разрядный регистр задачи TR, в который заносится селектор дескриптора TSS, и связанный с TR программно недоступный 64-разрядный регистр, в который из GDT загружается 8-байтовый дескриптор TSS.
Сегмент состояния задачи TSS, структура которого показана на рис. 2.51, состоит из двух частей. Обязательная часть TSS объемом 104 байта содержит всю информацию, необходимую процессору для решения данной задачи. Дополнительная часть может содержать какую-либо информацию об этой задаче, используемую операционной системой (имя задачи, комментарии и т. д.), и битовые карты, одна из которых определяет номера прерываний, для которых реализуется виртуализация, другая указывает адреса устройств ввода-вывода, к которым разрешено обращение при выполнении данной задачи. Рассмотрим содержание обязательной части сегмента TSS.
Первые два байта в сегменте TSS используются для хранения селектора TSS предыдущей задачи, при выполнении которой произошел вызов данной задачи. В эти байты заносится содержимое регистра TR для предыдущей задачи, чтобы обеспечить возврат к ее выполнению. Поэтому данный селектор называется селектором возврата. Отдельные поля TSS хранят содержимое сегментных регистров ES, CS, SS, DS, FS, GS, регистров общего назначения ЕАХ, ЕСХ, EDX, EBX, ESP, EBP, ESI, EDI, регистра флагов EFLAGS и указателя команд EIP. При переключении задач содержимое указанных полей из вызванного TSS загружается в соответствующие регистры процессора. При следующем переключении
текущее содержимое регистров заносится в TSS данной задачи, после чего производится загрузка регистров из TSS новой задачи. Таким образом, содержимое TSS обновляется при каждом переключении задачи, фиксируя текущее состояние.
Содержимое ряда полей в обязательной части TSS не изменяется при решении задачи. Так, не изменяется содержимое поля, определяющего значение селектора LDT для данной задачи, и содержимое регистра управления CR3, которое используется при страничной организации памяти. Не изменяется также содержимое полей SSO, ESPO, SS1, ESP1, SS2, ESP2, которые определяют начальный адрес стека при переключении к задачам с более высоким уровнем привилегий PL = 0,1,2. Такое выделение отдельных стеков для задач с различными уровнями привилегий обеспечивает их более надежную защиту. Содержимое указанных полей TSS загружается в соответствующие регистры в процессе выполнения конкретной задачи.
Бит ловушки Т в сегменте TSS вызывает при Т = 1 исключение типа #DB («исключение отладки») при переключении на данную задачу. Это исключение используется при отладке программного обеспечения.
Два последних байта в обязательной части TSS определяют относительный адрес начала битовой карты ввода/вывода (БКВВ) в TSS. Каждый бит БКВВ соответствует однобайтовому порту ввода/вывода. Так как процессор обеспечивает обслуживание до 65536 портов, то полная БКВВ, определяющая возможность их обслуживания, будет представлять строку длиной 64 Кбит, занимающую 8 Кбайт памяти. Поэтому относительный адрес БКВВ должен быть меньше или равен DFFFh. При записи в бите БКВВ нуля разрешается обращение к порту ввода-вывода, адрес (номер) которого соответствует порядковому номеру данного бита в карте ввода-вывода. Если значение некоторого бита БКВВ равно единице, то при поступлении команд обращения к соответствующему порту процессор реализует исключение типа #GP («нарушение защиты»).
Таким образом, использование БКВВ вводит для команд ввода-вывода дополнительный вид защиты (помимо выполнения условия CPL<IOPL), который устанавливается для каждого порта индивидуально. Эту защиту можно обеспечить как для всех, так и для части портов. Если конец БКВВ выходит за границу сегмента, определенную его размером, который задается дескриптором TSS, то доступность соответствующих портов с высокими номерами не зависит от БКВВ. При этом БКВВ контролирует доступ только к портам с меньшими номерами, для которых биты БКВВ вошли в заданную дескриптором границу сегмента. Если значение размера сегмента, заданное дескриптором TSS, меньше указанного в TSS относительного адреса БКВВ, то эта карта не влияет на доступность портов и ее можно полностью исключить.
Перед БКВВ располагаются 32 байта (256 бит) таблицы, определяющей способ обслуживания программных прерываний, реализуемых при поступлении команды INTn в режиме виртуального процессора 8086. Каждому из 256 значений п в команде INTn соответствует бит с таким же номером в данной таблице. Если этот бит имеет значение «1», то при поступлении соответствующей команды INTn вызывается подпрограмма обслуживания в защищенном режиме, обращение к которой производится с помощью таблицы прерываний ЮТ. Если бит в этой таблице имеет значение «О», то выполняется обращение к подпрограмме обслуживания, которая должна содержаться в составе выполняемой программы, написанной для процессора 8086 (вектор соответствующей подпрограммы обслуживания должен размещаться в таблице, расположенной в начале адресуемой памяти, адреса OOOOh - OSFFh).
За последним байтом БКВВ в TSS должен следовать заключительный байт, содержащий единицу во всех разрядах (FFh). Адрес этого байта должен соответствовать границе сегмента, определенной дескриптором TSS Объем дополнительной части TSS зависит от размеров применяемой БКВВ и количества служебной информации, используемой операционной системой. Этот объем определяется характером решаемой задачи. Во многих случаях дополнительная часть TSS вообще отсутствует.
Обращение к TSS осуществляется путем загрузки в регистр TR селектора, который адресует размещенный в GDT дескриптор TSS соответствующей задачи (рис. 2.52). Содержимое регистра TR можно загружать или заносить в память командами LTR, STR. Однако обычно команда LTR используется только при инициализации системы для установки начального содержимого TR. В процессе дальнейшей работы этот регистр загружается процессором при выполнении команд JMP, CALL, IRET, переключающих задачу.
Дескриптор TSS должен храниться только в таблице GDT. Поэтому обращение к дескриптору TSS с помощью селектора, имеющего бит TI = 1 (индикатор таблицы LDT), вызовет исключение типа #TS («ошибка обращения к TSS»). При загрузке селектора дескриптора TSS в какой-либо из регистров сегментов (CS, DS, SS, ES, FS, GS) возникает исключение того же типа.
Содержимое сегмента TSS не может быть непосредственным образом считано или изменено. При необходимости считывания или изменения TSS необходимо сформировать дескриптор сегмента данных, имеющий те же атрибуты (базовый адрес, размер и другие), что и TSS. После этого содержимое TSS может быть считано или модифицировано путем обращения к сегменту TSS как сегменту данных с помощью сформированного дескриптора.
Формат дескриптора TSS приведен на рис. 2.52. Назначение битов присутствия Р и дробности G такое же, как в дескрипторах сегментов. Поле ТУРЕ (см. рис. 2.43, в) в байте доступа определяет тип задачи (см. табл. 2.59): код 01В1 указывает, что данная задача запрограммирована для решения на 16-разрядном процессоре 80286, код 11В1 - что задача предназначена для 32-разрядных процессоров 386, 486, Pentium, P6. Бит занятости В в этом байте устанавливается в состояние В = 1 при переключении на данную задачу. Указанная в дескрипторе граница сегмента TSS должна иметь значение не менее чем 67h, что соответствуют минимальному объему его обязательной части 104 байт. В противном случае при обращении к TSS реализуется исключение типа #TS. Неиспользуемый бит AVL в байте 6 дескриптора может быть использован операционной системой и установлен ею в любое состояние.
При выполнении задач, запрограммированных для решения 16-разрядным процессором 80286, структура сегмента TSS изменяется (рис. 2.53). Объем обязательной части сегмента в этом случае составляет 44 байта, и его граница должна иметь значение не менее чем 2Ch.
Переключение задач осуществляется с помощью команд межсегментного перехода JUMP, вызова CALL и возврата IRET. Если селектор (sel 16) команды JUMP или CALL выбирает из
таблицы GDI дескриптор, который содержит в поле TYPE байта доступа код 0001 (обращение кТЗЗ для процессора 80286) или 1001 (обращение kTSS для процессоров 386,486, Pentium, P6), то выполняется переключение задач. При этом селектор sel 16 заносится в регистр TR, а в связанный с ним программно-недоступный регистр загружается дескриптор TSS. В соответствии с содержимым обязательной части TSS производится загрузка регистров процессора, после чего он начинает выполнение поступившей задачи. Следует отметить, что межсегментные команды JUMP и CALL содержат байты eip32, определяющие новое содержимое регистра EIP. Однако, если селектор выбирает дескриптор TSS, то эти байты игнорируются, а регистр EIP загружается содержимым соответствующего поля TSS. При переключении задачи устанавливается значение TS = 1 в регистре управления CRO, хранящем слово состояния машины MSW. Сброс этого бита в состояние TS = 0 может производиться командой CLTS или путем загрузки нового содержимого в CRO командами LMSWnnnMOV.
Переключение задач производится, если бит занятости В в байте доступа дескриптора TSS вызываемой задачи имеет значение «О» (задача свободна). При В = 1 выполняется исключение типа #GP (нарушение защиты). Установка значения В = 1 (задача занята) в дескрипторе TSS производится командами JUMP или CALL, переключающими процессор на выполнение данной задачи. Обращение к задаче, находящейся в процессе решения, которая имеет значение бита В = 1, запрещено (вызовет исключение #GP). Если решение данной задачи было прервано переключением на другую задачу, то возврат к ее выполнению может быть реализован только командой IRET.
При переключении задач с помощью команд JUMP или CALL должны выполняться правила доступа, установленные для обращения к сегментам данных: DPL >= CPL, RPL, где значение DPL задается соответствующим полем в дескрипторе сегмента TSS (см. рис. 2.52). Таким образом, допускается переключение на решение задач, чья степень защиты меньше или равна уровню привилегий текущей программы и запроса.
При использовании команды CALL возможно обращение к задачам с более высокой степенью защиты, чем уровень привилегий текущей программы, с помощью шлюза задачи. Использование шлюзов задачи аналогично шлюзам вызова. Дескриптор шлюза задачи, формат которого показан на рис. 2.54, может размещаться в любой из дескрипторных таблиц: GOT, LDT или ЮТ. Содержащийся в этом дескрипторе селектор сегмента TSS обращается к дескриптору TSS, располагаемому в таблице GDT.
Обращение к шлюзу разрешается, если для текущей программы значение CPL, RPL <= gDPL, указанному в дескрипторе шлюза задачи. Селектор TSS из дескриптора шлюза должен иметь значение бита TI = 1. Селектор загружается в регистр TR и выбирает из GDT дескриптор TSS, при этом значение уровня DPL, указанное в выбранном дескрипторе, не учитывается. При нарушении указанных правил обращения возникает исключение типа #TS («ошибка обращения к TSS»).
При использовании шлюзов задачи с меньшим уровнем привилегий могут вызывать более привилегированные (защищенные) задачи, поэтому в данном случае встает задача обеспечения сохранности содержимого стеков. Эта проблема решается путем использования трех отдельных начальных адресов стеков, которые задаются тремя парами полей TSS: SSO и ESPO, SS1 и ESP1, SS2 и ESP2. Если дескриптор вызываемого TSS имеет поле DPL = 0, то при вызове задачи через шлюз в регистры SS и ESP процессора загружаются значения SS и ESPO. При DPL = 1 загружается SSI и ESPI, при DPL = 2 загружается SS2 и ESP2. Если DPL = CPL = 3, то создание отдельного стека не требуется, и вызванная задача продолжает заполнение и использование стека, созданного в процессе выполнения старой (вызывающей) задачи. Таким образом, для задач каждого уровня привилегий создается отдельный стек, что исключает возможность нарушения его содержимого задачами с более низким уровнем привилегий.
При переключении задач с помощью команды CALL содержимое TR заносится в два младших байта сегмента TSS в качестве селектора, обеспечивающего возврат к выполнявшейся задаче. В этом случае в регистре EFLAGS устанавливается значение бита вложенной задачи NT = 1. Таким образом, при последовательном использовании команды CALL можно реализовать многократное вложение задач.
Возврат из текущей задачи к выполнению предыдущей осуществляется с помощью команды IRET, которая анализирует значение NT. При NT = 1 осуществляется обратное переключение на задачу, задаваемую селектором возврата в сегменте TSS текущей задачи. В этом случае из TSS возвращаемой задачи загружается сохранившееся содержимое основных регистров. При NT = 0 команда IRET осуществляет обычную процедуру возврата из подпрограммы с восстановлением из стека содержимого регистров CS, EIP, EFLAGS.
Команда JUMP при переключении задач не сохраняет в TSS селектор возврата и устанавливает значение NT = 0. Кроме того, команды JUMP и CALL по-разному влияют на значение бита занятости. Команда JUMP при переключении устанавливает в дескрипторе старой задачи значение бита занятости В = 0, а в дескрипторе новой задачи - В = 1. Команда CALL также устанавливает В = 1 для новой задачи, но сохраняет В = 1 и для предыдущей задачи. Таким образом, каждая задача в цепи вызовов с помощью команды CALL оказывается занятой, что запрещает применение рекурсивных процедур и реентерабельных программ.