Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка СПО(сдала).docx
Скачиваний:
3
Добавлен:
27.10.2018
Размер:
359.58 Кб
Скачать

Московский государственный открытый университет

Чебоксарский политехнический институт

Кафедра информационных технологий и программирования

Методический материал

по дисциплине: Системное и программное обеспечение

на тему: «Традиционные сервисы BIOS»

Выполнила:

Студентка гр. И-32-08

Романова А.С.

Шифр 608032

Проверил: доц. Стеценко А.А.

Чебоксары 2011

Оглавление

Процессоры Intel в реальном режиме 3

Адресация памяти в реальном режиме 3

Система прерываний 32-разрядных микропроцессоров i8086 9

Традиционный сервис BIOS 14

Использованная литература: 27

Процессоры Intel в реальном режиме

Intel 8086 — первый 16-битный процессор компании Intel, выпущенный 8 июня 1978 года. Процессор имел набор команд, который применяется и в современных процессорах, именно от этого процессора берёт своё начало известная на сегодня архитектура x86. Процессор Intel x86 после включения питания оказывается в так называемом режиме реальной адресации памяти, или просто реальном режиме. Большинство операционных систем сразу же переводят его в защищенный режим, позволяющий им обеспечивать многозадачность, распределение памяти и другие функции. Режим виртуального процессора 8086 (virtual 8086 mode), для краткости обычно именуемый режимом V86, является подрежимом защищённого режима. Впервые он появился в микропроцессоре 80386. Главное его назначение — обеспечить базу для выполнения написанных для реального режима программ в операционных системах, функционирующих в защищённом режиме.

Адресация памяти в реальном режиме

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

Почему именно процессор 8086? Просто потому, что режим совместимости с командами этого процессора есть во всех старших моделях.

Процессор 8086, мог работать только в одном режиме адресации памяти. Все следующие модели, начиная с процессора 80286, сохранили режим совместимости с 8086 . Этот режим получил название реального режима (Real Address Mode), или R-режима.

Итак, ближе к делу.

Наименьшим адресуемым блоком памяти является байт (8 бит). Каждый байт памяти имеет уникальное местоположение, называемое физическим адресом, по которому в него может записываться и читаться информация. Очевидно, что для того, чтобы получить доступ к ячейке памяти процессору надо знать ее физический адрес. Для доступа к памяти процессор имеет адресную шину, на которой выставляет адрес ячейки памяти, к которой ему необходим доступ. Грубо говоря, адресная шина – это «ноги» (pins) процессора на которых он выставляет адрес ячейки в двоичной системе счисления. Например, чтобы адресовать память размером в четыре байта (у каждого байта свой адрес), процессору, было бы, достаточно адресной шины в два бита. Так как, с помощью двух бит можно было бы адресовать 4 ячейки памяти: адрес 00b – 1-ая ячейка (байт), адрес 01b – 2-ая ячейка (байт), адрес 10b – 3-я ячейка (байт), 11 – 4-ая ячейка (байт). Таким образом, очевидно, что чем большую разрядность имеет адресная шина процессора, с тем большим объемом памяти он может работать.

Рис1. Организация адресного пространства памяти в реальном, защищенном

и линейном режимах работы процессора x86

Процессор 8086 имел 20 битную адресную шину. Что позволяло адресовать 1048576 байт (220) памяти или округленно 1 Мбайт. Проблема состояла в том, что процессор 8086 имел 16 битную архитектуру. То есть все его регистры были 16 битными. А с помощью 16 бит можно адресовать только 65536 (216) байт памяти или округленно 64 Кбайт. Тогда каким же образом процессор 8086 адресовал 1 Мбайт памяти?

Решением стала сегментная адресация памяти. С помощью этого метода физический адрес конкретного байта памяти может логически определятся двумя 16-разрядными значениями. Для получения 20-разрядного физического адреса к сегментной компоненте приписывается справа четыре нулевых бита (для расширения до 20 разрядов), затем полученное число складывается с компонентой смещения. Перед сложением к компоненте смещения слева дописывается четыре нулевых бита (также для расширения до 20 разрядов). Эту процедуру иллюстрирует рис. 2.

Рис. 2. Адресация памяти в реальном режиме

Пример. 13DF:0100, где Segment – адрес сегмента, а Offset – смещение от начала этого сегмента.

Но постойте! Два 16-разрядных регистра дают 32 разряда. Как же из этого получается 20 битный адрес? Давайте разбираться.

