Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Shpory_Sp_(1)

.pdf
Скачиваний:
8
Добавлен:
08.03.2016
Размер:
1 Mб
Скачать

; Global Descriptor Table

GDT

label

byte

db

… ; Дескриптор #0

 

 

db

… ; Дескриптор #N

gdt_len equ

$ - GDT ; размер GDT

gdtr

dw

 

gdt_len – 1 ; 16-битный размер GDT – 1

dd

?

; Место для 32-х битного базового адреса GDT

 

 

28. Вимоги до організіції захисту програмного забезпечення. Рівні привілеїв RPL, DPL,

CPL

Четыре уровня привилегий можно интерпретировать в виде колец защиты. Центр - уровень 0 - предназначен для сегментов, содержащих наиболее критичные программы (обычно ядро операционной системы). Внешние кольца предназначены для сегментов с менее критичными программами или данными. Использование всех четырех уровней привилегий не является необходимым. Существующие системы, спроектированные с меньшим количеством уровней, могут просто игнорировать другие допустимые уровни. UNIX и Windows, например, используют только два уровня привилегий - 0 (для ядра системы) и 3 (для всего остального), а OS/2 использует уровни 0 (для ядра системы), 2 (для процедур ввода-вывода) и 3 (для прикладных программ).

Механизм контроля уровня привилегий микропроцессора оперирует следующими значениями: CPL - текущий уровень привилегий (Current Privilege Level) : уровень привилегий, на котором в данный момент исполняется задача. Значение CPL хранится в поле RPL селектора сегмента кода, который помещен в регистр CS. Обычно это значение соответствует уровню привилегий дескриптора исполняемого сегмента кода. Уровень привилегий меняется, когда управление передается сегменту кода с другим значением DPL (за исключением подчиняемых сегментов кода).

DPL - уровень привилегий дескриптора (Descriptor Privilege Level) : наименее привилегированный уровень, на котором задача может получить доступ к сегменту или шлюзу, связанному с этим дескриптором. Уровень DPL определяется битами 46 и 45 дескриптора.

RPL - запрашиваемый уровень привилегий (Requested Privilege Level) используется для временного понижения своего уровня привилегий при обращении к памяти. RPL заносится в младшие биты селектора. Механизм контроля уровня привилегий обычно сравнивает уровень привилегий дескриптора (DPL) с максимальным из двух чисел CPL и RPL. Наименее привилегированный из текущего уровня привилегий и запрашиваемого считается эффективным уровнем привилегий :

EPL=max(CPL,RPL).

32. Формат дескриптора сегмента даних

сегментация памяти защищѐнного режима представляет собой совсем другую форму адресации: вместо привычной для реального режима адресации «сегмент:смещение» используется адресация «селектор:смещение». Рассмотрим структуру селектора:

Формат селектора

Биты 3-15 указывают номер дескриптора в выбранной таблице дескрипторов. Таким образом, селектор может описать 213=8192 дескрипторов для одной таблицы. Каждый дескриптор в таблице описывает сегмент, при чѐм он не обязательно должен быть сегментом кода или данных.

Бит 2 – флаг TI (Table Indicator). Этот флаг указывает, какая из двух таблиц дескрипторов будет использоваться для загрузки дескриптора. Если флаг равен нулю, то используется глобальная таблица дескрипторов (GDT – Global Descriptor Table), в другом случае используется локальная таблица дескрипторов (LDT – Local Descriptor Table).

Биты 0-1 содержат запрашиваемый уровень привилегий (RPL – Requested Privilege Level) доступа к сегменту, то есть с какими привилегиями программа обращается к сегменту, описанному дескриптором.

База – это линейный адрес, с которого начинается сегмент.

Лимит – это максимальное смещение от начала сегмента, то есть лимит равен размеру сегмента минус один байт. Таким образом, получается, что минимальный размер сегмента может быть равен одному байту, а максимальный – одному мегабайту или четырѐм гигабайтам (это зависит от, того, умножается размер сегмента на 4 килобайта или нет).

