- •1.Классификация вычислительных систем, определение вычислительная машина, вычислительная система.
- •2. Принцип программного управления.
- •3. Магистральный принцип передачи информации.
- •4. Структурная схема вычислительной машины
- •5. Кодирование информации, двоичный код, системы кодирования.
- •6. Принцип передачи информации
- •29. Логическая структура магнитного жесткого диска, система адресации
- •30. Содержание 0-го сегмента(?), mbr
6. Принцип передачи информации
Обмен информацией производится по каналам передачи информации. Каналы передачи информации могут использовать различные физические принципы. Так, при непосредственном общении людей информация передается с помощью звуковых волн, а при разговоре по телефону - с помощью электрических сигналов, которые распространяются по линиям связи. Компьютеры могут обмениваться информацией с использованием каналов связи различной физической природы: кабельных, оптоволоконных, радиоканалов и др.
Общая схема передачи информации включает в себя отправителя информации, канал передачи информации и получателя информации (рис. 4.1). Если производится двусторонний обмен информацией, то отправитель и получатель информации могут меняться ролями.
Рис. 4.1. Канал обмена информацией
Основной характеристикой каналов передачи информации является их пропускная способность (скорость передачи информации). Пропускная способность канала равна количеству информации, которое может передаваться по нему в единицу времени.
Обычно пропускная способность измеряется в битах в секунду (бит/с) и кратных единицах Кбит/с и Мбит/с. Однако иногда в качестве единицы измерения используется байт в секунду (байт/с) и кратные ему единицы Кбайт/с и Мбайт/с.
Соотношения между единицами пропускной способности канала передачи информации такие же, как между единицами измерения количества информации:
1 байт/с = 23 бит/с = 8 бит/с;
1 Кбит/с = 210 бит/с = 1024 бит/с;
1 Мбит/с = 210 Кбит/с = 1024 Кбит/с;
1 Гбит/с = 210 Мбит/с = 1024 Мбит/с.
Программно-доступные регистры процессоров х86
Все процессоры архитектуры x86 (даже многоядерные, большие и сложные) являются дальними потомками древнего Intel 8086 и совместимы с его архитектурой. Это значит, что программы на ассемблере 8086 будут работать и на всех современных процессорах x86.
Все
внутренние регистры процессора Intel 8086
являются 16-битными:
Всего процессор содержит 12 программно-доступных регистров, а также регистр флагов (FLAGS) и указатель команд (IP).
Регистры общего назначения (РОН) AX, BX, CX и DX используются для хранения данных и выполнения различных арифметических и логических операций. Кроме того, каждый из этих регистров поделён на 2 части по 8-бит, с которыми можно работать как с 8-битными регистрами (AH, AL, BH, BL, CH, CL, DH, DL). Младшие части регистров имеют в названии букву L (от слова Low), а старшие H (от слова High). Некоторые команды неявно используют определённый регистр, например, CX может выполнять роль счетчика цикла.
Индексные регистры предназначены для хранения индексов при работе с массивами. SI (Source Index) содержит индекс источника, а DI (Destination Index) — индекс приёмника, хотя их можно использовать и как регистры общего назначения.
Регистры-указатели BP и SP используются для работы со стеком. BP (Base Pointer) позволяет работать с переменными в стеке. Его также можно использовать в других целях. SP (Stack Pointer) указывает на вершину стека. Он используется командами, которые работают со стеком. (Про стек я подробно расскажу в отдельной части учебного курса)
Сегментные регистры CS (Code Segment), DS (Data Segment), SS (Stack Segment) и ES (Enhanced Segment) предназначены для обеспечения сегментной адресации. Код находится в сегменте кода, данные — в сегменте данных, стек — в сегменте стека и есть еще дополнительный сегмент данных. Реальный физический адрес получется путём сдвига содержимого сегментного регистра на 4 бита влево и прибавления к нему смещения (относительного адреса внутри сегмента). Подробнее о сегментной адресации рассказывается в части 31.
COM-программа всегда находится в одном сегменте, который является одновременно сегментом кода, данных и стека. При запуске COM-программы сегментные регистры будут содержать одинаковые значения.
Указатель команд IP (Instruction Pointer) содержит адрес команды (в сегменте кода). Напрямую изменять его содержимое нельзя, но процессор делает это сам. При выполнении обычных команд значение IP увеличивается на размер выполненной команды. Существуют также команды передачи управления, которые изменяют значение IP для осуществления переходов внутри программы.
Регистр флагов FLAGS содержит отдельные биты: флаги управления и признаки результата. Флаги управления меняют режим работы процессора:
D (Direction) — флаг направления. Управляет направлением обработки строк данных: DF=0 — от младших адресов к старшим, DF=1 — от старших адресов к младшим (для специальных строковых команд).
I (Interrupt) — флаг прерывания. Если значение этого бита равно 1, то прерывания разрешены, иначе — запрещены.
T (Trap) — флаг трассировки. Используется отладчиком для выполнения программы по шагам.
Признаки результата устанавливаются после выполнения арифметических и логических команд:
S (Sign) — знак результата, равен знаковому биту результата операции. Если равен 1, то результат — отрицательный.
Z (Zero) — флаг нулевого результата. ZF=1, если результат равен нулю.
P (Parity) — признак чётности результата.
C (Carry) — флаг переноса. CF=1, если при сложении/вычитании возникает перенос/заём из старшего разряда. При сдвигах хранит значение выдвигаемого бита.
A (Auxiliary) — флаг дополнительного переноса. Используется в операциях с упакованными двоично-десятичными числами.
O (Overflow) — флаг переполнения. CF=1, если получен результат за пределами допустимого диапазона значений.
Микроархитектура процессоров 8086 и Pentium Pro Микропроцессор 8086 ориентирован на выполнение команд параллельно с их выборкой и может быть условно разделен на две части, работающие асинхронно (
Устройство сопряжения обеспечивает формирование 20-разрядного физического адреса памяти, выборку команд и операндов из памяти, организацию очередности команд и запоминание результатов выполнения команд в памяти. В состав УС входит шесть 8-разрядных ре- гистров очереди команд, четыре 16-разрядных сегментных регистра, 16- разрядный регистр обмена и 16-разрядный сумматор адреса, интерфейс с внешними шинами. Регистры очереди команд организованы по принципу FIFO - «первым пришел - первым вышел». УС готово выполнить цикл вы- борки 16-разрядного слова из памяти всякий раз, когда в очереди освобож- даются, по меньшей мере, два байта, а УО извлекает из очереди команды по мере их выполнения. При выполнении команд передачи управления, например условных и безусловных переходов, очередь очищается УС и начинает заполняться заново.
Среди программно-доступных регистров выделяют следующие группы (см. Рис. 2.4): 41 • Регистры данных: AX – аккумулятор (Accumulator); BX - базовый ре- гистр (Base); CX - регистр счетчика (Counter); DX - регистр данных (Data). • Регистры-указатели (индексные регистры): SI - индекс источника (Source Index); DI - индекс приемника (Destination Index); BP - указа- тель базы (Base Pointer); SP - указатель стека (Stack Pointer). • Сегментные регистры: SS - сегмент стека (Stack Segment); DS - сег- мент данных (Data Segment); ES - дополнительный сегмент (Extended data Segment); CS – сегмент кода (Code Segment). 16-битные регистры AX, BX, CX, DX состоят из двух 8-битных поло- вин, к которым можно независимо обращаться по именам AH, BH, CH, DH - старшие байты и AL, BL, CL, DL - младшие байты. регистры данных сегментные регист- ры 15 8 7 0 15 0 аккумулятор AH AL AX кода CS базовый BH BL BX данных DS счетчик CH CL CX стека SS данных DH DL DX доп. ES данных адресные регистры указатель стека SP указатель IP указатель базы BP команд индекс назначе- ния DI регистр FLAGS состояния индекс источника SI Рис. 2.4 Регистры процессора 8086 Биты (или флаги) регистра признаков FLAGS разделяются на условные, отражающие результат предыдущей операции ALU, и управляющие, от которых зависит выполнение специальных функций. 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 OF DF IF TF SF ZF AF PF CF Рис. 2.5 Флаги процессора 8086 Флаги TF, IF, DF относятся к управляющим флагам, остальные - к ус- ловным (флагам состояния). Флаги отражают следующие условия: • флаг переноса CF устанавливается в 1 при переносе/заеме, возни- кающем при сложении/вычитании байтов или слов, а также прини- мает значение выдвигаемого бита при сдвигах операнда; • флаг четности PF устанавливается в 1, если младшие 8 бит резуль-42 тата имеют четное число единиц; • флаг вспомогательного переноса AF устанавливается в 1, если есть перенос/заем из младшей тетрады в старшую 8- или 16-битного ре- зультата в операциях десятичного сложения/вычитания; • флаг нуля ZF устанавливается в 1 при нулевом результате операции; • флаг знака SF устанавливается в 1 при отрицательном результате операции при использовании дополнительного кода; • флаг переполнения OF устанавливается в 1 при потере старшего бита результата сложения или вычитания; • если флаг направления DF установлен в 1, то используется авто- декрементная адресация при выполнении операции обработки строк, если DF установлен в 0, то используется автоинкрементная адреса- ция; • если флаг прерывания IF установлен в 1, то внешние маскируе- мые прерывания разрешены, иначе запрещены; • если флаг трассировки TF установлен в 1, то процессор переходит в состояние прерывания после выполнения каждой операции, что позволяет проводить пошаговую отладку программ
Прерывания - приостановление основных вычислений в процессоре, для выполнения вспомогательных действий, технологических сервисных процедур – можно разделить на два класса: внешние и внутренние. Каждо-71 му прерыванию назначен четырехбайтный вектор с номером в диапазоне 0h - FFh. Векторы определяют адреса подпрограмм обслуживания преры- вания (ISR, Interrupt Service Routine) и размещаются в младшем килобайте адресного пространства памяти в виде IP:CS (сегмент_ISR:смещение_ISR, смещение записывается по младшему адресу).
2) Система адресации процессоров х86 в РРР, адресное пространство процессора
Адресное пространство. |
Адресное пространство — это диапазон адресов (множество адресов), к которым может обратиться процессор, используя адресный код. Если адресный код содержит п бит, то размер адресного пространства равен 2" байтов. Обычно размер адресного кода равен количеству линий в адресной шине (разрядности адресной шины). Например, если компьютер имеет 16-разрядную адресную шину, то адресное пространство его процессора равно 216=64 Кб, а при 32-разрядной адресной шине адресное пространство равно 2 =4 Гб.
Супер хардовый ответ:
Распределение адресного пространства
Не следует думать, что термины "адресное пространство" и "оперативная память" эквивалентны. Адресное пространство - это просто набор адресов, которые умеет формировать процессор; совсем не обязательно все эти адреса отвечают реально существующим ячейкам памяти. В зависимости от модификации персонального компьютера и состава его периферийного оборудования, распределение адресного пространства может несколько различаться. Тем не менее, размещение основных компонентов системы довольно строго унифицировано. Типичная схема использования адресного пространства компьютера приведена на рис. 1.5. Значения адресов на этом рисунке, как и повсюду дальше в книге, даны в шестнадцатеричной системе счисления.
Рис. 1.5. Типичное распределение адресного пространства.
Первые 640 Кб адресного пространства с адресами от 00000h до 9FFFFh (и, соответственно, с сегментными адресами от 0000h до 9FFFh) отводятся под основную оперативную память, которую еще называют стандартной (conventional). Начальный килобайт оперативной памяти занят векторами прерываний, которые обеспечивают работу системы прерываний компьютера, и включает 256 векторов по 4 байта каждый. Вслед за векторами прерываний располагается так называемая область данных BIOS, которая занимает всего 256 байт, начиная с сегментного адреса 40h. Сама BIOS (от Basic In-Out System, базовая система ввода-вывода) является частью операционной системы, хранящейся в постоянном запоминающем устройстве. Это запоминающее устройство (ПЗУ BIOS) располагается на системной плате компьютера и является, таким образом, примером встроенного, или "зашитого" программного обеспечения. В функции BIOS входит тестирование компьютера при его включении, загрузка в оперативную память собственно операционной системы MS-DOS, хранящейся на магнитных дисках, а также управление штатной аппаратурой компьютера - клавиатурой, экраном, дисками и прочим. В области данных BIOS хранятся разнообразные данные, используемые программами BIOS в своей работе. Так, здесь размещаются:
входной буфер клавиатуры, куда поступают коды нажимаемых пользователем клавиш;
адреса видеоадаптера, а также последовательных и параллельных портов;
данные, характеризующие текущее состояние видеосистемы (форма курсора и его текущее положение на экране, видеорежим, используемая видеостраница и проч.);
ячейки для отсчета текущего времени и т.д.
Область данных BIOS заполняется информацией в процессе начальной загрузки компьютера, а затем динамически модифицируется системой по мере необходимости. Многие прикладные программы, особенно, написанные на языке ассемблера, обращаются к этой области с целью чтения или модификации содержащихся в них данных. С некоторыми ячейками области данных BIOS мы столкнемся при рассмотрении примеров конкретных программ.
В области памяти, начиная с адреса 500h, располагается собственно операционная система MS-DOS, которая обычно занимает несколько десятков Кбайт. Программы MS-DOS, как и другие системные составляющие (векторы прерываний, область данных BIOS) записываются в память автоматически в процессе начальной загрузки компьютера.
Вся оставшаяся память до границы 640 Кб свободна для загрузки любых системных или прикладных программ. Как правило, в начале сеанса в память загружают резидентные программы (русификатор, антивирусные программы). При наличии резидентных программ объем свободной памяти уменьшается.
Оставшиеся 384 Кб адресного пространства между границами 640 Кб и 1 Мб, называемые старшей, или верхней (upper) памятью, первоначально были предназначены для размещения постоянных запоминающих устройств (ПЗУ). Практически под ПЗУ занята только небольшая часть адресов, а остальные используются в других целях.
Часть адресного пространства старшей памяти отводится для адресации к графическому и текстовому видеобуферам графического адаптера. Графический адаптер представляет собой отдельную микросхему или даже отдельную плату, в состав которой входит собственное запоминающее устройство (видеопамять). Это запоминающее устройство не имеет никакого отношения к оперативной памяти компьютера, однако, его схемы управления настроены на диапазоны адресов A0000h...AFFFFh и B8000h...BFFFFh, входящих в общее с памятью адресное пространство процессора. Поэтому любая программа может обратиться по этим адресам и, например, записать данные в видеобуфер, что приведет к появлению на экране некоторого изображения. Если видеосистема находится в текстовом режиме, а запись осуществляется по адресам текстового видеобуфера, на экране появятся изображения тех или иных символов (букв, цифр, различных знаков). Если же перевести видеосистему в графический режим, и записывать данные в графический видеобуфер, то на экране появятся отдельные точки или линии. Можно также прочитать текущее содержимое ячеек видеобуфера.
В самом конце адресного пространства, в области адресов F0000h...FFFFFh, располагается ПЗУ BIOS - постоянное запоминающее устройство, о котором уже говорилось выше.
Часть адресного пространства, начиная с адреса C0000h, отводится еще под одно ПЗУ - так называемое ПЗУ расширений BIOS для обслуживания графических адаптеров и дисков.
В состав компьютера, наряду со стандартной памятью (640 Кб), входит еще расширенная (extended) память, максимальный объем которой может доходить до 4 Гбайт. Эта память располагается за пределами первого мегабайта адресного пространства и начинается с адреса 100000h. Реально на машине может быть установлен не полный объем расширенной памяти, а лишь несколько десятков Мбайт или даже меньше.
Поскольку функционирование расширенной памяти подчиняется "спецификации расширенной памяти" (Extended Memory Specification, сокращенно XMS), то и саму память часто называют XMS-памятью. Как уже отмечалось выше, доступ к расширенной памяти осуществляется в защищенном режиме, поэтому для MS-DOS, работающей только в реальном режиме, расширенная память недоступна. Однако в современные версии MS-DOS включается драйвер HIMEM.SYS, поддерживающий расширенную память, т.е. позволяющий ее использовать, хотя и ограниченным образом. Конкретно в расширенной памяти можно разместить электронные диски (с помощью драйвера RAMDRIVE.SYS) или дисковые кэш-буферы (с помощью драйвера SMARTDRV.SYS).
Первые 64 Кб расширенной памяти, точнее, 64 Кб - 16 с адресами от 100000h до 10FFEFh, носят специальное название область старшей памяти (High Memory Area, HMA). Эта область замечательна тем, что хотя она находится за пределами первого мегабайта, к ней можно обратиться в реальном режиме работы микропроцессора, если определить сегмент, начинающийся в самом конце мегабайтного адресного пространства, с сегментного адреса FFFFh, и разрешить использование адресной линии А20. Первые 16 байт этого сегмента заняты ПЗУ, область же со смещениями 0010h...FFFFh можно, в принципе, использовать под программы и данные. MS-DOS позволяет загружать в HMA (директивой файла CONFIG.SYS DOS=HIGH) значительную часть самой себя, в результате чего занятая системой область стандартной памяти существенно уменьшается. Старшую память обслуживает тот же драйвер HIMEM.SYS, поэтому загрузка DOS в HMA возможна, только если установлен драйвер HIMEM.SYS.
Как видно из приведенного выше рисунка, часть адресного пространства верхней памяти, не занятая расширениями BIOS и видеобуферами, оказывается свободной. Эти свободные участки можно использовать для адресации к расширенной памяти (конечно, не ко всей, а лишь к той ее части, объем которой совпадает с общим объемом свободных адресов старшей памяти). Отображение расширенной памяти на свободные адреса старшей памяти выполняет драйвер EMM386.EXE, а сами участки старшей памяти, "заполненные" расширенной, называются блоками верхней памяти (Upper Memory Blocks, UMB). MS-DOS позволяет загружать в UMB устанавливаемые драйверы устройств, а также резидентные программы. Загрузка системных программ в UMB освобождает от них стандартную память, увеличивая ее транзитную область. Загрузка в UMB драйверов осуществляется директивой файла CONFIG.SYS DEVICEHIGH (вместо директивы DEVICE), а загрузка резидентных программ - командой DOS LOADHIGH. На оптимально сконфигурированном компьютере системными компонентами заняты лишь около 20...25 Кб основной памяти, а вся остальная память в объеме около 620 Кб может использоваться для загрузки прикладных программ.
Режимы адресации
Для взаимодействия с различными модулями в ЭВМ должны быть средства идентификации ячеек внешней памяти, ячеек внутренней памяти, регистров МП и регистров устройств ввода/вывода. Поэтому каждой из запоминающих ячеек присваивается адрес, т.е. однозначная комбинация бит. Количество бит определяет число идентифицируемых ячеек. Обычно ЭВМ имеет различные адресные пространства памяти и регистров МП, а иногда - отдельные адресные пространства регистров устройств ввода/вывода и внутренней памяти. Кроме того, память хранит как данные, так и команды. Поэтому для ЭВМ разработано множество способов обращения к памяти, называемых режимами адресации.
Режим адресации памяти - это процедура или схема преобразования адресной информации об операнде в его исполнительный адрес.
Все способы адресации памяти можно разделить на: 1) прямой, когда исполнительный адрес берется непосредственно из команды или вычисляется с использованием значения, указанного в команде, и содержимого какого-либо регистра (прямая адресация, регистровая, базовая, индексная и т.д.); 2) косвенный, который предполагает, что в команде содержится значение косвенного адреса, т.е. адреса ячейки памяти, в которой находится окончательный исполнительный адрес (косвенная адресация).
В каждой микроЭВМ реализованы только некоторые режимы адресации, использование которых, как правило, определяется архитектурой МП.
Адресация информации – это способ использования адресной части команды для определения местонахождения информации в памяти ЭВМ. Следует отметить, что в адресном пространстве процессора информация адресуется обычно с точностью до байта.
Важным вопросом построения любой системы команд является оптимальное кодирование команд, что отражается на размере полей кода операции, на размере и количестве полей адресной части, т.е. формате команд. Форматы команд в значительной степени определяются методами адресации, количеством операндов, предполагаемым объемом оперативной памяти (ОП), количеством регистров общего назначения (РОН), а также сложностью аппаратуры, необходимой для декодирования. Поэтому в современных RISC – процессорах, в отличии от CISC - процессоров используются достаточно простые методы адресации, позволяющие резко упростить декодирование команд.
Данные, которые обрабатываются командами, могут находиться в самой команде, в регистрах процессора, в ячейках оперативной памяти. Надо помнить, что адресоваться могут не только операнды, но и те места в памяти, куда они или результаты операции будут записываться. При адресации ОП существуют понятия логического и физического адреса. Логическим адресом оперирует программа, которая не привязана к определенным адресам ОП и может располагаться в ее любом месте. Для чтения или записи данных на основании данных о логическом адресе, должен быть сформирован физический или исполнительный адрес, однозначно определяющий место ячейки в ОП.
Среди способов адресации можно выделить следующие:
- непосредственная адресация, - прямая регистровая адресация, - неявная адресация, - прямая адресация, - страничная адресация, - относительная или базовая адресация, - косвенная адресация, - косвенная регистровая адресация, - индексная адресация, - индексно - относительная адресация,
Способы адресации
- непосредственная адресация, когда адресная часть команды используется непосредственно для размещения операнда, как правило, какой-нибудь константы. - прямая регистровая адресация, когда операнд находится в регистре, номер которого указывается в адресной части команды. При программировании на ассемблере используются буквенные обозначения регистров. Длина адресного поля зависит от количества РОН. - неявная адресация, когда местоположение операнда предопределено кодом операции. Обычно операнд находится в специальном регистре процессора, например, в регистре-аккумуляторе или в вершине стека. - прямая адресация, когда в адресной части команды непосредственно указывают адрес ячейки ОП. Основными недостатками прямой адресации является зависимость размера адресного поля от емкости ОП и его большое значение, т.к. емкость ОП современных ЭВМ измеряется мегабайтами. Поэтому прямая адресация обычно используется только для фиксированной части ОП, т.е. с помощью прямого адреса фиксированной длины можно адресовать часть ОП - т.н. страницу ОП. - страничная адресация, когда физический адрес ячейки ОП формируется из двух полей: номера страницы (старшие разряды адреса) и номера ячейки в странице (младшие разряды адреса). Номер страницы определяется содержимым регистра, номер которого указывается в адресном поле команды. Номер ячейки в пределах страницы указывается в адресном поле команды. При таком способе разбиения ОП на страницы фиксированного размера называемого сегментацией, не происходит пересечения страниц по физическим адресам. - относительная или базовая адресация, когда физический адрес получается сложением базового адреса сегмента, сдвинутого влево на несколько разрядов со смещением. Базовый адрес указывается в специальном регистре процессора - базовом регистре. Смещение указывается в адресной части команды. Следует отметить, что страничная адресация является частным случаем относительной (базовой) адресации, при котором сдвиг влево базового адреса производится на число разрядов, равное числу разрядов смещения. Основное назначение относительной адресации - обеспечить перемещаемость программ и данных при динамическом распределении ОП в мультипрограммном режиме работы компьютера. - косвенная адресация, когда указывается не прямой, а косвенный адрес операнда, т.е. адрес адреса операнда, называемый указателем. По косвенному адресу, находящемуся в адресной части команды, производится первое обращение к ОП и извлекается адрес операнда, а затем уже по этому адресу производится второе обращение и извлекается операнд. Недостаток косвенной адресации – дополнительное обращение к памяти и, как следствие, уменьшение быстродействия процессора. - косвенная регистровая адресация, когда указатель адреса операнда хранится не в ОП, а в регистре процессора, номер который указывается в адресной части команды. Поскольку время обращения к регистрам процессора обычно в 5…10 раз меньше, чем к ячейкам ОП, то время выборки операнда увеличивается незначительно – на 10…20%. Достоинствами косвенной адресации являются возможность обработки адреса операнда, уменьшение длины адресной части команды при косвенной регистровой адресации, т. к. адрес регистра значительно короче адреса ячейки памяти. - индексная адресация, когда физический адрес ячейки ОП формируется сложением базового адреса, указанного в адресной части команды или в базовом регистре и смещения, находящегося в специальном регистре процессора, который называетя индексным. Достоинством индексной адресации является возможность модификации исполнительного адреса путём выполнения операций с индексными регистрами. Этот метод адресации эффективен при работе с массивами данных. - индексно - относительная адресация, когда совместно используются индексная и относительная адресации. При индексно - относительной адресации физический адрес ячейки памяти формируется как сумма трех величин. Базовый адрес получается, как и в случае относительной адресации, т.е. сдвигом содержимого базового регистра, номер которого указан в адресной части команды и сложением его со смещением, расположенным в адресной части команды или регистре, номер которого указан в адресной части. Затем полученный адрес складывается с содержимам индексного регистра, номер которого указан в адресной части команды.
Система команд, формат инструкций
Система команд процессора
Архитектура системы команд процессора (ISA - Instruction Set Architecture) охватывает систему команд процессора и регистры, через которые процессор становится доступным для программирования.
Машинные команды, выполняемые процессором, обычно подразделяются следующим образом:
передача данных (из регистра в регистр, из памяти в регистр и наоборот)
арифметико логические операции (сложение, вычитание, ротация битов операндов, сдвиг вправо, сдвиг влево и т. д.)
доступ к отдельным битам
доступ к строкам
команды управления (уловного и безусловного перехода, подпрограммы и т. д.)
ввод-вывод
управление работой процессора.
Процессор содержит специальную микросхему постоянной памяти - микропрограммная память, которая управляет выполнением машинных команд. На современных прцессорах эта память перепрограммируемая, что позволяет прцессору вносить исправления.
Выполнение программы в процессоре состоит следующих этапов:
Считывание команды из памяти (Instruction Fetch)
Декодирование команды в микрооперации (Instruction Decode)
Исполнение команды (Execute)
Запись результатов (Store).
При выполнении программ могут возникать особые случаи, когда процессор должен реагировать на внешние события, возникновение которых заранее не известно. Типовыми примерами являются взаимодействие с операционной системой, обмен данными с периферийными устройствами, сбой, командная ошибка и т. д.. Такие особые случаи называют прерываниями. Для обработки прерывания нужно использование специальных команд, которые вызывают прерывание процессора (т. е. временно приостанавливают выполнение текущей программы), запускают подпрограмму, которая реализует алгоритм прерывания, затем восстанавливают то состояние процессора, которое было до остановки работы программы, из которой вышли на прерывание (после чего выполнение прерванной программы может быть продолжено).
Форматы команд
Для операций с разными способами адресации и разными форматами данных необходимо вве- дение различных форматов команд, которые по-разному задают местонахождение и количество операндов, и, естественно, имеют разную длину. Для широко распространённых сейчас двухадрес- ных ЭВМ это такие форматы команд (в скобках указано их мнемоническое обозначение): • регистр – регистр (RR); • регистр – память, память – регистр (RX); • регистр – непосредственный операнд в команде (RI); • память – непосредственный операнд в команде (SI); • память – память, т.е. оба операнда в основной памяти (SS).2 Многообразие форматов команд и данных позволяет писать более компактные и эффективные программы на языке машины, однако, как уже упоминалось, сильно усложняет центральный процес- сор ЭВМ. 1 Заметим, однако, что каждая команда такой машины обычно обрабатывает операнды одинаковой длины. 2 Использования для мнемонического обозначения операнда в памяти сразу двух букв X(RX) и S(SS) связано с особенностями выполнения команд этих форматов, надо не задумываться над этим, а просто запом- нить. 9 Возвращаясь к учебной ЭВМ УМ-3 теперь можно, используя новые изученные понятия, сказать, что это трёхадресная машина с прямым способом адресации, одним форматом команд и одним фор- матом данных.
Система прерываний в реальном режиме работы
http://www.dnf.su/college/attachments/article/1/OS_06_Prer.pdf
Прерывание – приостановка выполнения одной программы , запуск и и исполнение второй программы . возврат к приостановленной программе к месту прерывания
Основная проблема реализации прерывания в отслеживание места прерывания программы поэтому необходимо сохранять контекст программы:
Контекст программы :
Min контекст программы - это 3 регистра CS,IP,FLAGS
Полный контекст программы – это текущее значение всех регистров общего назначения
Если прерывание происходит случайно обращаться нужно П,К,К
Прерывания, таблица прерываний в РРР
http://www.dnf.su/college/attachments/article/1/OS_06_Prer.pdf
Прерывание— сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.
Таблица прерываний
Вектор прерывания — закреплённый за устройством номер, который идентифицирует соответствующий обработчик прерываний. Векторы прерываний объединяются в таблицу векторов прерываний, содержащую адреса обработчиков прерываний. Местоположение таблицы зависит от типа и режима работы процессора.
Таблица векторов прерываний (англ. Interrupt Descriptor Table, IDT) используется в архитектуре x86 и служит для определения корректного ответа на прерывания и исключения.
В микропроцессорах 8086/80186 таблица векторов прерываний расположена в первом килобайте памяти начиная с адреса 0000:0000 и содержит 256 векторов прерываний в формате сегмент:смещение. Начиная с процессора 80286, адрес в физической памяти и размер таблицы прерываний определяется 48-битным регистром IDTR.
В IDT используются следующие типы прерываний: аппаратные прерывания, программные прерывания и прерывания, зарезервированные процессором, называемые исключениями (первые 32) на случай возникновения некоторых событий (деление на ноль, ошибка трассировки, переполнение).
В реальном режиме элементом IDT является 32-битный FAR-адрес обработчика прерывания.
В защищённом режиме элементом IDT является шлюз прерывания длиной 8 байт, содержащий сегментный (логический) адрес обработчика прерывания, права доступа и др.
В длинном режиме размер дескриптора прерывания увеличен до 16 байт.
В режиме V86 при использовании расширения VME таблица векторов располагается по виртуальному адресу 0000:0000. Без использования этого расширения (и в том случае, если переадресация прерываний запрещена) при возникновении прерывания процессор покидает режим V86 и выполняет обычный обработчик защищённого режима.
Аппаратные прерывания, внутренние, внешние
Аппаратные (внешние, асинхронные) — события, которые исходят от внешних
источников (например, периферийных устройств) и могут произойти в любой
произвольный момент (приницп асинхронности): сигнал от таймера, сетевой карты
или дискового накопителя, нажатие клавиш клавиатуры, движение мыши;
Внешние прерывания возникают по сигналу какого-нибудь внешнего устройства.
Иногда желательно сделать систему нечувствительной ко всем или отдельным
аппаратным прерываниям (т.е. от внешних устройств). Для этого используют так
называемое маскирование внешних прерываний.
Внешние прерывания подразделяются на:
немаскируемые (англ. Non maskable interrupt, NMI) — обрабатываются всегда,
независимо от запретов на другие прерывания. К примеру, такое прерывание
может вызвать сбой в микросхеме памяти
маскируемые - которые можно запрещать установкой соответствующих битов в
регистре маскирования прерываний (в x86-процессорах — сбросом флага IF в
регистре флагов);
Немаскируемые прерывания (говорят, что оно одно, т.к. подается на вывод
микропроцессора NMI) инициируют источники, требующие безотлагательного
вмешательства со стороны микропроцессора.
13. МНОГОЗАДАЧНОСТЬ, в информатике и программировании — свойство операционной системы (см.ОПЕРАЦИОННАЯ СИСТЕМА (ОС) ЭВМ) или среды программирования обеспечивать параллельнуюобработку нескольких процессов. Примитивные многозадачные среды обеспечивают разделение ресурсов— за каждой задачей закрепляют участок памяти, и задача выполняется в определенные интервалывремени. Более развитые многозадачные системы проводят распределение ресурсов динамически, когдазадача стартует в памяти или покидает память в зависимости от ее приоритета и от стратегии системы.Такая многозадачная среда обладает следующими особенностями. Основной трудностью реализациимногозадачной среды является ее надежность
Особенности реализации многозадачности в DOS
Микропроцессор Intel 8088, использовавшийся в первых ПК, не был специально разработан для реализации многозадачности. Частично проблема заключалась в недостатках управления памятью. В то время, как множество программ начинает и заканчивает свое выполнение, многозадачная операционная система должна осуществлять перемещение блоков памяти для объединения свободного пространства. На процессоре 8088 это было невозможно реализовать в стиле, прозрачном для приложений. Тем не менее, программисты, работавшие с DOS , нашли путь преодоления этих препятствий, преимущественно при использовании резидентных (terminate-and-stay-resident, TSR) программ. Некоторые TSR-программы, такие как спулер печати, использовали прерывание аппаратного таймера для выполнения процесса в фоновом режиме. Другие, подобно всплывающим (popup) утилитам, таким как SideKick, могли выполнять одну из задач переключения – приостановку выполнения приложения на время работы утилиты. DOS также была усовершенствована для обеспечения поддержки резидентных программ Некоторые производители программного обеспечения пытались создать многозадачные оболочки или оболочки, использующие переключение между задачами, как надстройки над DOS (например, Quarterdeck's DeskView), но только одна из этих оболочек получила широкое распространение на рынке. Это, конечно. Windows. Когда Microsoft выпустила на рынок Windows 1.0 в 1985 году, это было еще в большой степени искусственным решением, придуманным для преодоления ограничений MS DOS. В то время Windows работала в реальном режиме (real mode), но даже тогда она была способна перемещать блоки физической памяти (одно из необходимых условий многозадачности) и делала это, хотя и не очень прозрачно для приложений, но все-таки вполне удовлетворительно. В графической оконной среде многозадачность приобретает гораздо больший смысл, чем в однопользовательской операционной системе, использующей командную строку. Например, в классической операционной системе UNIX, работающей с командной строкой, существует возможность запускать программы из командной строки так, чтобы они выполнялись в фоновом режиме. Однако, любой вывод на экран из программы должен быть переадресован в файл, иначе этот вывод смешается с текущим содержимым экрана. Оконная оболочка позволяет нескольким программам выполняться совместно, разделяя один экран. Переключение вперед и назад становится тривиальным, существует возможность быстро передавать данные из одной программы в другую, например, разместить картинку, созданную в программе рисования, в текстовом файле, образованном с помощью текстового процессора. Передача данных поддерживалась в различных версиях Windows: сначала с использованием папки обмена (clipboard), позднее – посредством механизма динамического обмена данными (Dynamic Data Exchange, DDE), сейчас – через внедрение и связывание объектов (Object Linking andEmbedding, OLE). И все же, реализованная в ранних версиях Windows многозадачность не была традиционной вытесняющей, основанной на выделении отрезков времени, как в многопользовательских операционных системах. Такие операционные системы используют системный таймер для периодического прерывания выполнения одной задачи и запуска другой. 16-разрядные версии Windows поддерживали так называемую невытесняющую многозадачность (non-preemptive multitasking).[8, c. 60] Такой тип многозадачности был возможен благодаря основанной на сообщениях архитектуре Windows. В общем случае, Windows-программа находилась в памяти и не выполнялась до тех пор, пока не получала сообщение. Эти сообщения часто являлись прямым или косвенным результатом ввода информации пользователем с клавиатуры или мыши. После обработки сообщения программа возвращала управление обратноWindows. 16-разрядные версии Windows не имели возможности произвольно переключать управление с одной Windows-программы на другую, основываясь на квантах времени таймера. Переключение между задачами происходило в момент, когда программа завершала обработку сообщения и возвращала управление Windows. Такую невытесняющую многозадачность называют также кооперативной многозадачностью (cooperative multitasking) потому, что она требует некоторого согласования между приложениями. Одна Windows-программа могла парализовать работу всей системы, если ей требовалось много времени для обработки сообщения. Хотя невытесняющая многозадачность была основным типом многозадачности в 16-разрядных версиях Windows, некоторые элементы вытесняющей (примитивной, preemptive) многозадачности в них тоже присутствовали. Windows использовала вытесняющую многозадачность для выполнения DOS-программ, а также позволяла библиотекам динамической компоновки (DLL) получать прерывания аппаратного таймера для задач мультимедиа. 16-разрядные версии Windows имели некоторые особенности, которые помогали программистам если не разрешить, то, по крайней мере, справиться с ограничениями, связанными с невытесняющей многозадачностью. Наиболее известной является отображение курсора мыши в виде песочных часов. Конечно, это не решение проблемы, а только лишь возможность дать знать пользователю, что программа занята выполнением протяженной во времени работы, и что система какое-то время будет недоступна. Другим частичным решением является использование системного таймера Windows, что позволяет выполнять какие-либо действия периодически. Таймер часто используется в приложениях типа часов и приложениях, работающих с анимацией. Другим решением по преодолению ограничений невытесняющей многозадачности является вызов функции PeekMessage. Обычно программа использует вызов функции GetMes- sage для извлечения сообщений из очереди. Однако, если в данный момент времени очередь сообщений пуста, то функция GetMessageбудет ждать поступления сообщения в очередь, а затем возвратит его. Функция PeekMessage работает иначе – она возвращает управление программе даже в том случае, если нет сообщений в очереди. Таким образом, выполнение работы, требующей больших затрат времени, будет продолжаться до того момента, пока в очереди не появятся сообщения для данной или любой другой программы н
дискриптор
Рис. 4.4. Дескрипторы сегментов и их селекторы.
Под
адрес сегмента в дескрипторе выделяется
32 бит, и, таким образом, сегмент может
начинаться в любой точке адресного
пространства объемом 23- = 4 Гбайт. Это
адресное пространство носит название
линейного. В простейшем случае, когда
выключено страничное преобразование,
о котором речь будет идти позже, линейные
адреса отвечают физическим. Таким
образом, процессор может работать с
оперативной памятью объемом до 4
Гбайт.
Как и в реальном режиме,
адрес адресуемой ячейки вычисляется
процессором, как сумма базового адреса
сегмента и смещения:
Линейный
адрес = базовый адрес сегмента + смещение
В
32-разрядных процессорах смещение имеет
размер 32 бит, поэтому максимальная длина
сегмента составляет 2" = 4 Гбайт.
На
рис. 4.4 приведен гипотетический пример
программы, состоящей из трех сегментов,
первый из которых имеет длину 1 Мбайт и
расположен в начале адресного пространства,
второй, размером 100 Кбайт, вплотную
примыкает к первому, а третий, имеющий
размер всего 256 байт, расположен в
середине девятого по счету мегабайта.
Адреса,
используемые программой для обращения
к ячейкам памяти, и состоящие всегда из
двух компонентов - селектора и смещения
- иногда называются виртуальными. Система
сегментной адресации преобразует
виртуальные адреса в линейные. Поскольку
таблица дескрипторов, с помощью которой
осуществляется это преобразование,
обычно недоступна программе, программа
может не знать, в каких именно участках
логического адресного пространства
находятся се компоненты. Фактически
это сводится к тому, что, загружая
программу в память, вы не знаете, в каких
местах памяти будут находиться ее
сегменты, и каков будет порядок их
размещения. Программисту доступны
только виртуальные адреса, преобразование
же их в линейные и затем в физические
берет на себя операционная система.
Каков
объем виртуального адресного пространства?
Программа указывает номер нужного ей
дескриптора с помощью селектора, в
котором для ИНДЕКСА
дескриптора
отведено 13 бит. Отсюда следует, что в
дескрипторной таблице может быть до 1"
= 8. К дескрипторов. Однако в действительности
их в два раза больше, так как программа
может работать не с одной, а с двумя
дескрипторными таблицами - одной
глобальной, разделяемой всеми выполняемыми
задачами, и одной локальной, принадлежащей
конкретной задаче. В селекторе предусмотрен
специальный бит (бит 2), состояние которого
говорит о типе требуемой программе
дескрипторной таблицы. Таким образом,
всего программе могут быть доступны
214 = 16 К дескрипторов, т.е. 16 К сегментов.
Поскольку размер каждого сегмента,
определяемый максимальной величиной
смещения, может достигать 2-1 = 4 Гбайт,
объем виртуального адресного пространства
оказывается равным 16 К * 4 Кбайт = = 64
Тбайт.
Реально, однако, оперативная
память компьютера с 32-разрядной адресной
шиной не может быть больше 4 Гбайт, т.е.
при сделанных выше предположениях (16 К
сегментов размером 4 Гбайт каждый) в
памяти может поместиться максимум один
сегмент из более чем 16 тысяч. Где же
будут находиться все остальные?
Полный
объем виртуального пространства может
быть реализован только с помощью
многозадачной операционной системы,
которая хранит все неиспользуемые в
настоящий момент сегменты на диске,
загружая их в память по мере необходимости.
Разумеется, если мы хотим полностью
реализовать возможности, заложенные в
современные процессоры, нам потребуется
диск довольно большого объема - 64 Тбайт.
Однако и при нынешних более скромных
технических средствах (память до 100
Мбайт, жесткий диск до 10 Гбайт) принцип
виртуальной памяти используется всеми
многозадачными операционными системами
с большой эффективностью. С другой
стороны, для прикладного программиста
этот вопрос не представляет особого
интереса, так как сброс сегментов на
диск и подкачка их с диска осуществляются
операционной системой, а не программой,
и вмешательство эту процедуру вряд ли
целесообразно.
Как уже отмечалось,
адрес, вычисляемый процессором на основе
селектора и смещения, относится к
линейному адресному пространству, не
обязательно совпадающему с физическим.
Преобразование линейных адресов в
физические осуществляется с помощью
так называемой страничной трансляции,
частично реализуемой процессором, а
частично - операционной системой. Если
страничная трансляция выключена, все
ли-нейные адреса в точности совпадают
с физическими; если страничная трансляция
включена, то линейные адреса преобразуются
в физические в соответствии с содержимым
страничных таблиц (рис. 4.5).
Рис. 4.5. Цепочка преобразований виртуального адреса в физический.
Страницей называется связный участок линейного или физического адресного пространства объемом 4 Кбайт. Программа работает в линейном адресном пространстве, не подозревая о существовании страничного преобразования или даже самих страниц. Механизм страничной трансляции отображает логические страницы на физические в соответствии с информацией, содержащейся в страничных таблицах. В результате отдельные 4х-килобайтовыс участки программы могут реально находиться в любых несвязных друг с другом 4х-килобайтовых областях физической памяти (рис. 4.6). Порядок размещения физических страниц в памяти может не соответствовать (и обычно не соответствует) порядку следования логических страниц. Более того, некоторые логические страницы могут перекрываться, фактически сосуществуя в одной и той же области физической памяти. Страничная трансляция представляет собой довольно сложный механизм, в котором принимают участие аппаратные средства процессора и находящиеся в памяти таблицы преобразования. Назначение и взаимодействие элементов системы страничной трансляции схематически изображено на рис. 4.7. Система страничных таблиц состоит из двух уровней. На первом уровне находится каталог таблиц страниц (или просто каталог страниц) - резидентная в памяти таблица, содержащая 1024 4х-байтовых поля с адресами таблиц страниц. На втором уровне находятся таблицы страниц, каждая из которых содержит так же 1024 4х-байтовых поля с адресами физических страниц памяти. Максимально возможное число таблиц страниц определяется числом полей в каталоге и может доходить до 1024. Поскольку размер страницы составляет 4 Кбайт, 1024 таблицы по 1024 страницы перекрывают все адресное пространство (4 Гбайт).
Рис. 4.6. Отображение логических адресов на физические.
Рис. 4.7. Страничная трансляция адресов.
Не все 1024 таблицы страниц должны обязательно иметься в наличии (кстати, они заняли бы в памяти довольно много места - 4 Мбайт). Если программа реально использует лишь часть возможного линейного адресного пространства, а так всегда и бывает, то неиспользуемые поля в каталоге страниц помечаются, как отсутствующие. Для таких полей система, экономя память, не выделяет страничные таблицы. При включенной страничной трансляции линейный адрес рассматривается, как совокупность трех полей: 10-битового ИНДЕКСА в каталоге страниц, 10-битовбго индекса в выбранной таблице страниц и 12-битового смещения в выбранной странице. Напомним, что линейный адрес образуется путем сложения базового адреса сегмента, взятого из дескриптора сегмента, и смещения в этом сегменте, предоставленного программой. Старшие 10 бит линейного адреса образуют номер поля в каталоге страниц. Базовый адрес каталога хранится в одном из управляющих регистров процессора, конкретно, в регистре CR3. Из-за того, что каталог сам представляет собой страницу и выровнен в памяти на границу 4 Кбайт, в регистре CR3 для адресации к каталогу используются лишь старшие 20 бит, а младшие 12 бит зарезервированы для будущих применений. Поля каталога имеют размер 4 байт, поэтому индекс, извлеченный из линейного адреса, сдвигается влево на 2 бит (т.е. умножается на 4) и полученная величина складывается с базовым адресом каталога, образуя адрес конкретного поля каталога. Каждое поле каталога содержит физический базовый адрес одной из таблиц страниц, причем, поскольку таблицы страниц сами представляют собой страницы и выровнены в памяти на границу 4 Кбайт, в этом адресе значащими являются только старшие 20 бит. Далее из линейного адреса извлекается средняя часть (биты 12...21), сдвигается влево на 2 бит и складывается с базовым адресом, хранящимся в выбранном поле каталога. В результате образуется физический адрес страницы в памяти, в котором опять же используются только старшие 20 бит. Этот адрес, рассматриваемый, как старшие 20 бит физического адреса адресуемой ячейки, носит название страничного кадра. Страничный кадр дополняется с правой стороны младшими 12 битами линейного адреса, которые проходят через страничный механизм без изменения и играют роль смещения внутри выбранной физической страницы. Рассмотрим абстрактный пример, позволяющий проследить цепочку преобразования виртуального адреса в физический. Пусть программа выполняет команду
mov ЕАХ,DS:[ЕВХ]
при этом содержимое DS (селектор) составляет 1167И, а содержимое ЕВХ (смещение) 31678U. Старшие 13 бит селектора (число 116U) образуют индекс дескриптора в системной дескрипторной таблице. Каждый дескриптор включает в себя довольно большой объем информации о конкретном сегменте и, в частности, его линейный адрес. Пусть в ячейке дескрипторной таблицы с номером 116h записан линейный адрес (базовый адрес сегмента) 0l0Sl000h. Тогда полный линейный адрес адресуемой ячейки определится, как сумма базового адреса и смещения:
Базовый адрес сегмента 0l0Sl000h
Смещение 0003167811
Полный линейный адрес 0108267811
При выключенной табличной трансляции величина 010826У811 будет представлять собой абсолютный физический адрес ячейки, содержимое которой должно быть прочитано приведенной выше командой mov. Легко сообразить, что эта ячейка находится в самом начале 17-го мегабайта оперативной памяти. Посмотрим, как будет образовываться физический адрес при использовании страничной трансляции адресов. Полученный линейный адрес надо разделить на три составляющие для выделения индексов и смещения (рис. 4.8)
Рис. 4.8. Пример линейного адреса.
Индекс каталога составляет 4h. Умножение его на 4 даст смещение от начала каталога. Это смещение равно 10h. Индекс таблицы страниц оказался равным 82h. После умножения на 4 получаем смещение в таблице страниц, равное в данном случае 210h. Предположим, что регистр CR3 содержит число S000h. Тогда физический адрес ячейки в каталоге, откуда надо получить адрес закрепленной за данным участком программы таблицы страниц, составит S000h + l0h = 8010h. Пусть по этому адресу записано число 4602lh. Его 12 младших битов составляют служебную информацию (в частности, бит 1 свидетельствует о присутствии этой таблицы страниц в памяти, а бит 5 говорит о том, что к этой таблице уже были обращения), а старшие биты, т.е. число 46000h образуют физический базовый адрес таблицы страниц. Для получения адреса требуемой ячейки этой таблицы к базовому адресу надо прибавить смещение 210h. Результирующий адрес составит 462101г. Будем считать, что по адресу 4621011 записано число 01FF502111. Отбросив служебные биты, получим адрес физической страницы в памяти 01FF5000U. Этот адрес всегда оканчивается тремя нулями, так как страницы выровнены в памяти на границу 4 Кбайт. Для получения физического адреса адресуемой ячейки следует заполнить 12 младших бит полученного адреса битами смещения из линейного адреса нашей ячейки, в которых в нашем примере записано число 678h. В итоге получаем физический адрес памяти 01FF567811, расположенный в конце 32-го Мбайта. Как видно из этого примера, и со страничной трансляцией, и без нее вычисление физических адресов адресуемых ячеек выполняется в защищенном режиме совсем не так, как в реальном. Неприятным практическим следствием правил адресации защищенного режима является уже упоминавшаяся "оторванность" прикладной программы от физической памяти. Программист, отлаживающий программу защищенного режима (например, приложение Windows), может легко заглянуть в сегментные регистры и определить селекторы, выделенные программе. Однако селекторы абсолютно ничего не говорят о физических адресах, используемых программой. Физические адреса находятся в таблицах дескрипторов, а эти таблицы недоступны прикладной программе. Таким образом, программист не знает, где в памяти находится его программа или используемые ею области данных. С другой стороны, использование в процессе преобразования адресов защищенных системой таблиц имеет свои преимущества. Обычно многозадачная операционная система создает для каждой выполняемой задачи свой набор таблиц преобразования адресов. Это позволяет каждой из задач использовать весь диапазон виртуальных адресов, при этом, хотя для разных задач виртуальные адреса могут совпадать (и, как правило, по крайней мере частично совпадают), однако сегментное и страничное преобразования обеспечивают выделение для каждой задачи несовпадающих областей физической памяти, надежно изолируя виртуальные, адресные пространства задач друг от друга. Вернемся теперь к таблицам дескрипторов и рассмотрим их более детально. Существует два типа дескрипторных таблиц: таблица глобальных дескрипторов (GDT от Global Descriptor Table) и таблицы локальных дескрипторов (LDT от Local Descriptor Table).Обычно для каждой из этих таблиц в памяти создаются отдельные сегменты, хотя в принципе это не обязательно. Таблица глобальных дескрипторов существует в единственном экземпляре и обычно принадлежит операционной системе, а локальных таблиц может быть много (это типично для многозадачного режима, в котором каждой задаче назначается своя локальная таблица). Виртуальное адресное пространство делится на две равные половины. К одной половине обращение происходит через GDT, к другой половине через LDT. Как уже отмечалось, все виртуальное пространство состоит из 214 сегментов, из которых 213 сегментов адресуются через GDT, и еще 213 - чрез LDT. Когда многозадачная система переключает задачи, глобальная таблица остается неизменной, а текущая локальная таблица заменяется на локальную таблицу новой задачи. Таким образом, половина виртуального пространства в принципе доступна всем задачам в системе, а половина переключается от одной задачи к другой по мере переключения самих задач. Для программирования защищенного режима и даже для отладки прикладных программ, работающих в защищенном режиме, полезно представлять себе структуру дескриптора и смысл его отдельных полей. Следует заметить, что существует несколько типов дескрипторов, которым присущи разные форматы. Так, дескриптор сегмента памяти (наиболее распространенный тип дескриптора) отличается от дескриптора шлюза, используемого, в частности, для обслуживания прерываний. Рассмотрим формат дескриптора памяти (рис. 4.9).
Рис. 4.9. Формат дескриптора памяти.
Как видно из рисунка, дескриптор занимает 8 байт. В байтах 2...4 и 7 записывается линейный базовый адрес сегмента. Полная длина базового адреса - 32 бит. В байтах 0-1 записываются младшие 16 бит границы сегмента, а в младшие четыре бита байта атрибутов 2 - оставшиеся биты 16...19. Границей сегмента называется номер его последнего байта. Мы видим, что граница описывается 20-ю битами, и ее численное значение не может превышать 1М. Однако, единицы, в которых задается граница, можно изменять, что осуществляется с помощью бита дробности G (бит 7 байта атрибутов 2). Если G=0, граница указывается в байтах; если 1 - в блоках по 4 Кбайт. Таким образом, размер сегмента можно задавать с точностью до байта, но тогда он не может быть больше 1 Мбайт; если же установить G=l, то сегмент может достигать 4 Гбайт, однако его размер будет кратен 4 Кбайт. База сегмента и в том, и в другом случае задастся с точностью до байта. Рассмотрим теперь атрибуты сегмента, которые занимают два байта дескриптора. Бит A (Accessed, было обращение) устанавливается процессором в тот момент, когда в какой-либо сегментный регистр загружается селектор данного сегмента. Далее процессор этот бит не сбрасывает, однако его может сбросить программа (разумеется, если она имеет доступ к содержимому дескриптора, что обычно является прерогативой операционной системы). Анализируя биты обращения различных сегментов, программа может судить о том, было ли обращение к данному сегменту' после того, как она сбросила бит А. Тип сегмента занимает 3 бит (иногда бит А включают в поле типа, и тогда тип занимает 4 бит) и может иметь 8 значений. Тип определяет правила доступа к сегменту. Так, если сегмент имеет тип 1, для него разрешены чтение и запись, что характерно для сегментов данных. Назначив сегменту тип 0, мы разрешим только чтение этого сегмента, защитив его тем самым от любых модификаций. Тип 4 обозначает разрешение исполнения, что характерно для сегментов команд. Используются и другие типы сегментов. Подчеркнем, что защита сегментов памяти от несанкционированных его типом действий выполняется не программой, и даже не операционной системой, а процессором на аппаратном уровне. Так, при попытке записи в сегмент типа 0 возникнет так называемое исключение общей защиты. Исключением называется внутреннее прерывание, возбуждаемое процессором при возникновении каких-либо неправильных с его точки зрения ситуаций. Попытка записи в сегмент, для которого запись запрещена, и относится к такого рода ситуациям. Исключению общей защиты соответствует вектор 13, в котором должен находиться адрес обработчика этого исключения. Стоит еще обратить внимание на тип 4. Для сегмента команд разрешается только исполнение, но не запись и даже не чтение. Это значит, что в защищенном режиме программа не может случайно залезть в свой сегмент команд и затереть его; не может она также и сознательно модифицировать команды в процессе своего выполнения - методика, иногда используемая в программах реального режима для защиты от их расшифровки любознательными программистами Бит 4 байта атрибутов 1 является идентификатором сегмента. Если он равен 1, как это показано на рис. 4.9, дескриптор описывает сегмент памяти. Значение этого бита 0 характеризует дескриптор системного сегмента. Поле DPL (Descriptor Privilege Level, уровень привилегий дескриптора) служит для защиты программ друг от друга. Уровень привилегий может принимать значения от 0 (максимальные привилегии) до 3 (минимальные). Программам операционной системы обычно назначается уровень 0, прикладным программам - уровень 3, в результате чего исключается возможность некорректным программам разрушить операционную систему. С другой стороны, если прикладная программа сама выполняет функции операционной системы, переводя процессор в защищенный режим и работая далее в этом режиме, ее сегментам следует назначить наивысший (нулевой) уровень привилегий, что откроет ей доступ ко всем средствам защищенного режима. Бит Р говорит о присутствии сегмента в памяти. В основном он используется для организации виртуальной памяти. С помощью этого бита система может определить, находится ли требуемый сегмент в памяти, и при необходимости загрузить его с диска. В процессе выгрузки ненужного пока сегмента на диск бит Р в его дескрипторе сбрасывается. Младшая половина байта атрибутов 2 занята старшими битами границы сегмента. Бит AVL (от Available, доступный) не используется и не анализируется процессором и предназначен для использования прикладными программами. Бит D (Default, умолчание) определяет действующий по умолчанию размер для операндов и адресов. Он изменяет характеристики сегментов двух типов: исполняемых и стека. Если бит D сегмента команд равен 0, в сегменте по умолчанию используются 16-битовые адреса и операнды, если 1 - 32-битовые. Атрибут сегмента, действующий по умолчанию, можно изменить на противоположный с помощью префиксов замены размера операнда (66h) и замены размера адреса (67п). Таким образом, для сегмента с D=0 префикс 66h перед некоторой командой заставляет ее рассматривать свои операнды, как 32-битовые, а для сегмента с D=l тот же префикс 66h, наоборот, сделает операнды 16-битовыми. В некоторых случаях транслятор сам включает в объектный модуль необходимые префиксы, в других случаях их приходится вводить в программу "вручную". Рассмотрим теперь для примера простую программу, которая, будучи запущена обычным образом под управлением MS-DOS, переключает процессор в защищенный режим, выводит на экран для контроля символ, переходит назад в реальный режим (чтобы не вывести компьютер из равновесия) и завершается стандартным для DOS образом. Для того, чтобы наша программа могла бы хоть что-то сделать в защищенном режиме, для нее необходимо создать среду защищенного режима, в первую очередь, таблицу глобальных дескрипторов с описанием всех сегментов, с которыми программа будет работать. Кроме нас никто эту таблицу (при работе в DOS) не создаст. Таким образом, наша программа будет в какой-то мере выполнять функции операционной системы защищенного режима. Для практического исследования защищенного режима придется выполнить некоторую работу по переконфигурированию компьютера. В наше время компьютеры обычно конфигурируются так, что при их включении сразу загружается система Windows. Работы, для которых требуется DOS, выполняются либо в режиме эмуляции DOS, либо в сеансе DOS, организуемом системой Windows. Для запуска прикладной программы защищенного режима такой способ не годится. Нам понадобится DOS в "чистом виде", без следов Windows. Более того, перед запуском программы необходимо выгрузить все драйверы обслуживания расширенной памяти (HIMEM.SYS и EMM386.EXE) и программы, использующие расширенную память, например, SMARTDRV.EXE. Лучше всего загружать DOS с системной дискеты, подготовив файлы CONFIG.SYS и AUTOEXEC.BAT в минимальном варианте. Обсуждая в начале этого раздела основы защищенного режима, мы не затронули многие, в том числе принципиальные вопросы, с которыми придется столкнуться при написании работоспособной программы. Необходимые пояснения будут даны в конце этого раздела.
Только перевод микропроцессора в защищенный режим позволяет полностью реализовать все возможности, загаженные в его архитектуру и недоступные в реальном режиме. Сюда можно отнести: - увеличение адресуемого пространства до 4 Гбайт; - возможность работать в виртуальном адресном пространстве, превышающем максимально возможный объем физической памяти и составляющем огромную величину 64 Тбайт; - организация многозадачного режима с параллельным выполнением нескольких программ (процессов). Собственно говоря, многозадачный режим организует многозадачная операционная система, однако микропроцессор предоставляет необходимый для этого режима мощный и надежный механизм защиты задач друг от друга с помощью четырехуровневой системы привилегий; - страничная организация памяти, повышающая уровень защиты задач друг от друга и эффективность их выполнения. При включении микропроцессора в нем автоматически устанавливается режим реального адреса. Переход в защищенный режим осуществляется программно путем выполнения соответствующей последовательности команд. Поскольку многие детали функционирования микропроцессора в реальном и защищенном режимах существенно различаются, программы, предназначенные для защищенного режима, должны быть написаны особым образом. При этом различия реального и защищенного режимов настолько велики, что программы реального режима не могут выполняться в защищенном режиме и наоборот. Другими словами, реальный и защищенный режимы не совместимы. Архитектура современного микропроцессора необычайно сложна. Столь же сложными оказываются и средства защищенного режима, а также программы, использующие эти средства. С другой стороны, при решении многих прикладных задач (например, при отладке приложений Windows, работающих, естественно, в защищенном режиме), нет необходимости в понимании всех деталей функционирования защищенного режима; достаточно иметь знакомство с его основными понятиями. В настоящем разделе дается краткое описание основ защищенного режима и его наиболее важных структур и алгоритмов функционирования. Пожалуй, наиболее важным отличием защищенного режима от реального является иной принцип формирования физического адреса. Вспомним, что в реальном режиме физический адрес адресуемой ячейки памяти состоит из двух компонентов - сегментного адреса и смещения. Оба компонента имеют размер 16 бит, и процессор, обращаясь к памяти, пользуется следующим правилом вычисления физического адреса:
Физический адрес = сегментный адрес * 16 + смещение
И сегментный адрес, и смещение не могут быть больше FFFFh, откуда следуют два важнейших ограничения реального режима: объем адресного пространства составляет всего 1 Мбайт, а сегменты не могут иметь размер, превышающий 64 Кбайт. В защищенном режиме программа по-прежнему состоит из сегментов, адресуемых с помощью 16-разрядных сегментных регистров, однако местоположение сегментов в физической памяти определяется другим способом. В сегментные регистры в защищенном режиме записываются не сегментные адреса, а так называемые селекторы, биты 3...15 которых рассматриваются, как номера (индексы) ячеек специальной таблицы, содержащей дескрипторы сегментов программы. Таблица дескрипторов обычно создастся операционной системой защищенного режима (например, системой Windows) и, как правило, недоступна программе. Каждый дескриптор таблицы дескрипторов имеет размер 8 байт, и в нем хранятся все характеристики, необходимые процессору для обслуживания этого сегмента. Среди этих характеристик необходимо выделить в первую очередь две: адрес сегмента и его длину
17. Алгоритм определения виртуального адреса.
Формирование виртуального адреса на основе генеральной дескрипторной таблицы.
Задача: найти адрес ячейки памяти, если есть ГДТ.
Программист указывает адрес ячейки памяти относительно базы начала сегмента. Этот адрес называется относительным. Относительный адрес 32х – разрядный.
ВАЯП – виртуальный адрес ячейки памяти.
Система прерываний 32-разрядных микропроцессоров i80x86.
Работа системы прерываний в защищенном режиме
Вопросы
1. Отличия работы системы прерываний в защищенном режиме
2. Классификация прерываний в защищенном режиме
3. Таблица дескрипторов прерываний IDT
4. Обобщенная схема обработки прерывания в защищенном режиме
5. Шлюз ловушки
6. Шлюз прерывания
7. Шлюз задачи
8. Резюме
Обработка прерываний в защищенном режиме отличается от обработки в реальном режиме так же сильно, как и защищенный режим отличается от реального.
Потому что:
1. В защищенном режиме немного изменено распределение номеров векторов прерываний. (Можно самостоятельно посмотреть по таблицам, например, в книге Аssembler Юрова, Хорошенко на стр. 439-441)
2. Принципиально иным является механизм обработки прерываний.
Классификация прерываний в защищенном режиме
Прерывания и исключения можно разделить на несколько групп:
1. сбой;
2. ловушка;
3. аварийное завершение.
Это деление производится в соответствии со следующими признаками:
· какая информация сохраняется о месте возникновения прерывания (исключения)?
· возможно ли возобновление прерванной программы?
Исходя из этих признаков, можно дать следующие характеристики вышеперечисленным группам:
Сбой (ошибка) — прерывание или исключение, при возникновении которого в стек записываются значения регистров cs: ip, указывающие на команду, вызвавшую данное прерывание. Это позволяет, получив доступ к сегменту кода, исправить ошибочную команду в обработчике прерывания и, вернув управление программе, фактически осуществить ее рестарт (вспомните, что в реальном режиме при возникновении прерывания в стеке всегда запоминается адрес команды, следующей за той, которая вызвала это прерывание).
Ловушка — прерывание или исключение, при возникновении которого в стек записываются значения регистров cs: ip, указывающие на команду, следующую за командой, вызвавшей данное прерывание.
Так же, как и в случае ошибок возможен рестарт программы. Для этого необходимо лишь исправить в обработчике прерывания соответствующие код или данные, послужившие источником ошибки. После этого перед возвратом управления нужно скорректировать значение ip в стеке на длину команды, вызвавшей данное прерывание.
Механизм ловушек похож на механизм прерываний в реальном режиме, хотя не во всем. Здесь есть один тонкий момент. Если прерывание типа ловушки возникло в команде передачи управления jmp, то содержимое пары cs: ip в стеке будет отражать результат этого перехода, то есть соответствовать команде назначения.
Аварийное завершение — прерывание, при котором информация о месте его возникновения недоступна или неполна и поэтому рестарт практически невозможен, если только данная ситуация не была запланирована заранее.
Þ соответствующие программы-обработчики ошибок, ловушек и аварий будут отличаться алгоритмами работы.
Микропроцессор жестко определяет, какие прерывания являются ошибками, ловушками и авариями.
Замечания.
Для некоторых номеров прерываний в реальном режиме возможны 2 источника прерывания (развитие микропроцессоров).
Некоторые прерывания при своем возникновении дополнительно генерируют и записывают в стек так называемый код ошибки. Этот код может впоследствии использоваться для установления источника прерывания. Код ошибки записывается в стек вслед за содержимым регистров eflags, cs и eip.
Þ можно распознать истинный источник прерывания (если есть неоднозначность).
Таблица дескрипторов прерываний IDT
Вместо таблицы векторов прерываний система прерываний имеет дело с таблицей дескрипторов прерываний (IDT, interrupt descriptor table)
Таблица IDT связывает каждый вектор прерывания с дескриптором процедуры или задачи, которая будет обрабатывать это прерывание.
Элементами таблицы IDT являются дескрипторы - Размер дескриптора = 8 байтам.
(Т.е. формат таблицы IDT подобен формату GDT и LDT.)
Дескрипторы в таблице прерываний обычно называются шлюзами (иногда коммутаторами).
Шлюзы предназначены для указания точки входа в программу обработки прерывания.
В дескрипторной таблице прерываний IDT могут содержаться шлюзы трех типов:
· шлюз ловушки;
· шлюз прерывания;
· шлюз задачи.
Физически микропроцессор отличает шлюзы по содержимому полей.
Особенности таблицы IDT:
· нулевой дескриптор используется для описания шлюза для программы обработки исключительной ситуации 0 (ошибка деления);
(в таблице GDT отсутствует)
· дескрипторы в таблице IDT строго упорядочены в соответствии с номерами прерываний.
В таблицах GDT и LDT порядок описания дескрипторов роли не играет, хотя и допускается наличие некоторых соглашений по их упорядоченности;
· размерность таблицы IDT — не более 256 элементов размером по восемь байт, по числу возможных источников прерываний.
В отдельных случаях есть смысл описывать все 256 дескрипторов этой таблицы, формируя для неиспользуемых номеров прерываний шлюзы-заглушки. Это позволит корректно обрабатывать все прерывания, даже если они и не планируются к использованию в данной задаче. Если этого не сделать, то при незапланированном прерывании с номером, превышающим пределы IDT для данной задачи, будет возникать исключительная ситуация общей защиты (с номером 13 (ODh)).
Адрес и длина таблицы IDT содержатся в регистре idtr.
Заметим, что в реальном режиме регистр idtr также содержит адрес таблицы прерываний, но при этом каждый вектор занимает 4 байта и содержит 32-разрядный адрес в формате CS:IP. Начальное значение этого регистра равно нулю, но внего можно занести и другое значение.
! |
В защищенном режиме произвести загрузку регистра idtr может только код с максимальным уровнем привилегий.
! |
Доступ к таблице IDT со стороны пользовательских (прикладных) программ невозможен.
Обобщенная схема обработки прерывания в защищенном режиме
При возникновении прерывания от источника с номером п микропроцессор, находясь в защищенном режиме, выполняет следующие действия:
1. Определяет местонахождение таблицы IDT, адрес и размер которой содержится в регистре idtr.
2. Складывает значение адреса, по которому размещена IDT, и значение n*8. По данному смещению в таблице IDT должен находиться 8-байтовый дескриптор, определяющий местоположение процедуры обработки прерывания.
3. Переключается на процедуру обработки прерывания.
Шлюз ловушки
Формат шлюза ловушки —
offset_2 |
p |
dpl |
0 |
1 1 1 1 |
000 |
не используется |
63 47 39 36 32
indicator |
offset_1 |
31 15 0
Offset_1, offset_2 - первая и вторая половины смещения в сегменте
indicator - Селектор, указывающий на дескриптор в LDT или GDT
000 - Постоянное значение
type - 1111 - Тип шлюза — ловушка
dpl - Определение минимального уровня привилегий задачи, которая может передать управление обработчику прерываний через данный шлюз (обычно dpl = 112)
p - Бит присутствия (0 или 1)
Когда возникает прерывание и его вектор выбирает в таблице IDT дескриптор шлюза с типом ловушки, микропроцессор сохраняет в стеке информацию о месте, где он прервал работу текущей программы. После этого он передает управление в соответствии с полямиindicator и offset.
Поле indicator представляет селектор одной из таблиц, GDT или LDT, в зависимости от состояния бита TI в нем.
Поле offset определяет смещение в сегменте кода. Этот сегмент кода описывается дескриптором, на который указывает селектор в поле indicator.
После того как управление было передано обработчику прерывания, он выполняет свою работу до тех пор, пока не встретит команду iret. Эта команда восстанавливает из стека состояние регистров eflags, cs и eip на момент возникновения прерывания, и работа приостановленной программы продолжается.
! |
Шлюз прерывания
Шлюз прерывания отличается только полем типа = 1110.
При возникновении прерывания, которому соответствует шлюз прерывания, микропроцессор выполняет те же действия, что и для шлюза ловушки, но с одним важным отличием:
при передаче управления обработчику прерывания через шлюз прерывания, микропроцессор сбрасывает флаг прерывания в регистре eflags в 0, запрещая тем самым обработку аппаратных прерываний. Этот факт имеет важное значение для программирования обработчиков аппаратных и программных прерываний.
Совет. Если у вас есть сомнение в том, какой из шлюзов - прерывания или ловушки - использовать — применяйте шлюз прерывания.
Шлюз задачи
Шлюз задачи отличается
1) поле типа = 1110
2) поле indicator вместо селектора сегмента кода указывает на дескриптор сегмента состояния задачи (TSS).
Осуществляется переход на новую задачу, которая будет осуществлять обработку прерывания. Задача является частью механизма многозадачности. Т.е. производится переключение задач. (Текущее состояние прерываемой задачи аппаратно сохраняется в ее собственномTSS.)
Для каждой задачи определяется сегмент состояния задачи TSS (Task Segment Status) со строго определенной структурой. В этом сегменте есть поля для сохранения всех регистров общего назначения, некоторых системных регистров и другой информации. Всю совокупность этой информации называют контекстом задачи. Этот сегмент описывается, подобно другим сегментам, дескриптором в таблице GDT или LDT.
Если с помощью некоторого селектора обратиться к такому дескриптору, то микропроцессор осуществит переключение на соответствующую задачу. Подобные переключения могут, в частности, осуществляться операционной системой, поддерживающей многозадачность, в соответствии с некоторой дисциплиной разделения времени между задачами. Переключение задач может производиться обычными командами межсегментной передачи управления либо по возникновению прерывания при переходе к обработчику прерывания через шлюз задачи.
РЕЗЮМЕ
Шлюзы ловушки и прерывания с помощью полей indicator и offset определяют адрес, по которому находится точка входа в программу обработки прерывания.
Шлюз задачи предназначен для реализации принципиально иного перехода к обработчику прерываний — с использованием механизма переключения задач.
! |
Страничное преобразование
Следующее после сегментации преобразование адресов: линейный → физический — имеет множество вариаций в своём алгоритме, в зависимости от того, в каком режиме (32-битном, PAE или 64-битном) находится процессор.
Однако
общая идея всегда одна и та же: линейный
адрес разбивается на несколько частей,
каждая из которых служит индексом в
одной из системных таблиц, хранящихся
в памяти. Записи в таблицах — это адреса
начала таблицы следующего уровня или,
для последнего уровня — искомая
информация о физическом адресе страницы
в памяти и её свойствах. Самые младшие
биты не преобразуются, а используются
для адресации внутри найденной страницы.
Например, для режима PAE с размером страниц
4 кбайт преобразование выглядит
так:
В
разных режимах процессора различается
число и ёмкость этих таблиц. Преобразование
может завершиться неудачей, если
очередная таблица не содержит валидных
данных, или права доступа, хранящиеся
в последней из них, запрещают доступ к
странице; например, при записи в регионы,
помеченные как «только для чтения», или
попытке чтения памяти ядра из
непривилегированного процесса.
20. Переключение задач в защищенном режиме работы, инструкции.
Переключение задач
Для переключения задач имеются следующие возможности:
переключение по команде JMP;
переключение по команде CALL;
переключение по прерыванию.
В первом и втором случаях для переключения задачи используются обычные команды JMP и CALL, но в качестве операнда в этих командах указывается адрес сегмента TSS задачи, на которую необходимо переключиться.
Если произошло переключение с первой задачи на вторую при помощи команды JMP, то для возврата к выполнению первой задачи необходимо вновь использовать JMP, указав в качестве операнда адрес TSS первой задачи.
Команда CALL позволяет организовать вызов вложенных задач. Переключившись из первой задачи на вторую, программа может вновь вернуться к первой задаче, если она выполнит команду IRET. В этом случае по команде IRET произойдет обратное переключение задач. Адрес TSS для возврата команда IRET возьмёт из поля обратной связи Link текущего сегмента TSS, куда он был записан командой CALL при первом переключении задач.
Кроме того, при переключении задачи командой CALL в поле FLAGS сегмента TSS вызванной задачи устанавливается в 1 бит вложенной задачи NT. Команда JMP, если она использована для переключения задачи, сбрасывает бит NT. Регистр флагов FLAGS процессора - это младшее слово 32-разрядного регистра EFLAGS.
Аналогично тому, как можно вызвать подпрограмму через вентиль вызова, для вызова задачи командой CALL можно использовать вентиль задачи. Формат вентиля задачи представлен на рис. 16.
Рис. 16. Вентиль задачи.
Вентили задач, вызываемых по команде CALL, могут располагаться в таблицах GDT или LDT.
Обратите внимание на одно существенное различие между вызовом подпрограммы и вызовом задачи. После возврата из подпрограммы при её повторном вызове мы войдём в процедуру в начальной точке входа. В аналогичном случае при возврате из задачи и её повторном вызове управление будет передано команде, находящейся сразу за командой IRET.
Это происходит потому, что при переключении задачи в сегменте TSS записывается содержимое регистров CS:IP на момент переключения задачи. Если задача была вызвана при помощи команды CALL и возврат (обратное переключение) было выполнено по команде IRET, в TSS записывается адрес CS:IP, указывающий на следующую после IRET команду. Вы можете поместить там команду безусловного перехода JMP на начало задачи и таким образом зациклить задачу. После этого вызов задачи станет похож на вызов подпрограммы.
Существует ещё одна очень интересная возможность для переключения задач - переключение задач по прерыванию.
Эту возможность можно легко реализовать, если поместить вентиль задачи в дескрипторную таблицу прерываний IDT. Например, можно сделать отдельные задачи для обработки исключений или аппаратных прерываний. В последнем случае обработчикам аппаратных прерываний не нужно использовать стек прикладных задач, так как они будут иметь свой собственный стек.
21. Переключение задач в защищенном режиме работы, сегмент TSS.
(Сначала с конспекта)
Сегмент состояния задачи – позволяет реализовывать многозадачность, т.к.
каждая программа (задача) имеет свой TSS. Как только процессор получает на обработку сегмент TSS другой программы, он начинает выполнять другую программу.
Новая задача получает новый TR (регистр задач);
Процессор сохраняет старый TR в TSS
…….. и чё-то делает с контроллером прерываний и ОЗУ. LOL…..
Сегмент состояния задачи
Состояние процессора, необходимое для восстановления задачи, хранится в системном сегменте, называемом сегментом состояния задачи (Task State Segment - TSS).
Сегмент состояния задачи содержит динамические (обновляемые) и статические (необновляемые) поля. К динамическим относятся поля, соответствующие регистрам общего назначения, сегментным регистрам, регистру флагов, указателю команд EIP, и поле "Связь TSS". Динамические поля автоматически обновляются процессором при сохранении контекста задачи во время переключения на другую задачу. К статическим относятся все остальные поля: селектор LDT, адрес каталога таблиц (PDBR), указатели привилегированных стеков (SS0:SP0, SS1:SP1, SS2:SP2), флаг отладки (T) и базовый адрес карты разрешения ввода-вывода (I/O Permission Map Base Address). Статические поля заполняются системным ПО при создании задачи (при создании TSS) и не изменяются процессором при переключении задач.
Дескриптор TSS должен находиться в GDT. Процессор генерирует нарушение общей защиты при попытке переключиться на задачу, селектор TSS которой содержит бит TI=1. Для запущенной в данный момент задачи (или приостановленной) дескриптор TSS имеет тип "занятый TSS" (S=0, типы 3 и 11). Процессор не поддерживает рекурсию задач, поэтому попытка переключения задач при помощи селектора "занятого TSS" вызывает исключение.
22. Система привилегий программ в ЗРР.
Зачем нужно использовать дескрипторные таблицы двух типов?
В мультизадачной операционной системе можно использовать одну глобальную таблицу дескрипторов для описания областей памяти, принадлежащей операционной системе и несколько локальных таблиц дескрипторов для каждой задачи. В этом случае при соответствующей настройке базовых адресов можно изолировать адресные пространства операционной системы и отдельных задач. Если сделать так, что каждая задача будет пользоваться только своей таблицей дескрипторов, любая задача сможет адресоваться только к своим сегментам памяти, описанным в соответствующей таблице, и к сегментам памяти, описанным в глобальной таблице дескрипторов. В системе может существовать только одна глобальная таблица дескрипторов.
Поле RPL (Requested Privilege Level ) селектора содержит уровень привилегий, запрошенный программой при обращении к сегменту. Программа может обращаться только к таким сегментам, которые имеют соответствующий уровень привилегий. Поэтому программа не может, например, воспользоваться глобальной таблицей дескрипторов для получения доступа к описанным в ней системным сегментам, если она не обладает достаточным уровнем привилегий. На этом основана защита системных данных от разрушения (преднамеренного или в результате программной ошибки) со стороны прикладных программ.
Таблица дескрипторов содержит, помимо базового адреса сегмента, другую информацию, описывающую сегмент (рис. 2.5). Точный формат дескриптора, а также других структур данных и системных регистров, имеющих отношение к работе в защищенном режиме, вы можете найти в 6 томе "Библиотеки системного программиста".
Рис. 2.5. Формат дескриптора сегмента процессора 80286
В частности, дескриптор содержит размер сегмента (предел). При вычислении физического адреса процессор следит за тем, чтобы физический адрес не выходил за пределы, указанные в дескрипторе сегмента. Программа не может обратиться к памяти, лежащей вне пределов, указанных в дескрипторе. Если же она попробует это сделать, ее работа будет прервана. Поэтому, создав, например, сегмент для хранения массива размером 100 байт, вы не сможете записать в него 101 байт или 10 Кбайт данных.
Поле доступа содержит уровень привилегий сегмента и информацию о типе сегмента. Существуют сегменты кода, сегменты данных и системные сегменты. Кроме того, для сегмента кода можно запретить операцию чтения, а для сегмента данных - операцию записи. Поэтому операционная система может создать сегменты кода, которые можно выполнять, но нельзя читать, и сегменты данных, защищенные от записи.
Что же касается привилегий, в процессорах 80ххх и Pentium существуют четыре уровня привилегий - от 0 до 3, причем наибольшие привилегии соответствуют уровню 0. Уровни привилегий часто называют также кольцами защиты (рис. 2.6).
Рис. 2.6. Кольца защиты
В кольце 0 обычно работает ядро операционной системы. Кольцо 1 соответствует уровню привилегий драйверов, кольцо 2 - системам, таким как системы управления базами данных. В наименее привилегированном кольце 3 располагаются прикладные программы, запускаемые пользователем.
Описанная выше схема распределения привилегий может изменяться от одной операционной системы к другой. В операционной системе Windows 3.1 в нулевом кольце располагаются только виртуальные драйверы, все остальные модули Windows, а также приложения, работают в кольце 3.
24. Алгебра логики, определение, аксиомы.
Алгебра логики — это раздел математики, изучающий высказывания, рассматриваемые со стороны их логических значений (истинности или ложности) и логических операций над ними.
Чаще всего предполагается, что высказывания могут быть только истинными или ложными, то есть используется так называемая бинарная или двоичная логика.
Базовыми элементами, которыми оперирует алгебра логики, являются высказывания.
Высказывания строятся над непустым множеством, над элементами которого определены три операции:
•отрицание
(унарная
операция), обозначение:
Отрицание в логике – операция над суждениями или высказываниями, результатом которой является суждение «противоположное» исходному. Синоним: логическое "НЕ".
•конъюнкция
(бинарная), обозначение:
Конъюнкция— логическая операция, по своему применению максимально приближенная к союзу «и». Синонимы: логическое «И», логическое умножение, иногда просто «И»
•дизъюнкция
(бинарная),
обозначение:
Дизъюнкция - логическое сложение, логическое ИЛИ, включающее ИЛИ; иногда просто ИЛИ — логическая операция, по своему применению максимально приближённая к союзу «или» в смысле «или то, или это, или оба сразу».
Логический ноль 0 и логическая единица 1 — константы.
Аксиомы алгебры логики.
,
25. Теоремы алгебры логики.
Алгебра логики — это раздел математики, изучающий высказывания, рассматриваемые со стороны их логических значений (истинности или ложности) и логических операций над ними.
Теоремы алгебры логики:
Идемпотентные
законы (законы тождества):
Коммутативные
законы (переместительные):
Ассоциативные
законы (сочетательные):
Дистрибутивные
законы:
Законы
отрицания:
Законы
двойственности (Теоремы де Моргана):
Закон
двойного отрицания:
Законы
поглощения
(абсорбция):
Операции склеивания:
Операции обобщенного
склеивания:
26. Логические функции, область определения логической функции.
Логическая функция (определение учителя) – логическое выражение, состоящее из логических переменных, связанных между собой с помощью операций алгебры логики.
Логическая функция (1) — это функция логических переменных, которая может принимать только два значения: 0 или 1. В свою очередь, сама логическая переменная (аргумент логической функции) тоже может принимать только два значения: 0 или 1.
Логической функцией F (2) от набора логических переменных х1,…, хn называется функция, которая может принимать только два значения: логический 0 и логическая 1.
Областью определения логической функции n- переменных – называется совокупность точек n- мерного пространства, причём каждая точка создаётся определённой комбинацией значений переменных. (определение учителя).
Область определения логической функции конечна и зависит от количества возможных наборов аргументов. Если n – число аргументов, то количество возможных наборов аргументов равно 2n.
Множество значений функции F(x1,…, xn) – это множество {0,1}, т. е. F=0 либо 1.
Любая логическая функция может быть задана с помощью таблицы истинности, в левой части которой записываются наборы аргументов, а в правой – соответствующие значения функции.
Виды логических функций по степени определённости.
Если функция n- переменных полностью определена во всех точках области определения m, то такая функция называется – полностью определённая функция.
Если функция n- переменных не определена во всех точках области определения m, то такая функция называется – не полностью определённая функция.
Если функция n- переменных не определена не в одной точке области определения m, то такая функция называется – полностью неопределённая функция.
27. Логические функции одной и двух переменных.
Логическая функция - это функция логических переменных, которая может принимать только два значения: 0 или 1. В свою очередь, сама логическая переменная (аргумент логической функции) тоже может принимать только два значения: 0 или 1.
Логическая функция одной переменной.
Таблица истинности функции одной переменной Y=f(X) содержит всего 2 строки, а число функций одной переменной равно 4.
V |
X |
f0 |
f1 |
f2 |
f3 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
f0 – «нулевая» функция. Всегда имеет значение «0», не зависимо то значения переменной.
f1 - x̅, функция инверсии.
f2 – функция повторения.
f3 – «единичная» функция. Всегда имеет значение «1».
Обозначение функции F1 – инверсии одной переменной в схемотехнике.
Логическая функция двух переменных.
Таблица истинности функции двух переменных Y=f(X1,Х2) содержит 4 строки, а число функций двух переменных равно 16.
V |
X1 |
X0 |
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
F8 |
F9 |
F10 |
F11 |
F12 |
F13 |
F14 |
F15 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
3 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
• F10 = F0 – функции, независящие от переменной x1.
•
F14
= X1
˅ X0
–логическое «или», (+), дизъюнкция.
X1 |
X0 |
F14 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
•
F8
= X1
˄ X0
– логическое «и», (•), конъюнкция?
X1 |
X0 |
F8 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
•
F1
=
- логическое
«или-не». Функция «стрелка Пирса».
X1 |
X0 |
F1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
F
7
=
– логическое выражение «и-не». Функция
«штрих Шеффера».
X1 |
X0 |
F7 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
•
-
Минимизации функций
Для начала вам надо уметь составлять СДНФ и СКНФ, потому что это, скорее всего, тоже будет в контрольной. Что это такое можно прочитать и в материалах, и в других доступных источниках. Если кратко, то СКНФ - совершенно конъюнктивная нормальная форма, а СДНФ - совершенно дизъюнктивная нормальная форма.
Совершенно конъюнктивная НФ - конъюнкция дизъюнкций, причём в каждой дизъюнкции (в каждой скобке) присутствуют все переменные, входящие в формулу, либо их отрицание, нет одинаковых дизъюнкций, в каждой дизъюнкции нет одинаковых слагаемых:
СКНФ:
Совершенно дизьюнктивная НФ - дизьюнкция коньюнкций , причём в каждой коньюнкции присутствуют все переменные, входящие в формулу, либо их отрицание, нет одинаковых коньюнкций, в каждой коньюнкции нет одинаковых слагаемых:
СДНФ:
Теперь рассмотрим пример, в котором по таблице истинности построим СДНФ и СКНФ, а затем уже перейдём к минимизации.
Для
примера возьмём функцию с тремя
переменными и уже разобранную на
занятии.
Рассмотрим по пунктам, как составить СДНФ:
1.
Записываем произведение наборов
переменных
,
если функция равна 1 (F=1);
2.
Берём переменную с отрицанием, если её
значение равно 0
3.
Между каждым произведением набора
переменных ставим знак логического
сложения
Теперь составим СДНФ для нашей таблицы истинности.
СДНФ:
Рассмотрим по пунктам, как составить СКНФ:
1. Записываем произведение наборов переменных , если функция равна 0 (F=0);
2.
Берём переменную с отрицанием, если её
значение равно 1
;
3.
Между каждым произведением набора
переменных ставим знак логического
сложения
Составим СКНФ для таблицы истинности.
СКНФ:
Теперь перейдём к минимизации функций.
Сначала
рассмотрим способ, с помощью которого
мы будет упрощать СДНФ и СКНФ. Начнём с
СДНФ:
Теперь ищем пары слагаемых, которые отличаются только одной переменной, то есть в одном случае она с отрицанием, в другом – без. Выделяем такие пары (тут такие пары будут выделены одинаковыми цветами) :
Но
стоит заметить, что если разбить слогаемые
на пары, то одно из слогаемых останется
без пары. И тут мы обращаемся к аксиомам
алгебры логики:
Исходя из этого, делаем следующие
преобразования:
Теперь делим слогаемые на пары и выносим за скобки одинаковые переменные, после чего содержимое скобок сокращаются (как и почему это происходит, вы должны знать):
Теперь
перейдём к минимизации СКНФ. Принцип
такой же, как и с СДНФ:
Скорее всего контрольная у нас будет по СДНФ, но к СКНФ тоже надо быть готовым. А теперь то, что точно будет в контрольной. Карты Карно – ещё один способ минимизации.
Работать будем уже с имеющейся у нас таблицей истинности. Для начала рисуем такую таблицу:
Отдельно нужно отметить нумерацию внутри таблицы. Это вам стоит запомнить.
Теперь заполняем таблицу. Соответствующие клетки заполняем 1, если F=1, и оставляем пустыми либо ставим 0, если F=0:
Теперь ищем группы соседних 1, которые зацикливаются. Соседними являются 1, стояие рядом друг с другом по горизонтали и по вертикали. Так же соседними являются крайние 1, то есть 1 из клетки 0 являяется соседней с 1 из клетки 2. Если трудно понять, что значит «зацикливаются», то можете запомнить, что группы единиц могут состоять из 2, 4, 8 и любому другому колличеству единиц равному 2 в степени n. А зациклиться такие группы могут только в квадрате или прямоугольнике. Так же в разные группы, при необходимости, могут попадать одни и теже 1. В конце я рассмотрю её пару отдельных случаев, а пока вернёмся к примеру. Итак, выделяем группы:
Пусть группа, выделенная чёрным, будет группой 1, а выделенная красным – группой 2. Смотрим в группах переменные, которые остаются неизменными. В группе 1 это x2, а в группе два – x1 и x0. Теперь смотрим, какие значения у этих переменных: если 0, то берём переменную с отрицание, если 1, то без. И у нас получается следующее уравнение:
Теперь ещё немного о картах Карно. У нас в контрольных будут функции с тремя и четырьмя переменными, так что вот таблица для четырёх переменных, её нужно обязательно запомнить, особенно нумерацию.
А сейчас на такой таблице рассмотрим ещё два случая, связанных с группами из 1:
Тут почти все 1 отнесенны к группам. Остальсь только 1 из клеток 14 и 8. Сначала посмотрим на 1 в клетке 14. Она соседня с 1 из клеток 6 и 10. Но, как мы уще знаем, нельзя делать группу из трёх 1. Следовательно, можно объеденить ту 1 в группу с 1 либо из клетки 6, либо из клетки 10. И то, и то будет верно. Но нельзя объединять 1 и с 1 из клетки 6, и из клетки 10. То есть либо так:
Осталась 1 в клетке 8. Тут всё просто. Если 1 не с кем зациклить, то она зацикливается сама на себе. Выглядеть это будет так:
Ну, вроде, всё. Будут вопросы, обращайтесь. Успехов всем на контрольной!
