IOPL – уровень привилегий ввода-вывода (2 бита);

NT (Nested Task) – флаг вложенной задачи.

В 32-разрядных процессорах (i386+) к регистру флагов добавили старшее слово (два байта), содержащее новые флаги:

R – флаг маскирования (R=1) ошибок отладки;

VM (Virtual 8086 Mode) – флаг VM=1 задает режим V8086;

AC (Alignment) - флаг контроля выравнивания (по границе 2, 4, 8 байт);

VIF (Virtual Inerrupt Flag) – маска виртуального прерывания;

VIP (Virtual Inerrupt Pending) – виртуальный запрос прерывания;

ID - флаг допустимости идентификации (по команде CPUID).

Виртуальные прерывания. При обслуживании аппаратных и программных прерываний в защищённом режиме возникает ряд проблем. Обычно обслуживание внешних прерываний является функцией ОС, поэтому внешние (маскируемые) прерывания воспринимаются ОС. Она определяет, какая программа выполняется в данный момент. Если это программа пользователя, то осуществляется её прерывание и обслуживание поступившего запроса. Однако программы пользователей должны иметь возможность защитить себя от прерывания, так как прекращение или задержка некоторых выполняемых ими действий (процедур) может привести к нежелательным последствиям. В реальном режиме для этих целей используется маска прерываний IF (IF=0 или IF=1). Однако в защищённом режиме команды управления флагом IF (CLI, STI) выполняются только при условии, что программа имеет уровень привилегий CPL≤IOPL (т. е. такой же или выше IOPL). Если в регистре флагов IOPL<3, то управлять флагом IF (установку, сброс) могут только программы ОС с уровнем привилегий CPL, равным 0,1 или 2.

НЕ нашли? Не то? Что вы ищете?

Обслуживание виртуальных прерываний от внешних источников (при условии IF=1) осуществляется обработчиком прерываний, который проверяет маску виртуального прерывания VIF (в регистре флагов). Если VIF=1 (т. е прервана программа пользователя с уровнем привилегий CPL=3, для которой разрешены внешние прерывания), то обработчик выполняет обслуживание прерывания и возвращает управление прерванной программе.

Если флаг VIF=0 (прервана программа пользователя с уровнем привилегий CPL=3, для которой внешние прерывания запрещены), то обработчик прерываний в регистре флагов, хранимом в стеке, устанавливает бит VIP=1 (принят запрос на обслуживание внешнего прерывания, однако его обслуживание отложено) и возвращает управление прерванной программе (фактически без обслуживания запроса на прерывание).

Его дообслуживание осуществляются следующим образом. Когда программа пользователя (прерывание которой фактически отложено) разрешит своё прерывание (установкой VIF=1 по команде STI), то действия системы прерываний в этом случае зависят от бита VIP регистра флагов. Если VIP=1 (есть отложенные прерывания), то процессор реализует исключение «#GP – нарушение общей защиты» (вызывает обработчик с N=13). Этот обработчик и должен выполнить обработку отложенного прерывания, т. е. вызвать соответствующий обработчик. Перед возвратом из него в стеке, где хранится старое содержимое регистра флагов, подпрограмма должна установить VIF=1 и сбросить VIP=0.

Если VIP=0 (нет отложенных прерываний), процессор устанавливает VIF=1 (разрешает виртуальные прерывания).

2.3 Прерывания в режиме виртуального процессора 8086

Процессор, работающий в режиме V8086 (флаг VM=1), может обслуживать прерывания: а) с использованием таблицы IDT (как в защищённом режиме), б) с использованием таблицы векторов прерываний (как в реальном режиме), в) виртуальные прерывания с использованием флагов VIF, VIP. Обслуживание прерываний зависит ещё от типа прерывания (программные или внешние маскируемые) и уровня привилегий ввода-вывода IOPL. В результате возможны 6 вариантов (таблица 4) обработки прерываний, в зависимости от значений бита VME в регистре управления CR4 (нулевой бит), поля IOPL в регистре флагов и содержимого бита bi битовой кары направления прерываний (БКНП), которая располагается в сегменте задачи TSS. Исключения обрабатываются только с помощью таблицы IDT как в защищённом режиме.

Таблица 4 – Варианты обработки прерываний V8086

Номер варианта

VME

IOPL

Бит bi

в БНКП

Программные

прерывания

Аппаратные маскируемые прерывания

1

2

0

0

3

<3

x

x

с использован. IDT

вызывает исключ. #GP

с использованием IDT

с использованием IDT