Для определения начала сегментов памяти процессор 8086 использует четыре 16-битных сегментных регистра (CS, DS, SS, ES). Смещение внутри сегмента выбирается из регистров-указателей SP, BP, SI, DI или регистра IP (указателя команд - Instructions Pointer). Для получения 20-битного физического адреса, процессор размещает на адресной шине значение сегментного регистра и сдвигает его влево на четыре бита, заполняя младшие четыре бита адресной шины нулями (умножение на десятичное 16 или шестнадцатеричное 10 ), затем к этому значению прибавляется смещение и адрес сформирован.

Рис.3. На рисунке показано соответствие логического адреса 0002h:0028h физическому адресу 00048h.

Рис. 3. Соответствие логического и физического адресов

Исходя из этого, получается, что границы сегментов (16-битное значение + 4 нулевых бита) располагаются через каждые 16 байт физических адресов. 4 битами можно адресовать 16 (байт) ячеек памяти, каждая из которых, как мы помним, содержит один байт. Каждый из этих 16-байтовых фрагментов называется параграфом. 16-разрядные сегментные регистры могут адресовать 65536 (216) параграфов (границ сегментов). А параграф, как уже говорилось, это 16 байт. 65536(параграфов) умножаем 16(байт) получаем 1048576 байт или округленно 1 Мбайт. Хотя и тут не все гладко.

Ниже приведен вывод регистров и сегмента кода в программе debug.exe, чтобы можно было все это наглядно увидеть.

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=13DF ES=13DF SS=13DF CS=13DF IP=0100 NV UP EI PL NZ NA PO NC

13DF:0100 0000 ADD [BX+SI],AL DS:0000=CD

-d cs:100

13DF:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

13DF:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 CE 13 ............4...

Например, в сегментном регистре хранится значение 13DFh, при умножении его на 10h получаем 13DF0h. Стоит обратить внимание, что младшая шестнадцатеричная цифра в адресе каждого сегмента всегда равна 0. То есть адрес любого сегмента всегда кратен 16 десятичному (10h). Поскольку последняя цифра в адресе сегмента всегда равна 0, то ее можно не хранить. В действительности 8086 вместо умножения на 16 использовал содержимое регистра так, как если бы оно имело четыре дополнительных нулевых бита.

Максимальный размер сегмента определяется теми же 16 битами регистра, в котором хранится смещение. Следовательно, максимальный размер сегмента может быть 65536 байт (216). Минимальный – 16 байт (размер параграфа). Таким образом, сегменты – это виртуальные умозрительные части с максимальным объемом 64 Кбайт каждая.

Возьмем максимальное значение, которое может адресовать сегментный регистр FFFF, применим к нему сдвиг влево на 4 бита, получим FFFF0h (1048560d). Теперь прибавим к этому числу максимальное значение которое может хранится в регистре смещения – FFFF. Таким образом, FFFF0+FFFF= 10FFEF (1114095d). И что это такое? Мы же явно вышли за пределы 1048576 байт памяти. 20 битная адресная шина позволяет максимально адресовать 1048576 байт памяти с адресами от 00000h до FFFFFh. При адресации же памяти свыше 100000h и до 10FFEFh происходил «заворот» — старший единичный бит адреса игнорировался и доступ шёл к 64 килобайтам в начальных адресах (0000h…FFEFh).

Итак, сделаем некоторые выводы:

* Нет никаких препятствий для обращения к физически не существующей памяти.

* При обращении к несуществующей памяти результат непредсказуем (все зависит от разработчика материнской платы и другого аппаратного обеспечения компьютера).

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

И еще немного правды о сегментах:

* Сегменты физически не выделены в памяти. Сегменты - это логические окна, через которые программы просматривают области памяти удобными, в 64 Кбайт порциями.

* Размеры сегментов могут изменятся от 16 байт до 64 Кбайт (65536 байт).

* Сегменты не обязательно в памяти располагаются один за другим. Хотя такое бывает достаточно часто.

* Сегменты могут перекрываться один другим; поэтому один и тот же физический байт памяти может иметь различные логические адреса, определяемые разными, но при этом эквивалентными парами сегмент-смещение. Например, пары логических адресов 0000:0010 и 0001:0000 указывают на один и тот же физический адрес ячейки памяти - 0010h.

* Назначением базовых адресов сегментов занимается операционная система, а внутри каждого сегмента адреса формируются программой.

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

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

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