Модель памяти Intel - Intel Memory Model

В вычисление, Модель памяти Intel относится к набору из шести различных моделей памяти x86 ЦП работает в реальный режим которые контролируют, как сегмент регистры используются и размер указателей по умолчанию.

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

Четыре регистра используются для обозначения четырех сегментов 16-разрядной архитектуры сегментированной памяти x86. DS (данные сегмент), CS (код сегмент), SS (куча сегмент), и ES (дополнительный сегмент). Другой 16-битный регистр может действовать как смещение в данном сегменте, поэтому на этой платформе записывается логический адрес. сегмент:компенсировать, обычно в шестнадцатеричный обозначение. В реальном режиме, чтобы вычислить физический адрес байта памяти, оборудование сдвигает содержимое соответствующего сегментного регистра на 4 бита влево (фактически умножая на 16), а затем добавляет смещение.

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

 75220
+F139
 84359

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

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

Указатель форматы известны как возле, далеко, или же огромный.

  • Возле указатели 16-разрядные смещения в пределах опорного сегмента, то есть DS для данных и CS для кода. Это самые быстрые указатели, но они ограничены 64 КБ памяти (на связанный сегмент типа данных). Ближние указатели могут храниться в регистрах (обычно SI и DI).
    mov bx, слово [рег]    mov топор, слово [bx]    mov dx, слово [bx+2]
  • Далеко указатели 32-битные указатели, содержащие сегмент и смещение. Для их использования используется сегментный регистр ES с помощью инструкции les [рег] | [мем], двойное слово [мем] | [рег].[1] Они могут ссылаться до 1024KiB памяти. Обратите внимание, что арифметика указателя (сложение и вычитание) не изменяет сегментную часть указателя, а только его смещение. Операции, выходящие за пределы нуля или 65535 (0xFFFF), будут подвергаться операции по модулю 64 КБ, как и любая обычная 16-разрядная операция. Например, если регистр сегмента установлен на 0x5000 и смещение увеличивается, момент прилавок смещение становится (0x10000), результирующий абсолютный адрес переходит в 0x5000: 0000.
    les bx,dword [рег]    mov топор,слово [es:bx]    mov dx,слово [es:bx+2]
  • Огромный указатели по сути являются дальними указателями, но (в большинстве случаев) нормализуются каждый раз, когда они модифицируются, чтобы иметь максимально возможный сегмент для этого адреса. Это очень медленно, но позволяет указателю указывать на несколько сегментов и позволяет проводить точное сравнение указателей, как если бы платформа была плоская модель памяти: Он запрещает псевдонимы памяти, как описано выше, поэтому два огромных указателя, которые ссылаются на одну и ту же ячейку памяти, всегда равны.
    les bx,dword [рег]    mov топор,слово [es:bx]    Добавить bx,2    тест bx,0xfff0    jz фунт    суб bx,0x10    mov dx,es    inc dx    mov es,dx фунт:    mov dx,слово [es:bx]

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

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

МодельДанныеКодОпределение
Крошечный*возлеCS = DS = SS
Маленькийвозле**возлеDS = SS
Серединавозле**далекоDS = SS, несколько сегментов кода
Компактныйдалековозлеодин сегмент кода, несколько сегментов данных
Большойдалекодалеконесколько сегментов кода и данных
Огромныйогромныйдалеконесколько сегментов кода и данных; одиночный массив может быть> 64 КБ
  • * В модели Tiny все четыре сегментных регистра указывают на один и тот же сегмент.
  • ** Во всех моделях с возле указатели данных, SS равно DS.
  • *** Размер стека всегда ограничен максимум 64 КБайт.

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

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

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

x86-64

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

Смотрите также

Библиография

  • Руководство пользователя Turbo C ++ версии 3.0. Borland International, Copyright 1992.

Рекомендации

  1. ^ «Набор инструкций Intel - LES». Страницы набора инструкций Intel. Istanbul Teknik Üniversitesi /Intel. Получено 19 октября, 2015.
  2. ^ "Руководство разработчика архитектур Intel 64 и IA-32: Том 3A". Intel. стр. 3–17. Получено 13 сентября, 2011.
  3. ^ "Руководство программиста по архитектуре AMD64, том 2: Системное программирование" (PDF). AMD. стр. 82–84. Получено 13 сентября, 2011.
  4. ^ "Руководство разработчика архитектур Intel 64 и IA-32: Том 3A". Intel. стр. 4–41. Получено 13 сентября, 2011.
  5. ^ "Руководство программиста по архитектуре AMD64, том 2: Системное программирование" (PDF). AMD. п. 139. Получено 13 сентября, 2011.
  6. ^ «Открытый справочник по языку C Watcom, версия 2» (PDF). github.com/open-watcom. Откройте Watcom. Получено 10 января, 2018.
  7. ^ «Двоичный интерфейс приложения System V, Дополнение к процессору архитектуры AMD64, черновая версия 0.99.5» (PDF). С. 33–35. Архивировано из оригинал (PDF) 16 июля 2011 г.