В вычислениях, Модель памяти Intel относится к набору из шести различных моделей памяти ЦП x86, работающих в реальном режиме, которые определяют, как используются регистры segment и размер указателей по умолчанию.
Четыре регистра используются для обращения к четырем сегментам в 16-битной архитектуре сегментированной памяти x86. DS(сегмент данных ), CS(код сегмент), SS(стек сегмент) и ES (дополнительный сегмент). Другой 16-битный регистр может действовать как смещение в данном сегменте, и поэтому логический адрес на этой платформе записывается сегмент: смещение, обычно в шестнадцатеричной нотации. В реальном режиме, чтобы вычислить физический адрес байта памяти, оборудование сдвигает содержимое соответствующего сегментного регистра на 4 бита влево (фактически умножая на 16), а затем добавляет смещение.
Например, логический адрес 7522: F139 дает 20-битный физический адрес:
75220 | |
+ | F139 |
84359 |
Обратите внимание, что этот процесс приводит к наложению имен памяти, так что любой физический адрес имеет до 4096 соответствующих логических адресов. Это затрудняет сравнение указателей на разные сегменты.
Форматы указателя известны как близкие, далеко или огромные.
mov bx, word [reg] mov ax, word [bx] mov dx, word [bx + 2]
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 |
Средний | рядом** | far | DS = SS, несколько сегментов кода |
Компактный | далеко | около | один сегмент кода, несколько сегментов данных |
Большой | далее | далее | несколько кодов и данных сегменты |
Огромный | Огромный | далее | несколько сегментов кода и данных; один массив может иметь размер>64 КБ |
В защищенном режиме сегмент не может быть одновременно доступным для записи и исполняемым. Следовательно, при реализации модели Tiny памяти регистр сегмента кода должен указывать на тот же физический адрес и иметь тот же предел, что и регистр сегмента данных. Это побеждает одну из функций 80286, которая гарантирует, что сегменты данных никогда не будут исполняемыми, а сегменты кода никогда не будут доступны для записи (что означает, что самомодифицирующийся код никогда не допускается). Однако на 80386 с его выгружаемым блоком управления памятью можно защитить отдельные страницы памяти от записи.
Модели памяти не ограничиваются 16-битными программами. Можно также использовать сегментацию в 32-битном защищенном режиме (что приводит к 48-битным указателям), и существуют компиляторы языка C, которые это поддерживают. Однако сегментация в 32-битном режиме не позволяет получить доступ к большему адресному пространству, чем то, что покрывает один сегмент, если только некоторые сегменты не всегда присутствуют в памяти, а линейное адресное пространство просто используется в качестве кеша в большем сегментированном виртуальном пространстве.. Он обеспечивает лучшую защиту доступа к различным объектам (области размером до 1 МБ могут выиграть от однобайтовой гранулярности защиты доступа по сравнению с грубой степенью гранулярности в 4 КиБ, обеспечиваемой единственной подкачкой), и поэтому используется только в специализированных приложениях, таких как телекоммуникации программного обеспечения. Технически «плоское» 32-битное адресное пространство - это «крошечная» модель памяти для сегментированного адресного пространства. При обоих режимах все четыре сегментных регистра содержат одно и то же значение.
На платформе x86-64 существует всего семь моделей памяти, поскольку большинство ссылок на символы имеют ширину только 32 бита, и если адреса известны во время связывания (в отличие от позиционно-независимого кода ). Это не влияет на используемые указатели, которые всегда являются плоскими 64-битными указателями, а влияет только на то, как могут быть размещены значения, к которым нужно получить доступ через символы.