8086.ru3. Средства управления памятью → 3.1 Логические адреса и сегментная организация памяти

3.1 Логические адреса и сегментная организация памяти

В современных компьютерах адресная часть команды представлена в виде логического адреса (ЛА), а не физического (ФА), что требует дополнительного времени и средств для выполнения преобразования ЛА в ФА. Необходимость представления адресной части команды в виде ЛА обусловлена следующими причинами:

  • обеспечение программной совместимости моделей центрального процессора снизу доверху за счет преемственности (совместимости) форматов команд;
  • возможности наращивания емкости оперативной памяти (ОП) без изменения разрядности ЛА (формата команды);
  • обеспечивает возможность написания программ без привязки к ФА памяти;
  • возможность динамического распределения памяти программ и данных и эффективное использование емкости ОП;
  • возможность обеспечения защиты сегментов памяти программ и данных как в однозадачных, так и в многозадачных режимах работы.

Для программы адресное пространство разделено на блоки смежных адресов, называемых сегментами, а программа может обращаться к данным, находящимся только в этих сегментах. Внутри сегментов используется линейная адресация. Такая адресация осуществляется относительно начала сегмента (базового адреса), а физический адрес скрыт от программиста, так как программист пишет программу в ЛА. ОС выполняет функции распределения сегментов по ФА, что требует перед обращением к ОП выполнения процедуры преобразования ЛА в ФА.

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

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

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

Отсюда ЛА можно представить в виде двух целочисленных величин (полей): номера сегмента и смещения. При этом разрядность смещения определяет максимальный размер сегмента в байтах. В ряде 16-разрядных процессоров для удобства преобразования ЛА в ФА сегмент разбивается на блоки, кратные 2k-1 байт, т.е. смещение разбивается еще на два поля: номера блока в сегменте и адреса байта в блоке.

При сегментной адресации сегмент ограничен разрядностью поля смещения ЛА или максимальным размером, который является величиной постоянной для каждого типа процессора.

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

  • разбиение задач пользователей на модули;
  • необходимо помнить, что, кроме задач пользователей, в ОП загружены программы ОС, которые также разбиты на модули и написаны в ЛА;
  • при больших объемах программ и данных появляется возможность хранить и описывать данные в одном линейном сегменте произвольного размера, а не в нескольких, как при сегментной адресации;
  • динамическое распределение памяти и перемещаемость сегментов;
  • защиту сегментов пользователей и ОС от взаимного преднамеренного или случайного воздействия друг на друга.

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

В целях рационального процесса программирования для ряда задач программы и данные разбивают на модули, что обеспечивает удобство отдельной отладки модулей программ и использования модулей данных по их назначению несколькими программами. Для этих целей каждый программный модуль (кода) или модуль данных можно разместить в отдельном сегменте с определенным номером, а сегменты размещать в произвольной области памяти. Местонахождение сегмента будет осуществляться по номеру сегмента, а адресация к ячейкам внутри сегмента по значению поля смещения. Таким образом, вычисление ФА памяти заключается в преобразовании номера сегмента ЛА в базовый адрес ОП, с которого начинается сегмент, и суммированием его со смещением ЛА внутри сегмента.

При линейной адресации число разрядов, определяющих номер сегмента, можно установить произвольным или, другими словами, устанавливать произвольным размер сегмента (или разрядность смещения для каждого сегмента). Например, в таблице 3.1 приведен пример такого разбиения 16-ти мегабайтного 24-разрядного адресного пространства логического адреса процессора МС68000 на два сегмента по 4 Мбайта, два сегмента по 2 Мбайта и 64 сегмента по 64 Кбайт памяти:

2 х 4 Мбайт + 2 х 2 Мбайт + 64 х 64 Кбайт = 16 Мбайт

Здесь старшие k разрядов ЛА определяют номер сегмента, а младшие n-k-1 бит разрядность смещения. Естественно, для реализации такого принципа распределения для каждого сегмента необходимо дополнительно указывать его максимальный разрешенный размер.

На рисунке 3.2 представлены примеры форматов ЛА процессоров МС68000, Z8001, Intel 8086 и фирмы DEC.

Процессор МС68000 имеет 24-разрядный линейный ЛА. В остальных процессорах используется сегментная адресация. В Z8001 и DEC логический адрес делится на 7-ми и 3-х разрядные поля номера сегмента соответственно, которые определяют количество регистров сегментов процессора для хранения базовых адресов этих сегментов, т.е. преобразование номера сегмента в базовый (начальный) номер сегмента сводится к его табличному преобразованию путем обращения к дополнительной памяти регистров сегментов. Смещение занимает 16-ти и 13-разрядные поля и определяет максимальный размер сегмента по 64 и 8 Кбайт соответственно. Поле смещения разделено на две части, разбивающие сегменты на блоки емкостью по 256 и 64 байта. Максимальное число блоков, входящих в сегмент, равно 256 (Z8001) и 128 (DEC).

Номер сегмента Разряды базы логического адреса Размер сегмента
А23 А22 А21 А20 А19 А18 А17 А16
0-й сегмент 0 0 X X X X X X 222 = 4 Мб
1-й сегмент 0 1 X X X X X X 222 = 4 Мб
2-й сегмент 1 0 0 X X X X X 221 = 2 Мб
3-й сегмент 1 0 1 X X X X X 221 = 2 Мб
4-й сегмент 1 1 0 0 0 0 0 0 216 = 64 кб
5-й сегмент 1 1 0 0 0 0 0 1 216 = 64 кб
6-й сегмент 1 1 0 0 0 0 1 0 216 = 64 кб
7-й сегмент 1 1 0 0 0 0 1 1 216 = 64 кб
... . . . . . . . . ...
67-й сегмент 1 1 1 1 1 1 1 1 216 = 64 кб

В процессоре Intel 8086 в формат ЛА не входит поле номера сегмента, что напрямую связано с архитектурой процессора и регистровыми структурами. Поэтому ЛА включает только текущее смещение, состоящее из 4-разрядного адреса байта в блоке (параграф) и 12-разрядного номера блока (параграфа) в сегменте.

Отметим также, что для процессоров МС68000 и Z8001 ЛА хранится в 32-разрядном двойном слове, а для ЦП i8086 и DEC в 16-разрядном слове.