Поле «тип сегмента» для сегмента данных выглядит так:

3

2

1

0

 

 

 

 

 

 

 

Флаг А также используется для

D

D

W

A

организации виртуальной памяти и

 

 

 

 

является флагом доступа (Accessed), то есть при любом обращении к описываемому сегменту флаг будет автоматически установлен (то есть, по этому биту операционная система решает, какие сегменты следует временно сбросить на диск в swap-файл, а с какими сегментами следует повременить). То есть, ОС может периодически сбрасывать этот бит, и если он через некоторое время не станет равным единице, то данный сегмент можно сбросить, допустим, на жѐсткий диск, освободив тем самым память.

Флаг D задаѐт направление роста сегмента (Direction). Обычно, если D=1, то выбранный сегмент является сегментом стека и растѐт «задом наперѐд». Если же D=0, то выбранный сегмент является сегментом данных. На самом деле, значение D=1 практически не используется.

Флаг W определяет возможность записи в сегмент (Writable). То есть, сброшенный флаг указывает, что сегмент данных доступен только для чтения. Если флаг установлен, то сегмент доступен также и для записи.

Из рассмотрения можно сделать вывод: писать прямо в сегмент кода категорически запрещено, как и запускать программу, находящуюся в сегменте данных.

33. Формат дескриптора сегмента коду

сегментация памяти защищѐнного режима представляет собой совсем другую форму адресации: вместо привычной для реального режима адресации «сегмент:смещение» используется адресация «селектор:смещение». Рассмотрим структуру селектора:

Формат селектора

Биты 3-15 указывают номер дескриптора в выбранной таблице дескрипторов. Таким образом, селектор может описать 213=8192 дескрипторов для одной таблицы. Каждый дескриптор в

таблице описывает сегмент, при чѐм он не обязательно должен быть сегментом кода или данных.

Бит 2 – флаг TI (Table Indicator). Этот флаг указывает, какая из двух таблиц дескрипторов будет использоваться для загрузки дескриптора. Если флаг равен нулю, то используется глобальная таблица дескрипторов (GDT – Global Descriptor Table), в другом случае используется локальная таблица дескрипторов (LDT – Local Descriptor Table).

Биты 0-1 содержат запрашиваемый уровень привилегий (RPL – Requested Privilege Level) доступа к сегменту, то есть с какими привилегиями программа обращается к сегменту, описанному дескриптором.

База – это линейный адрес, с которого начинается сегмент.

Лимит – это максимальное смещение от начала сегмента, то есть лимит равен размеру сегмента минус один байт. Таким образом, получается, что минимальный размер сегмента может быть равен одному байту, а максимальный – одному мегабайту или четырѐм гигабайтам (это зависит от, того, умножается размер сегмента на 4 килобайта или нет).

Для сегмента кода поле выглядит так:

3

2

1

0

 

 

 

 

 

 

 

Флаг А также используется для

1

С

R

A

организации виртуальной памяти и

 

 

 

 

является флагом доступа (Accessed), то есть при любом обращении к описываемому сегменту флаг будет автоматически установлен (то есть, по этому биту операционная система решает, какие сегменты следует временно сбросить на диск в swap-файл, а с какими сегментами следует повременить). То есть, ОС может периодически сбрасывать этот бит, и если он через некоторое время не станет равным единице, то данный сегмент можно сбросить, допустим, на жѐсткий диск, освободив тем самым память.

Бит C называется битом подчинения (Conforming), но рассмотрен он будет позже.

Флаг R указывает на доступность сегмента кода для чтения (Readable). То есть, если флаг сброшен, читать из сегмента кода нельзя.

Из рассмотрения можно сделать вывод: писать прямо в сегмент кода категорически запрещено, как и запускать программу, находящуюся в сегменте данных.

