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

редактировать

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

Содержание
  • 1 Сегментация памяти
  • 2 Размеры указателя
  • 3 Модели памяти
  • 4 Другие платформы
    • 4.1 x86-64
  • 5 См. Также
  • 6 Библиография
  • 7 Ссылки
Сегментация памяти

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

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

75220
+F139
84359

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

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

Форматы указателя известны как близкие, далеко или огромные.

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

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

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

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

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

x86-64

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

См. Также
Библиография
  • Руководство пользователя Turbo C ++ версии 3.0. Borland International, Copyright 1992.
Ссылки
Последняя правка сделана 2021-05-24 03:58:05
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте