Модель памяти 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, 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
Середина возле** далеко DS = SS, несколько сегментов кода
Компактный далеко возле один сегмент кода, несколько сегментов данных
Большой далеко далеко несколько сегментов кода и данных
Огромный огромный далеко несколько сегментов кода и данных; одиночный массив может быть> 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.

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