35. Структури розподілу (захисту) задач в захищенному режимі (одна gdt для всіх та особиста ldt, одна gdt для всіх, одна gdt для всіх та особиста ldt для декількох задач, тощо)

// Эта структура содержит значения для одной записи GDT struct gdt_entry_struct {

u16int limit_low; // Младшие 16 бит смещения u16int base_low; // Младшие 16 бит базы

u8int base_middle; // Следующие восемь бит базы u8int access; // Флаг определяет уровень доступа u8int granularity;

u8int base_high; // старшие 8 бит базы

} __attribute__((packed));

typedef struct gdt_entry_struct gdt_entry_t;

Большинство полей не требуют разъяснений. Формат байта, описывающего уровень доступа такой:

7 6 5 4 3 0 |P|DPL| DT |Type|

Формат байта гранулярности:

7 6 5 4 3 0 |G|D|0|A|length|

P - сегмент существует? (Да = 1)

DPL - Дескриптор кольца привелегий (0-3) DT - Тип дескриптора

Type - Тип сегмента (кода / данных)

G - Гранулярность (0 = 1 байт, 1 = 1 килобайт) D - размер операнда (0 = 16 бит, 1 = 32 бит)

0 - всегда должно быть равно нулю

A - доступно для использования 23:40:46 // Структура описывает запись в IDT

struct idt_entry_struct {

u16int base_lo; // Первые 16 бит адреса начала обработчика прерывания u16int sel; // Селектор сегмента ядра

u8int always0; // Всегда должно быть равно нулю u8int flags; // Флаги. RTFM.

u16int base_hi; // Старшие 16 бит адреса начала обработчика прерывания

}__attribute__((packed));

typedef struct idt_entry_struct idt_entry_t;

//Структура описывает указатель на массив обработчиков прерываний

//в формате пригодном для загрузки в специальный регистр

struct idt_ptr_struct { u16int limit;

u32int base; }__attribute__((packed));

typedef struct idt_ptr_struct idt_ptr_t;

//Следующие директивы позволят нам обращаться к адресам обработчиков

//описанных в ASM файле

extern void isr0 ();

...

extern void isr31();

Все очень похоже на код для GDT. Формат поля флагов следующий:

7 6 5 4 3 2 1 0

P DPL always 14

Младшие пять бит всегда должны быть равны 0x0110=14. Поле DPL определяет уровень привилегий с которых можно обратиться к данному прерыванию. В нашем случае это поле будет содержать нулевое значение, но по мере развития нашей системы, мы изменим это значение на 3. Бит P показывает, что обработчик задан. Любой дескриптор со сброшенным битом P вызовет исключение ‗Interrupt Not Handled‘

34. Формат дескриптора сегмента стеку

Сегмент стека – SS, предназначенный для выделения области памяти при стековых операциях.

В дескрипторах, копируемых в сегментный регистр стека ss, биты D и G должны быть согласованы (равны между собой), кроме того бит D в подобных дескрипторах принято

называть битом В (big – бит большого сегмента). Отметим также, что в дескрипторах «системных» сегментов биты D и G смысла не имеют.

Бит S (system) бит «системного сегмента». При S = 0 дескриптор описывает системный сегмент. В зависимости от значения бита S процессор интерпретирует поле TYPE. При S = 1 (не системный сегмент) поле TYPE может иметь один из двух форматов.

Свойства сегмента определяют его тип и правила использования . Не вдаваясь в детали, можно выделить следующие типы сегментов:

-Сегмент кода (code segment). Допустимо исполнение, может быть разрешено чтение.

-Сегмент данных (data segment). Допустимо чтение, может быть разрешена запись.

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

-не все программисты понимают их правильно;

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

-в большинстве случаев, те же задачи проще и красивее решаются при помощи страничной адресации.

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

36. Альтернативне іменування сегментів

