Модель памяти Intel x86

Модель памяти Intel x86

Модель памяти для платформ x86 — способ указать предположения, которые должен сделать компилятор при генерации кода для платформ с сегментной адресацией памяти или со страничной памятью. Чаще всего термин употребляется при работе с различными устаревшими режимами платформы x86.

Например, на 16-битной x86-совместимой платформе существует шесть моделей памяти. Они определяют, какие предположения делаются относительно сегмента регистров и размера указателей по умолчанию.

Содержание

Сегментация памяти

16-битная x86-архитектура, благодаря наличию четырех сегментных регистров, позволяет одновременно иметь доступ к четырем сегментам памяти. Назначение сегментных регистров:

  • DS (data segment) — сегмент данных;
  • CS (code segment) — сегмент кода;
  • SS (stack segment) — сегмент стека;
  • ES (extra segment) — дополнительный сегмент.

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

Например, логический адрес 7522:F139 дает 20-битный физический адрес:

75220 + F139 = 84359

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

В защищённом режиме для этой же цели используются GDT и LDT.

Размеры указателя

Указатели могут быть типов near (ближний), far (дальний) или huge (большой). Ближний (near) указатель ссылается на текущий сегмент, поэтому ни DS ни CS не должны изменяться при разыменовании указателя. Указатели этого типа являются самыми быстрыми, но ограничены областью указывания в 64 килобайта памяти (то есть текущим сегментом).

мегабайт памяти. Необходимо отметить, что арифметические действия с указателями (сложение и вычитание) не изменяют участок сегмента указателя, а затрагивают лишь его смещение. Операции, выходящие за границы нуля или 65535 (0xFFFF), подвергнутся операции взятия по модулю 64K, как и любая обычная 16-битная операция. Например, знаковое −1 превращается в беззнаковое 0xFFFF или 65535.

К примеру, нижеследующий код выйдет за рамки и перепишет сам себя:

char far* myfarptr = (char far*) 0x50000000L ; 
unsigned long counter ;
for(counter=0; counter<128*1024; counter++) // доступ к 128K памяти
  *(myfarptr+counter) = 7 ; // записать все семерки в нее

В какой-то момент счетчик counter станет равным (0x10000), а результирующий абсолютный адрес превысит 0x5000:0000.

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

Модели памяти

Модели памяти бывают:

Модель Данные Код
Tiny* near
Small near** near
Medium near far
Compact far near
Large far far
Huge huge huge

* В модели Tiny (крошечная) все четыре сегментных регистра указывают на один и тот же сегмент.

** Во всех моделях с ближними указателями на данные SS равно DS.

Другие платформы

В защищённом режиме сегмент не может быть перезаписан, считан и выполнен.[источник не указан 1010 дней] Поэтому, при реализации моделей памяти Small и Tiny регистр сегмента кода должен указывать на тот же физический адрес и иметь то же ограничение, что и регистр сегмента данных. Это нивелирует одну из особенностей процессора 80286, которая гарантирует, что сегменты данных никогда не будут исполняться, а сегмент кода никогда не будет перезаписываться (что означает полное запрещение самомодифицирующегося кода). Однако, на процессорах 80386 с его плоской моделью памяти можно защитить от записи отдельные страницы памяти.[источник не указан 1010 дней]

Модели памяти не ограничиваются 16-битными программами. Можно использовать сегментацию также и в 32-битном защищенном режиме (получая в результате 48-битные указатели), причем существуют компиляторы языка Си, поддерживающие это.[источник не указан 1010 дней] Тем не менее, сегментация в 32-битном режиме не позволяет получать доступ к большему адресному пространству, чем тот, который охватывает один сегмент, за исключением некоторых сегментов, которые не всегда представлены в памяти, а линейное адресное пространство просто используется как кэш за счет увеличенного сегментированного виртуального пространства.[источник не указан 1010 дней] По большей части это позволяет лучше защитить доступ к различным объектам (области объёмом до 1 мегабайта могут получить преимущества за счет побайтового разбиения защиты доступа, в отличие от довольно «грубого» дробления по 4 KiB, предлагаемого при одиночной странице), и таким образом используется лишь в специальных приложениях, навроде телекоммуникационного ПО.[источник не указан 1010 дней] Технически, «плоское» 32-битное адресное пространство является моделью памяти типа «tiny» для сегментированного адресного пространства. Под влиянием обоих факторов, все четыре сегментных регистра содержат одно и то же значение.

На платформе x86-64 существует семь моделей памяти[1], причем большинство символьных ссылок являются лишь 32-битными, и если адрес известен во время линковки (в отличие от позиционно-независимого кода). Это не влияет на использование указателей, которые всегда являются плоскими 64-битными указателями, но только с точки зрения доступа к значению через размещение символов.

Примечания

Литература

  • Turbo C++ Version 3.0 User’s Guide. Borland International, 1992.

См. также


Wikimedia Foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Полезное


Смотреть что такое "Модель памяти Intel x86" в других словарях:

  • Intel 80386 — <<   Intel 80386   >> Центральный процессор Микропроцессор Intel 80386 Производство …   Википедия

  • X86 — 80486 DX2 x86 (Intel 80x86)  аппаратная платформа: архитектура микропроцессора и соответствующий набор инструкций, как разработанных и выпускаемых компанией Intel, так и совместимых с ними процессоров других производителей (AMD, VIA …   Википедия

  • X86-64 — (также x64/AMD64/Intel64/EM64T) 64 битная аппаратная платформа: архитектура микропроцессора и соответствующий набор инструкций и чипсет, разработанные компанией AMD. Это расширение архитектуры x86 с полной обратной совместимостью. Набор… …   Википедия

  • Intel Core — Эта статья о семействе мобильных процессоров Intel. О микроархитектуре процессоров Intel Core 2 см. статью Intel Core (микроархитектура). Intel Core (произносится: Интел Ко)  это марка различных микропроцессоров сред …   Википедия

  • x86 — 80486 DX2 x86 (англ. Intel 80x86)  архитектура процессора c одноимённым наборо …   Википедия

  • x86-64 — Для улучшения этой статьи желательно?: Переработать оформление в соответствии с правилами написания статей. Викифицировать статью. Исправить статью согласно стилистическим правилам Википедии …   Википедия

  • Intel Penryn — Penryn  кодовое название 45 нанометровой производственной технологии от компании Intel с использованием металлических затворов Hi k без содержания свинца. Эта технология используется в семействе процессоров Intel Core 2 Duo. Содержание …   Википедия

  • Intel — (Интел) Компания Intel, история компании, деятельность компании Информация о компании Intel, история компании, деятельность компании Содержание Содержание Core Описание Intel Продукция фирмы Intel Технические характеристики Преимущества и… …   Энциклопедия инвестора

  • Intel 8086 — <<   Intel 8086   >> Центральный процессор Микропроцессор Intel 8086 Производство: 8 июня 1978 Производители …   Википедия

  • Intel Core 2 Quad — Центральный процессор Intel Core 2 Quad Q6600 Производство: с января 2007 года Производитель …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»