3

4

1

1

3

<3

1

1

вызывает исключ. #GP

с использован. IDT

вирт. прер. с исп. VIF, VIP

с использованием IDT

5

6

1

1

3

<3

0

0

с использов. табл. ВП

с использов. табл. ВП

с использованием IDT

вирт. прер. с исп. VIF, VIP

Если VME=1 (виртуальные прерывания разрешены), то для обработки программных прерываний (по команде INT N) используется БКНП, а при обработке внешних прерываний используется таблица IDT (при условии IOPL=3) или виртуальный механизм прерываний по флагам VIF, VIP (если IOPL<3).

Если VME=0 (виртуальные прерывания запрещены), то для обработки программных прерываний используется таблица IDT (если IOPL=3), либо вызывается исключение #GP (N=13), а при обработке внешних прерываний используется таблица IDT.

Битовая карта БКНП (Interrupt Redirection Bit Map) длиной 32 байта (256 бит) размещена в TSS непосредственно перед битовой картой ввода-вывода (БКВВ). Каждый бит bi этой карты определяет, будет ли программное прерывание (по команде INT N=n) обрабатываться в защищенном режиме (через IDT) или в реальном режиме (через таблицу векторов прерываний).

Обработка прерываний в режимеV8086 с использованием IDT. Вызов подпрограммы осуществляется либо через 1) шлюз ловушки, либо через 2) шлюз задачи.

В первом случае шлюз ловушки должен ссылаться на неподчинённый (в дескрипторе бит С=0) сегмент с уровнем привилегий DPL=0. Если шлюз ловушки ссылается на подчинённый сегмент (С=1) или сегмент с DPL>0, то реализуется исключение #GP. В качестве кода ошибки в этом случае указывается селектор сегмента, на который ссылается шлюз.

Операция прерывания:

    процессор переключается в защищённый режим с уровнем CPL=0; в стеке (с уровнем привилегий = 0) сохраняется содержимое регистров GS, FS, DS, ES, SS, ESP, FLAGS, CS, EIP (9 регистров) и, если необходимо, код ошибки; сбрасываются регистры GS, FS, DS, ES (сегментов данных); в регистре флагов сбрасывается бит VM=0; управление подпрограмме передаётся через IDT (по номеру N).

Возврат из подпрограммы (по команде IRET) осуществляется только с уровнем привилегий CPL=0, иначе команда IRET не сможет изменить бит VM в регистре флагов (вернуть режим V8086).

Прерывание через шлюз задачи. В этом случае процессор выполняет обычную процедуру переключения задач:

§  содержимое регистра флагов (с битом VM=1) сохраняется в сегменте TSS текущей задачи;

§  в поле обратной связи сегмента стека (уровня привилегий программы обработчика прерывания) загружается селектор сегмента TSS прерванной задачи;

§  в регистр флагов загружается новое значение (в котором бит VM=0) из сегмента TSS программы-обработчика;

§  в регистре флагов устанавливается бит NT=1 (признак вложенной задачи);

§  начинается выполнение подпрограммы (через шлюз задачи).

По команде IRET – обратное переключение задач. При выполнении команды IRET обработчик должен иметь CPL=0, иначе команда IRET не сможет изменить бит VM.

Обработка прерываний через таблицу векторов прерываний. В этом случае обработка прерывания осуществляется без выхода из режима V8086 (бит VM=1). Вызов подпрограммы осуществляется через таблицу векторов прерываний (как в реальном режиме). Действия процессора зависят от IOPL.

1)  Если IOPL=3:

§  в стеке сохраняется содержимое регистра флагов, в котором сбрасываются NT=0, IOPL=0;

§  в стеке сохраняется содержимое регистров CS, IP;

§  в регистре флагов сбрасываются биты IF=0, TF=0;

§  по номеру N из таблицы векторов прерываний загружаются новые значения в CS и IP (а старшее слово EIP сбрасывается);

§  начинается исполнение подпрограммы обработки прерывания.

2)  Если IOPL<3:

§  в стеке сохраняется содержимое регистра флагов, в котором IOPL=3, IF:=VIF;

§  сохраняется CS, IP;

§  сбрасываются флаги VIF=0, IF=0 в регистре флагов;

§  по номеру N из таблицы векторов прерываний в CS, IP загружается адрес подпрограммы (а старшее слово EIP сбрасывается);

§  начинается выполнение подпрограммы.

Возврат из подпрограммы – по команде IRET. При этом поле IOPL не восстанавливается, так как CPL≠0.