Чтобы разделить сегмент между двумя задачами, каждая задача должна иметь идентичный дескриптор сегмента в своей LDT. Два дескриптора одного и того же сегмента называются альтернативными именами. Конечно, не обязательно ограничиваться только двумя задачами и двумя альтернативными именами; можно использовать любое число альтернативных имен. Альтернативное именование дает разработчику операционной системы две возможности. Во-первых, задачи можно снабдить дескрипторами только тех сегментов, о которых они должны знать. Размещение дескрипторов разделяемых сегментов в GDT делает их видимыми всем задачам,а альтернативное именование может ограничить сегменты для любой группы задач. Во-вторых, большие сообщения можно эффективно передавать между задачами, передавая просто дескрипторы сегментов с альтернативными именами, а не копию всего сообщения. Дополнительную информацию о передаче сообщений см. в приложении Д. Альтернативное именование позволяет также реализовывать сегмент, являющийся исполняемым и записываемым: одно имя делается дескриптором сегмента кода, а другое - дескриптором сегмента данных.

Оба альтернативных имени помещаются в одну и ту же LDT. После этого программа может, выбирая соотвествующий дескриптор, выполнять сегмент и записывать в него. Альтернативное именование является наиболее мощным методом разделения сегментов в процессоре 80286, но оно приводит к трудностям для систем виртуальной памяти. Если альтернативное именование разрешено, то для передачи сегмента на диск операционная система должна проследить все альтернативные имена этого сегмента и сбросить их биты Р в нуль. Аналогичные трудности возникают и при передаче сегмента с диска. Простейший способ найти все альтернативные имена сегмента - просмотреть все LDT в системе. Этот способ успешно реализован во многих компьютерах, работающих, как и процессор 80286, с дескрипторами. Расходуемое на такой просмотр время зависит от особенностей системы.

42. Особливості переходів з реального режиму до захищеного режиму та зворотньо

При включении процессора в нем автоматически устанавливается реальный режим. Переход в защищенный режим осуществляется программно путем выполнения соответствующей последовательности команд. Поскольку многие детали функционирования процессора в реальном и защищенном режимах существенно различаются, программы, предназначенные для защищенного режима, должны быть написаны особым образом. Реальный и защищенный режимы не совместимы! В отличие от реального режима, в котором сегменты определяются их базовыми адресами, задаваемыми программистом в явной форме, в защищенном режиме для каждого сегмента программы должен быть определен дескриптор – 8-байтовое поле. Перед переходом в защищенный режим процессору надо будет сообщить физический адрес таблицы глобальных дескрипторов и ее размер Прежде всего, надо завершить формирование дескрипторов сегментов программы, в которых остались незаполненными базовые адреса сегментов. Следующий этап подготовки к переходу в защищенный режим – загрузка в регистр процессора GDTRи информации о таблице глобальных дескрипторов. В принципе теперь можно перейти в защищенный режим. Возврат в реальный режим можно осуществить сбросом процессора. Действия процессора после сброса определяются

байтом состояния отключения, располагаемым по адресу Fh. В частности, если в этом байте записан код Ah, после сброса управление немедленно передается по адресу, который извлекается из двухсловной ячейки 40h:67h, расположенной в области данных BIOS. Таким образом, для подготовки возврата в реальный режим необходимо в ячейку 40h:67h записать адрес возврата, а в байт Fh микросхемы занести код Ah. В процессорах, начиная с i386, переход из реального режима в защищенный и обратно может осуществляться с использованием управляющего регистра CR0.

13. Обробка переривань. Внутрішні переривання.

Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какоголибо события. При этом выполнение текущей последовательности команд приостанавливается и управление передаѐтся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.

Основная цель введения прерываний – реализация асинхронного режима работы и распараллеливания работы отдельных устройств вычислительного комплекса. Механизм прерываний реализуется аппаратно-программными средствами.

Структуры систем прерываний могут быть самыми различными, но все они имеют общую особенность – прерывание непременно ведет за собой изменение порядка выполнения команд процессором.

