Сегментная организация памяти

В архитектуру процессора i8086/i8088 была заложена идея сегментной организации памяти, которая сохранилась с появлением новых моделей процессоров. Изменялись только адресуемые размеры сегментов. Например, в ОС MS-DOS размер сегмента не мог превышать 64 Кб, т.к. система базировалась на 16-разрядных процессорах и смещение (в регистрах IP и SP) не могло превышать 216-1=65535. Диапазон изменения фозического адреса – до 1Мбайта, это определялось тем, что шина адреса i8086 имела 20 разрядов.

Под сегментом понимается блок смежных ячеек памяти, максимальным размером 64 Кбайт и начальным или базовым адресом, находящимся на 16-байтной границе (такая граница называется параграфом).

Для обращения к памяти необходимо определить базу сегмента (адрес его начала) и 16-битное расстояние от базы, называемое смещением (offset) или относительным адресом. Таким образом, 20-разрядный физический адрес состоит из двух 16-разрядных логических адресов: адрес базы (сегмента) и смещения (эффективного адреса).

CS : IP
96AF : E305
DS : 00FD
     
сегмент   смещение

Рисунок 6. Логические адреса

При загрузке выполняемой программы в память операционная система инициализирует, как правило, три сегментных регистра: CS, DS, SS. В них и находятся базовые адреса доступных программе сегментов. Исполнительный адрес любой ячейки вычисляется процессором путём сложения этого адреса, умноженного на 16, со смещением.

 

  ОЗУ Адрес  
     
CS ¬ Команда 3DA00 Начало сегмента кода
     
  Команда CS+IP Исполняемая команда
     
  Команда CS+FFFF Конец сегмента кода (max)
     
DS ¬ Данное 79F20 Начало сегмента данных
     
  Данное DS+A Адрес переменной А
     
  Данное DS+FFFF Конец сегмента данных (max)
     
  Данное SS-FFFF Конец сегмента стека (max)
     
  Данное SS-SP Вершина стека
     
SS¬ Данное 80AB0 Начало сегмента стека
     
    FFFFF Конец ОЗУ

Рисунок 7. Структура сегментной организации памяти процессоров i8086

Например, как процессор узнаёт, по какому адресу расположена нужная для выполнения команда? Для этого есть содержимое регистров CS:IP. Процессор выставляет на шину адреса 16- разрядное значение регистра CS и выполняе сдвиг влево на 4 бита (что равноценно умножению на 16) и складывает полученное значение с содержимым регистра IP. Если <CS>=3DA0h и <IP>=11FAh, то:

3DA00 h

+ 11FA h

3EBFA h – физический исполнительный адрес команды.