Обработка виртуальных прерываний (в V8086) с использованием VIF, VIP. Если процессор в режиме V8086 обрабатывает маскируемое внешнее прерывание в виртуальном режиме с помощью VIF, VIP, то команды CLI, STI изменяют флаг VIF (а не флаг IF). Если программа попытается изменить флаг IF по командам PUSHF, POPF, то процессор, исполняя эти команды, будет менять флаг VIF, не изменяя IF.

Выполнение команды STI (которая должна разрешить внешние прерывания) зависит от бита VIP. Если VIP=0 (нет отложенных прерываний), команда устанавливает VIF=1. Если VIP=1 (есть отложенные прерывания), то процессор реализует исключение #GP. Вызываемая по номеру N=13 подпрограмма должна обеспечить дообслуживание отложенного прерывания. Перед возвратом из подпрограммы она должна установить VIF=1 и сбросить VIP=0 в содержимом регистра флагов, которое хранится в стеке.

Обработка внешнего прерывания (если IF=1) осуществляется через таблицу IDT в следующей последовательности:

§  процессор переключается в защищённый режим с уровнем CPL=0;

§  в стеке (с уровнем привилегий равным нулю) сохраняется содержимое регистров CS, FS, DS, ES, SS, ESP, EFLAGS, CS, EIP. В копии регистра флагов, хранимой в стеке, устанавливается значения IOPL=3, IF присваивается значение VIF;

§  сегментные регистры GS, FS, DS, ES сбрасываются;

§  в регистре флагов сбрасывается бит VM=0;

§  через таблицу IDT в CS, EIP загружается селектор и смещение обработчика и начинается его выполнение.

Этот обработчик должен проверить значение VIF в регистре флагов. Если VIF=1, то обработать прерывание. Если VIF=0, то установить VIP=1 в копии регистра флагов, хранящейся в стеке, и вернуть управление прерванной программе.

ЗАДАНИЕ И ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

Реальный режим. Для исследования системы прерываний написать и установить пользовательский обработчик прерываний с заданными номером N вектора прерываний и смещения для стека. Номер N может быть любым, в том числе он может соответствовать и системному обработчику. Вызов обработчика прерывания выполнить по команде «int N» из основной программы, представляющей собой цикл с заданным количеством повторений. Счетчик циклов модифицировать в обработчике. Основную программу и обработчик разместить в разных сегментах памяти. Выполнить программу в шаговом режиме, фиксируя результаты выполнения очередной команды в строке таблицы 5 («снять» трассу программы).

Основная программа должна обеспечить выполнение следующих действий:

- сохранение «старого» вектора прерываний в стеке. Это необходимо сделать для того, чтобы перед завершением основной программы можно было восстановить старый обработчик и тем самым восстановить нормальную работу компьютерной системы;

- установить пользовательский («новый») обработчик. Для этого на место старого вектора прерываний следует записать новый вектор;

- организовать цикл с заданным количеством повторений с командой «int N» внутри этого цикла;

- восстановить старый обработчик прерываний и завершить программу (вернуть управление ОС).

Сохранение старого вектора прерываний, запись нового и восстановление старого вектора в таблице векторов прерываний можно выполнить разными способами:

- с помощью стандартных функций с номерами 25h и 35h системного обработчика с N=21h. Функция 35h читает из таблицы векторов прерываний вектор прерывания с заданным номером N и записывает его в регистр ES (базовый адрес сегмента) и в регистр ВХ (смещение). После этого из этих регистров он записывается в стек с целью сохранения. Функция 25h записывает в таблицу векторов прерываний базовый адрес сегмента из регистра DS и смещение из регистра DX. Поэтому перед вызовом обработчика с N=21h в эти регистры следует загрузить новый вектор прерывания;

- с помощью непосредственного обращения к таблице векторов прерываний (к ячейкам памяти с адресами 4N, 4N+2). Следует отметить, что в этом случае на время манипуляций с ячейками таблицы векторов прерываний внешние прерывания следует запретить.

В качестве примера ниже приведена программа 1, в которой для сохранения старого вектора с номером N=0Bh и записи нового используется второй способ – чтение вектора из таблицы (из ячеек памяти с адресами 4N, 4N+2), запись его в стек, а затем запись вектора нового прерывания на место старого. В программе 2 для этих же целей используется первый способ - функции с номерами 25h и 35h системного обработчика с номером N=21h.

Программа 1:

.model large ; программы в разных сегментах

.stack 200h ; смещение (размер) стека