Внутренние (логические) прерывания формируются самим процессором, когда он встречается с некоторыми особыми событиями вроде деления на 0. Внутренние прерывания возбуждаются цепями самого процессора при возникновении одной из специально оговоренных ситуаций, например, при выполнении операции деления на ноль или при попытке выполнить несуществующую команду. За каждым из таких прерываний закреплен определенный вектор, номер которого известен процессору. Например, за делением на 0 закреплен вектор 0, а за неправильной командой - вектор 6. Внутренние прерывания должны обеспечиваться развитой системой аппаратного контроля процессора, поэтому они не получили широкого распространения в простых 8- и 16-разрядных МП. С точки зрения реализации внутренние и внешние прерывания функционируют одинаковым образом, хотя при работе подсистемы с внешними прерываниями возникают дополнительные проблемы идентификации источника прерывания.

7. Система програмування. Компонування програм. Завантаження програм.

Системы программирования - это комплекс инструментальных программных средств, предназначенный для работы с программами на одном из языков программирования. Операции компоновки и связывания выполняются специальными программами - компоновщиками и связывающими загрузчиками. Современные ОС позволяют сочетать статическую компоновку с динамической. В современных ОС модули, подключаемые к программам динамически, носят название библиотек динамической компоновки (dynamic link library), соответственно, файлы, содержащие образы таких модулей, обычно имеют расширения DLL. Выполнение динамической компоновке иллюстрируется Рисунком Структуры данных динамической компоновки в принципе сходны со структурами для компоновки статической. Для модуля основной программы компоновщик создает таблицу, функционально идентичную таблице внешних ссылок. В этой таблице указывается имя файла для каждого динамически подключаемого модуля и имена тех процедур в модуле, к которым имеются обращения в программе. Вызовы процедур в теле программы содержат обращения к соответствующим элементам этой таблицы. С другой стороны, при компоновке модуля, предназначенного для динамического подключения, для него создается таблица входов. При компоновке загрузчик (на этапе загрузки) или ядро ОС (на этапе выполнения) выполняет установку связей: находит в памяти или загружает в память динамически подключаемый модуль и по его таблице входов находит требуемую процедуру. Строка таблицы внешних ссылок модифицируется - теперь она содержит переход по адресу найденной процедуры. Последующие обращения к этой же входной точке уже не вызывают каких-либо дополнительных действий. Динамическая компоновка несколько ухудшает быстродействие

программы: во-первых, расходуется время на установление связей при загрузке или при выполнении, во-вторых, при уже установленных связях обращение производится через посредство таблицы внешних ссылок. Преимущества же динамической компоновки бесспорны: во-первых, достигается экономия оперативной памяти за счет совместного использования модулей, во-вторых, достигается экономия внешней памяти за счет уменьшения объема загрузочных модулей, в- третьих, создается возможность модификации и полной замены модулей динамической компоновки без изменения двоичного кода главной программы.

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

Этот набор может быть следующим. Системный вызов:

mod_handle = loadModule (mod_name); //загружает модуль из файла с указанным именем. Возможна модификация этого вызова:

mod_handle = getModuleHandle (mod_name); //получить манипулятор модуля: если модуль уже есть в памяти, вызов возвращает его манипулятор (и увеличивает счетчик использований), если нет - возвращает признак ошибки. Системный вызов:

freeModule (mod_handle); //выгружает модуль.

Системный вызов:

vaddr = getProcAddress (mod_handle, proc_name); // возвращает виртуальный адрес процедуры с заданным именем в уже загруженном модуле.

27. Кільця захисту програмного забезпечення.

Существуют четыре уровня привилегий, они пронумерованы от 0 (наиболее привилегированный уровень), до 3 (наименее привилегированный уровень), и три типа ресурсов, в отношении которых действуют механизмы защиты процессора: память, порты ввода / вывода и возможность выполнения некоторых инструкций. В любой момент, x86 процессор работает на определенном уровне привилегий, и от этого зависит, что может и чего не может сделать код. Уровни привилегий также часто называют кольцами защиты, которые изображаются в виде вложенных окружностей. Наиболее привилегированный уровень соответствует окружности с наибольшей степенью вложенности. Большинство современных ядер для архитектуры x86 используют всего два уровня привилегий — 0 и 3.

