Является ли метод смещения сегмента общим для всех чипов x86 или только для 8086? - PullRequest
2 голосов
/ 02 февраля 2011

память упоминается с использованием логического адреса в программировании языка ассемблера в 8086 году. Является ли эта функция общей для всех чипов x86, включая современные микропроцессоры Pentium?

Ответы [ 3 ]

3 голосов
/ 02 февраля 2011

Все 16- и 32-разрядные строки x86 (8086, 808, 80186, 80286, 80386, i486, Pentium и т. Д.) Используют некоторую форму сегментной / смещенной адресации.Однако то, к чему относится сегмент, резко изменилось с 8086/88/186 строк до 80286. и далее.

В более ранних чипах, без виртуальной адресации, сегменты относились к старшим 16 битам20-битный адрес памяти, в то время как смещение было 16-битным смещением от этого.Это означало, что у вас была 1 МБ памяти с прямой адресацией, доступ к которой осуществлялся через набор очень сильно перекрывающихся наборов блоков по 64 КБ.

Более поздние микросхемы «защищенного режима» значительно изменили ситуацию.Вместо того, чтобы сегмент был просто старшими 16 битами физического адреса, он вместо этого теперь является индексом в одной из двух таблиц поиска (GDT или LDT), которые содержат структуры памяти, указывающие на базовый адрес, пределы размера, разрешения защиты и т. Д.. сегмента.Смещение работает от этого сохраненного базового адреса и проверяется по ограничителям размера, чтобы гарантировать, что вы не обращаетесь к памяти вне его, таким образом гарантируя, что перекрывающиеся адреса, если таковые имеются, должны быть явно установлены так, а не неявное перекрытиеиз более ранних чипсетов.У 80286 все еще были сегменты, ограниченные размером 64 КБ, но 80386 и позже полностью избавились от этого.

Сегменты все еще неявно используются чипом.Код извлекается из сегмента CS (если специально не указано иное).Данные выбираются из сегмента DS (опять же, если не указано иное).ES используется для пункта назначения во многих операциях (опять же, если ... вы не знаете тренировку).Доступ к стеку осуществляется через SS и так далее.Однако во многих операционных системах (возможно, даже во всех?) На 32-разрядных процессорах (после 80286) все сегменты просто отображаются в одном и том же пространстве памяти, что имитирует плоскую структуру адресного пространства.Скорее всего, вам вообще не придется думать о сегментах, если вы программируете для Windows NT или более поздней версии, или если вы программируете для систем Linux и т. П.

Инструкции AMD64 снова отличаются, и в основном это шагв направлении устранения сегментов полностью.Обычно для защиты в этой среде используется система подкачки.

2 голосов
/ 02 февраля 2011

До 32-битного защищенного режима при всей адресации по-прежнему используются регистры сегментов, но почти в каждой 32-битной ОС четыре первичных регистра сегмента имеют базовый адрес 0 и ограничение в 4 гигабайта.так что все они в основном "сквозные".Вместо этого все преобразования адресов выполняются через пейджинговый блок.

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

1 голос
/ 02 февраля 2011

Все 32-битные машины x86 поддерживают полный набор сегментных регистров и доступ к памяти через них. Чипы amd64 / Intel 64 по-прежнему ограничены поддержка, но удалена большая часть функций сегментации.

В защищенном режиме, в отличие от реального режима, регистры сегментов не однако, просто масштабируется и добавляется к адресу; Они являются указателями в GDT или LDT (таблица глобальных или локальных дескрипторов), которые содержат дескрипторы сегментов, которые описывают как основы (начальный адрес), так и размер ограничения, а также биты разрешений для сегментов. Адрес проверяется, чтобы быть меньше лимита и добавляется к указанной базе, и доступ проверяется по битам разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...