assume cs:main ; указание: сегмент main является сегментом кода

segment interruption page 'CODE'

intproc:

dec cx

iret

interruption ends

segment main page 'CODE'

start:

mov ax,0000h ;обнуление адреса сегмента данных, в котором размещена таблица ВП

mov ds, ax

cli ;запрет (маскирование) прерываний

;сохранение в стеке старого вектора прерывания

mov bx,000Bh

shl bx,2

mov ax,[bx] ; смещение

mov cx,[bx+2] ; базовый адрес сегмента

push bx ; bx - адрес вектора прерывания (старого)

push cx

push ax

; запись вектора нового прерывания на место старого

mov ax, offset intproc

mov cx, seg intproc

mov [bx],ax

mov [bx+2],cx

sti ; разрешение прерываний

; основной цикл

mov cx,2

m1: int 0Bh

cmp cx,0

JnZ m1

Cli ; запрет прерываний

; восстановление вектора старого прерывания

pop ax

pop cx

pop bx

mov [bx],ax

mov [bx+2],cx

sti ; разрешение прерываний

mov ax,4c00h ; выход из программы (возврат управления в ОС)

int 21h

main ends

end start

Программа 2:

.model large ; позволяет размещать программы в разных сегментах

.stack 200h

assume cs:main ;указание: сегмент main является сегментом кода

segment interruption page 'CODE'

intproc:

dec cx

iret

interruption ends

segment main page 'CODE'

start:

mov ax, seg main ;сохранение в стеке вектора прерывания

mov ds, ax

mov ax,350Bh

int 21h

push es ; адрес сегмента

push bx ; смещение

; установка нового прерывания

mov ax, seg intproc

mov ds, ax

mov dx, offset intproc

mov ax,250Bh

int 21h

mov ax,0h ; обнуление адреса сегмента данных для просмотра таблицы ВП

mov ds, ax

mov cx,2 ; цикл основной программы

m1: int 0Bh

cmp cx,0

JnZ m1

;восстановление вектора старого прерывания

mov ax,250Bh

pop ds

pop dx

int 21h

mov ax,4c00h ; возврат управления в ОС

int 21h

main ends

end start

Порядок выполнения программы (в оболочке Far). В выбранный для исполнения вариант программы внести заданные значения N и размер стека. Текст программы сохранить в файле с расширением «.asm», т. е. в виде <имя программы. asm >. Выполнить трансляцию программы (в два этапа):

- tasm. exe имя. asm. Результатом этапа является файл «имя. obj»,

- tlink. exe имя. obj. Результатом этапа компоновки является файл «имя. exe» (машинный код программы).

Для снятия трассы программы использовать программу-отладчик (td. exe - турбо-отладчик). Вход в турбо-отладчик осуществляется командой: td < имя программы. exe >. Отладчик позволяет выполнять программу (или ее часть) в шаговом режиме. Если в шаговом режиме требуется выполнить только часть программы, то в программе указывается точка останова, достигнув которой, процессор останавливается, и каждая очередная команда программы будет выполняться только после нажатия любой клавиши: F7 - trace, F8 – step, или автоматически – клавиша F9 - run. Точка останова в программе выделяется красным цветом.

Основные функции турбо-отладчика:

F1 - помощь;

F2 - установка (снятие) точки останова;

F7 (F8) - исполнить очередную команду программы;

F9 - исполнить программу до точки останова (если её нет, то исполнится вся программа);

F10 - главное меню;

Alt-X - выход из турбо-отладчика.

Точек останова в программе может быть сколько угодно. Снятие точки останова достигается ее повторной "установкой" на том же самом месте. Для просмотра содержимого регистров, стека и др. нужно выбрать в главном меню пункт View, далее выбрать пункт CPU. При этом справа можно увидеть содержимое регистров и флагов, внизу справа - содержимое стека, внизу слева - содержимое сегмента данных. Только что записанные в стек данные помечены символом "►".

Следует отметить, что переход на подпрограмму по прерыванию отменяет шаговый режим. Поэтому для снятия трассы подпрограммы необходимо сначала установить точку останова на нужной команде подпрограммы, начиная с которой возобновится шаговый режим.

Таблица 5 – Трасса выполнения программы 2

Адрес команды

Команда

Результаты выполнения команд

Состояние процессора

Таблица ВП

Ячейки стека

БА

D

Ассембл

IP

ZF

IF

AX

BX

CX

ES

CS

DS

DX

SP

4N

4N+2

(SP)

+2

+4

+6

+8

IF*

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3