Каждому сегменту программы придается определенный уровень привилегий, указываемый в поле DPL (Descriptor Privilege Level, уровень привилегий дескриптора) его дескриптора. Уровни привилегий указываются во всех дескрипторах: памяти, системных и шлюзах. Уровень привилегий, указанный в дескрипторе, назначается всем объектам, входящим в данный сегмент. Селектор дескриптора: 16-битное число следующего формата: биты 16 – 3: номер дескриптора в таблице (от 0 до 8191); бит 2: 1 -использовать LDT; 0 – использовать GDT; биты 1 – 0: поле RPL, определяющее запрашиваемый уровень привилегий при обращении к сегменту (RPL) || текущий уровень привилегий для селектора, загруженного в CS (CPL). Уровень привилегий выполняемого в данный момент сегмента команд называется текущим уровнем привилегий CPL (Current Privilege Level). Он определяется полем RPL селектора сегмента команд, загружаемого в CS. Вся система привилегий основана на сравнении CPL выполняемой программы с уровнями привилегий DPL сегментов, к которым она обращается. Всего процессор различает 4 уровня привилегий от 0 (максимальные привилегии) до 3 (минимальные). Для того, чтобы избежать двусмысленности при сравнении привилегий сегментов, мы будем преимущественно называть уровни с большими привилегиями внутренними, с меньшими – внешними. Эти определения связаны с принятым изображением уровней в виде концентрических колец, называемых кольцами защиты: Защита по уровням привилегий и защита с помощью локальных адресных пространств действуют параллельно и в какой-то мере независимо.

40. Завантаження захищеного режиму з режиму Real Mode

С появлением процессора Intel 80386 возникла архитектура IA32. Она предполагала появление нового режима работы процессора - защищѐнного ("Protected Mode"). Для совместимости с предыдущими процессорами линейки Intel 80x86 процессор 80386 не запускался сразу в защищѐнном режиме, а работал в так называемом реальном режиме ("Real Mode"). Кроме этого, у каждого режима есть один или несколько подрежимов. Разберѐм их.

Реальный режим

Вэтом режиме процессор находится сразу после нажатия кнопки "Power" компьютера. Доступ к памяти в реальном режиме осуществляется конструкцией "сегмент:смещение", которая описывает логический адрес. Значение сегмента, как и смещения, лежит в пределах от 0 до 0FFFFh.

Так как адресоваться можно только в пределах одного сегмента, то максимальный размер сегмента равен 64 килобайт. Физический адрес, который выставляется на адресную шину процессора, считается по формуле: линейный адрес = сегмент * 16 + смещение

Вреальном режиме процессоров 80186 и 8086 значение сегмента лежало в пределах от 0 до 0F000h. Таким образом, максимальный выставленный адрес на адресную шину равен 0FFFFFh, что соответствует (2^20)-1, т.е. 1 мегабайту.

Защищѐнный режим Этот режим имеет сложную конструкцию по сравнению с реальным. Логический адрес

представляется конструкцией "селектор:смещение". Селектор находится в пределах от 0 до 0FFFFh. Смещение, в отличие от реального режима, является 32-разрядным, что позволяет адресовать сегменты размером 4 гигабайт. Логический адрес преобразуется в линейный по следующей схеме:

линейный адрес = база сегмента + смещение Линейный адрес в дальнейшем выставляется на адресную шину, если не включен режим

страничной адресации. В противном случае линейный адрес преобразуется в физический, и только после этого выставляется на адресную шину. Кроме этого, защищѐнный режим позволяет организовать виртуальную память, достигающую размера до 64 терабайт и зависящую лишь от объѐма жѐсткого диска (например, тот же файл подкачки в Windows реализует виртуальную память). В защищѐнном режиме функционируют практически все современные операционные системы.

