Организация доступа к памяти

29 Дек 2017

Организация доступа к памяти

Головоломка в виде сегментной модели доступа к оперативной памяти стала победителем в соревновании процессора iAPX86 со всеми глав­ны­ми и неглавными соперниками в разработке пер­во­го по-настоящему пер­со­наль­ного компьютера. «Некоторые счи­та­ют, что Intel 8088 был худ­шим выбором из имевшихся в то время 16-бит­ных ми­к­ро­про­цес­со­ров». Все же отдадим должное алгоритму ор­га­ни­за­ции 20-битного ад­рес­но­го пространства на аппаратной платформе меньшей раз­ряд­нос­ти. Он не только на десятилетия определил способ мышления многих программистов, но и, как тех­но­ло­гия, стал эле­гант­ным трюком.

Сегментная адресация памяти основана на идеях совместимости с 8-битным процессором Intel 8080, ис­поль­зо­вав­шим 16-битную адресную шину, обеспечивавшую доступ к оперативной памяти объемом 64 КБ. Для этого текущие нужды x86-процессора удовлетворялись за счет 16-битных операндов. Доступ к данным в памяти ограничивалась их разрядностью и не могла пре­вы­шать искомые 64КБ. Фраг­менты памяти, в пределах которых процессор может вы­полнять хранящийся там код или бес­пре­пят­ствен­но манипулировать данными, используя 16-битный от­но­си­тель­ный адрес, называются сег­мен­та­ми. Их размер составляет 216 или 65536 байт. До­ступ к сегментам обес­пе­чи­ва­ет­ся управляющими регистрами, содержимое которых определяет стар­то­вый адрес сегмента в опе­ра­тив­ной памяти.

  • CS (Code Segment) — сегмент кода
  • SS (Stack Segment) — сегмент стека
  • DS (Data Segment) — сегмент данных
  • ES (Extra Segment) — дополнительный сегмент
  • FS (Extra Segment) — дополнительный сегмент в процессорах, начиная с i486
  • GS (Extra Segment) — дополнительный сегмент в процессорах, начиная с i486

Физический 20-битный адрес, позволяющий адресовать до 1 МБ памяти, получается путём сложения ис­пол­ни­тель­но­го адреса и значения сегментного регистра, умноженного на 16 — сдвинутого влево на 4 разряда. Этот ал­го­ритм, используемый процессором iAPX86, был назван «режимом реальной адресации». Согласно ему сегмент дол­жен выравниваться на границу параграфа — 16-байтного блока, что может приводить к потере не­ко­то­ро­го ко­ли­че­ства памяти, если размер данных сегмента не кратен параграфу. По этой причине разработчики от­ка­за­лись от ре­а­ли­за­ции 24-битного адреса в x86, так как размер параграфа, возрастая до 256 байт, вызывал бы не­ра­ци­о­наль­ное использование дорогостоящего в то время ОЗУ.

Алгоритм формирования реальной адресации процессорами семейства x86
Алгоритм формирования реальной адресации процессорами семейства x86

Возможное переполнение при вычислении физического адреса в процессоре x86 игнорируется. Так, для ин­струк­ции перехода по адресу 0x0010 при значении сегмента кода 0xFFFF точкой назначения станет физический адрес 0. Этого не происходит в старших моделях процессоров x86, например 80286, имевшем 24 адресных линии, поэтому в компьютерах IBM PC/AT для обеспечения совместимости был введен специальный вентиль Gate A20, при­ну­ди­тель­но обнуляющий бит A20 системной шины адреса.

P.S.

По умолчанию регистр CS используется при выборке инструкций, регистр SS — при вы­пол­не­нии операций со стеком, регистры DS, ES, FS, GS — при обращении к данным. При этом, в пределах сег­мен­та ис­поль­зу­ют­ся 16-битные исполнительные адреса, хранящиеся в счётчике команд, указателе стека, либо вы­чис­ля­е­мые в со­от­вет­ст­вии с видом адресации, заданном в коде инструкции. Если требуется обеспечить работу с мас­си­вом данных объ­ем­ом более 64 КБ, приходится включать логику управления сегментными регистрами. Таковая мо­жет существенно замедлить обращение к памяти, поэтому компиляторы с языков высокого уровня предлагают ука­зы­вать модель памяти (крохотная — tiny, малая — small, большая — large, огромная — huge), в соответствии с ап­пе­ти­та­ми программиста.

Теги: