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