25. Програмна модель співпроцесора x87(FPU)

Всхеме сопроцессора 8087 можно выделить две подсистемы: устройство шинного интерфейса и устройство с плавающей точкой. Развитием этого семейства стал сопроцессор 80287, созданный в 1985 году. Основные изменения произошли только в устройстве шинного интерфейса. В отличие от 8087, сопроцессор 80287 не имеет доступа к шине адреса, поэтому все обращения к памяти выполняет ЦП. В сопроцессоре 80387 изменения коснулись устройства с плавающей точкой: изменилась схема обработки ошибок, а также был реализован больший набор трансцендентных функций.

Впятом поколении процессоров интеграция блока FPU в суперскалярную архитектуру позволила значительно повысить эффективность выполнения операций с вещественными числами. Блок FPU может выполнять одну операцию с плавающей точкой в каждом такте или же получать и одновременно выполнять 2 команды с плавающей точкой, одной из которых должна быть команда обмена. Команды с плавающей точкой проходят по целочисленному конвейеру и передаются на исполнительные ступени конвейера FPU (3 ступени). В целом же,

несмотря на то, что блок FPU интегрирован в центральный процессор, этот блок работает независимо и одновременно с устройством целочисленных вычислений.

Для хранения данных в сопроцессоре предназначены регистры R0-R7. Эти регистры организованы в стек, и доступ к ним производится относительно вершины стека - ST. Номер регистра, соответствующего вершине стека, хранится в регистре состояния. Как и у ЦП, стек сопроцессора растет к регистрам с меньшими адресами. Команды, которые производят запоминание и извлечение из стека, передают данные из текущего регистра ST, а затем производят инкремент поля TOS в регистре состояния. Многие команды сопроцессора допускают неявное обращение к вершине стека, обозначаемой ST или ST(0). Для указания i- го регистра относительно вершины используется обозначение ST(i), где I = 0,:,7. Стековая организация упрощает программирование подпрограмм, допуская передачу параметров в регистровом стеке сопроцессора.

Старший байт регистра состояния содержит:

Бит занятости B (бит 15), сигнализирующий, свободен ли сопроцессор (B=0) или занят выполнением численной команды (B = 1). Команды сопроцессора, которые используют регистровый стек, требуют, чтобы перед началом их выполнения сопроцессор не был занят. В FPU этот бит дублирует значение флага сигнализации особого случая.

Поле TOS "Top-Of-the-Stack" (биты 11-13), которое содержит номер регистра, являющегося логической вершиной стека. При помещении в регистровый стек нового числа это значение уменьшается.

Младший байт регистра состояния содержит флажки особых случаев сопроцессора: переполнение стека, потеря точности, потеря значащих разрядов, численное переполнение, деление на ноль, денормализация, недействительная операция. Если соответствующий особый случай возник и не был замаскирован, это приведет к генерации центральным процессором особого случая сопроцессора.

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

41. Повернення з захищеного режиму до режиму Real Mode.

Практически защищѐнный режим процессора можно использовать двумя способами:

1.Операционная система. Процессор входит в P-Mode при загрузке ОС и не возвращается в R-Mode. Примером таких ОС являются Windows 95 и старше либо специализированные ОС, управляющие контроллерами на базе 32-разрядных процессоров.

2.DOS-программа. Программа запускается в ОС, которая работает в R-Mode (например, MSDOS), переходит в P-Mode, выполняет свою работу, возвращается обратно в R-Mode и завершает свою работу.

Второй способ, с возвратом в режим реальных адресов.

Фактически, переход в режим реальных адресов может быть только из защищѐнного режима и осуществляется сбросом бита PE в CR0:

mov eax,cr0 and al,0feh mov cr0,eax

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]