
- •Программирование эвм
- •Int 21h ;кодом возврата 0 прерывания 21h
- •Работа с битами
- •Порядок выполнения работы
- •Устройства ввода-вывода
- •Ввод исходных данных с клавиатуры и вывод результатов на дисплей
- •Inc di ;смещение в видеопамяти на следующий символ
- •Порядок выполнения работы
- •Контрольные задания
- •Система команд процессора
- •Способы адресации
- •Влияние команд на регистр флагов
- •Расширенные регистры и типы данных процессоров x86
- •Система команд процессоров ia-32 и Intel 64
- •Int 21h ;системного прерывания 21h
- •Использование дальней подпрограммы
- •X dw 0aabBh, 0abbAh, 0baaBh, 0bbaAh ;исходные данные
- •Использование подпрограмм для ввода-вывода
- •Порядок выполнения работы
- •Контрольные задания
- •Дескрипторы
- •Порядок работы процессора в защищенном режиме
- •Использование дальней подпрограммы в защищенном режиме
- •Использование idt. Ввод данных с клавиатуры в защищенном режиме
- •Порядок выполнения работы
Контрольные задания
-
Определить формат данной команды.
-
Определить способы адресации данной команды.
-
Выделить команды, влияющие на флаги.
-
Пояснить влияние данной команды на флаги.
-
Выделить команды с данным способом адресации.
-
Выделить команды с данным сочетанием способов адресации.
-
Определить содержимое стека после выполнения данной команды.
-
Выделить в программе команды, влияющие на стек.
-
Выделить в программе команды, уменьшающие регистр SP.
-
Выделить в программе команды, увеличивающие регистр SP.
-
Выделить в программе команды, уменьшающие стек.
-
Выделить в программе команды, увеличивающие стек.
-
Выделить в программе команды, не изменяющие стек, но имеющие к нему отношение.
-
Выделить в программе команды, изменяющие значение сегментных регистров.
Лабораторная работа №4. Системная архитектура процессоров IA-32. Сегментирование и обработка прерываний в защищенном режиме
Цель работы и рассматриваемые вопросы
Цель работы — изучение сегментирования и обработки прерываний в защищенном режиме процессоров IA-32.
Рассматриваемые вопросы:
-
Системные регистры и структуры данных процессоров IA-32.
-
Сегментные регистры и селекторы сегментов.
-
Дескрипторы и таблицы дескрипторов. Формат несистемного дескриптора.
-
Глобальная таблица дескрипторов GDT и регистр глобальной таблицы дескрипторов GDT.
-
Таблица дескрипторов прерываний IDT и регистр таблицы дескрипторов прерываний IDTR.
-
Специальные дескрипторы — шлюзы. Формат шлюза прерывания.
-
Порядок работы процессора в защищенном режиме.
-
Порядок обработки прерываний в защищенном режиме.
-
Ввод с клавиатуры в защищенном режиме.
Теоретическая информация
Системные регистры и структуры данных процессоров IA-32 и Intel64
Системные задачи
Системная архитектура включает в себя множество регистров, структур данных и команд, предназначенных для выполнения следующих задач:
-
управления памятью;
-
защиты программных модулей;
-
реализации многозадачности;
-
реализации многопроцессорности;
-
обработки исключений и прерываний;
-
управления кэш-памятью;
-
управления питанием;
-
управления аппаратными средствами;
-
отладки и мониторинга производительности.
Системная архитектура неразрывно связана с защищенным режимом, поскольку все ее особенности проявляются только в нем. В реальном режиме процессоры x86 выглядят как i8086, только с регистрами общего назначения большего размера.
Основные структуры данных защищенного режима
Память в защищенном режиме может быть разделена на части двух типов: сегменты и страницы. Для выделения этих частей и работы с ними используются следующие структуры данных:
-
Селектор сегмента — 16-битная структура данных, содержащая индекс (номер) дескриптора сегмента в указанной таблице, текущий или запрашиваемый уровень привилегий. Для доступа к сегменту селектор должен быть загружен в соответствующий сегментный регистр.
-
Дескриптор сегмента — 8- или 16-байтная структура данных, содержащая базовый адрес (адрес начала) сегмента, лимит (предел) сегмента, другую необходимую информацию о сегменте. Дескриптор содержится в другой структуре — таблице дескрипторов, находящейся в памяти. При обращении к сегменту по его селектору дескриптор сегмента автоматически загружается в скрытую часть сегментного регистра.
-
Специальный дескриптор — дескриптор шлюза, специальной структуры, предназначенной для перехода между участками кода с различными свойствами.
-
Таблица страниц — структура, содержащая указатели на страницы.
-
Каталог страниц — структура, содержащая указатели на таблицы страницы.
-
Таблица указателей на каталоги страниц и т. д.
Существуют различные типы дескрипторов и таблиц дескрипторов.
Системные регистры IA-32
Существуют регистры, которые используются только в защищенном режиме или служат для переключения процессора в защищенный режим и обратно. Они называются системными регистрами. Их можно разделить на несколько групп:
-
Регистры управления памятью:
-
GDTR (Global Descriptor Table Register, регистр глобальной таблицы дескрипторов) — 6-байтный регистр, содержит базу и лимит (размер минус один) GDT (Global Descriptor Table, глобальной таблицы дескрипторов);
-
LDTR (Local Descriptor Table Register, регистр локальной таблицы дескрипторов) — 10-байтный регистр, содержит селектор и дескриптор LDT (Local Descriptor Table, локальной таблицы дескрипторов);
-
IDTR (Interrupt Descriptor Table Register, регистр таблицы дескрипторов прерываний) — 6-байтный регистр, содержит базу и лимит (размер минус один) IDT (Interrupt Descriptor Table, таблицы дескрипторов прерываний);
-
TR (Task Register, регистр задачи) — 10-байтный регистр, содержит селектор и дескриптор TSS (Task State Segment, сегмента состояния задачи) текущей задачи.
-
Регистры управления (Control Register, CR), пять 32-разрядных регистров: CR0, CR1, CR2, CR3, CR4. Содержат различные поля и флаги для управления процессором на системном уровне. В частности, бит 0 (PE, Protected mode Enable) регистра CR0 при установке в 1 переводит процессор в защищенный режим работы.
-
Отладочные регистры (Debug Register, DR), восемь 32-разрядных регистров: DR0-DR7. Позволяют отлаживать программу, определяя точки останова, не модифицируя код программ.
-
Машинно-специфичные регистры. Их число и назначение зависит от модели процессора. Например, в Pentium есть регистр TSC, счетчик тактов процессора. В Pentium Pro — регистры, используемые для подсчета различных событий: обращений к кэшу, умножений, команд MMX и т. п.
Особенности архитектуры Intel64
Основные особенности архитектуры Intel 64:
-
64-битное линейное адресное пространство для программного обеспечения;
-
физическое адресное пространство до 40 бит;
-
8 дополнительных регистров общего назначения (GPRs): R8-R15;
-
8 дополнительных регистров XMM (SSE, SSE2, SSE3, SSSE3);
-
64-битные GPRs и IP, в названии вместо буквы E используется буква R — RAX, RIP и т. п.;
-
64-битный регистр флагов RFLAGS, старшие 32 бита зарезервированы, младшие равны EFLAGS;
-
64-битный указатель стека RSP;
-
64-битные управляющие регистры, дополнительный управляющий регистр CR8 или TPR (task priority register);
-
64-битные отладочные регистры;
-
регистр глобальной таблицы дескрипторов (GDTR) регистр таблицы дескрипторов прерываний (IDTR) расширены до 10 байт, так что они содержат полный 64-битный базовый адрес;
-
регистр локальной таблицы дескрипторов (LDTR) и регистр задач (TR) также расширены для содержания полного 64-битного базового адреса.
Размер и использование регистров общего назначения определяет префикс REX (табл.8).
Таблица 8.
Влияние префикса REX на использование регистров общего назначения
Размер регистра |
без префикса REX |
с префиксом REX |
Byte |
AL, BL, CL, DL, AH, BH, CH, DH |
AL, BL, CL, DL, DIL, SIL, BPL, SPL, R8L - R15L |
Word |
AX, BX, CX, DX, DI, SI, BP, SP |
AX, BX, CX, DX, DI, SI, BP, SP, R8W - R15W |
Doubleword |
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP |
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D - R15D |
Quadword |
N.A. |
RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8 - R15 |
Сегментные регистры и селектор сегмента
Сегментные регистры используются и в реальном, и в защищенном режимах, но по разному. В реальном режиме сегментный регистр содержит базовый (начальный) адрес сегмента, деленный на 16, а в защищенном режиме — селектор сегмента (рис.3).
Рис.3 Формат селектора.
RPL (Requested Privilege Level) — запрошенный программой уровень привилегий.
TI (Table Indicator) — указатель таблицы. Если TI=0, то дескриптор, на который указывает индекс селектора находится в глобальной таблице дескрипторов (Global Descriptor Table, GDT), в противном случае — в локальной таблице дескрипторов (Local Descriptor Table, LDT).
Индекс — номер (указатель) дескриптора в указанной таблице дескрипторов.
Таким образом, селектор содержит указатель на дескриптор, а дескриптор — указатель на сегмент — базу или начальный адрес сегмента.
В защищенном режиме логический адрес представляет собой пару "селектор:смещение".
Первая часть логического адреса — селектор, находящийся в сегментном регистре, указывает на дескриптор, из которого берется база и прибавляется ко второй части логического адреса — смещению, которое теперь уже может быть 32- или 64-битным. Эта сумма представляет собой линейный адрес, который является физическим, если не включена страничная адресация. При включенной страничной адресации используются дополнительные преобразования линейного адреса с использованием каталогов и таблиц страниц. Страничная адресация в данной лабораторной работе не рассматривается.
Размер сегментного регистра во всех процессорах x86 — 16 бит. Однако в защищенном режиме используется также его скрытая часть, размер которой равен размеру дескриптора сегмента, которая и предназначена для загрузки в нее соответствующего дескриптора из таблицы дескрипторов, находящейся в памяти, для более быстрого обращения к сегменту.
Загрузить сегментные регистры можно явно: MOV, POP, LDS, LES, LSS, LGS, LFS — или неявно: CALL, JMP, RET, SYSENTER, SYSEXIT, IRET, INT n, INTO, INT3. Как видно, явно загружаются все сегментные регистры, кроме CS, неявно — CS и в некоторых случаях другие сегментные регистры.
Селектор сегмента состояния задачи (TSS) находится в регистре задачи (TR).
Системные флаги
Регистр флагов в процессорах семейства IA-32 называется EFLAGS и имеет размер 32 бита, семейства Intel64 — RFLAGS и имеет размер 64 бита. Однако множество флагов и распределение флагов по битам в этих регистрах одинаково, поскольку старшие 32 бита в RFLAGS зарезервированы, а младшие равны EFLAGS.
Регистр флагов в целом используется и в реальном, и в защищенном режимах. Но в его составе имеется группа системных флагов, которая используется только в защищенном режиме:
-
бит 21 — ID, флаг идентификации, если программа может изменить значение этого флага, то процессор поддерживает команду CPUID (начиная с Pentium);
-
бит 20 — VIP, флаг ожидания виртуального прерывания, указывает процессору, что произошло аппаратное прерывание;
-
бит 19 — VIF, флаг виртуального прерывания — виртуальный образ флага IF (начиная с Pentium);
-
бит 18 — AC, флаг контроля выравнивания в памяти. Если установить этот флаг и флаг AM в регистре CR0, то каждое обращение к памяти из программ, выполняющихся с CPL=3, невыравненное на границу слова для слов и на границу двойного слова для двойных слов, будет вызывать исключение #AC;
-
бит 17 — VM, флаг режима виртуального 8086 (V86). Его установка переводит процессор в режим V86;
-
бит 16 — RF, флаг возобновления (продолжения задачи). Когда он равен 1, отладочные исключения запрещены. Устанавливается командой IRETD из обработчика отладочного прерывания, для того чтобы #DB не произошло перед выполнением команды, которая его вызвала, еще раз. На флаг не влияют команды POPF, PUSHF, IRET;
-
бит 14 — NT, флаг вложенности задачи. Равен 1, если текущая задача является вложенной по отношению к другой — в обработчиках прерываний и исключений и задачах, вызванных командой CALL. Влияет на работу команды IRET;
-
биты 12-13 — IOPL, уровень привилегий ввода-вывода, с которым выполняется текущая программа или задача. Чтобы программа (задача) могла обратиться к порту ввода-вывода, ее текущий уровень привилегий (CPL) должен быть не больше IOPL. IOPL можно модифицировать только с нулевым уровнем привилегий.