Jump to content

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

(Перенаправлено из модели памяти C )

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

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

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

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

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

  75220
+ Ф139
  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]. [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]
  • Огромные указатели по сути являются дальними указателями, но (в основном) нормализуются каждый раз, когда они изменяются, так что у них есть максимально возможный сегмент для этого адреса. Это очень медленно, но позволяет указателю указывать на несколько сегментов и обеспечивает точное сравнение указателей, как если бы платформа была плоской моделью памяти : это запрещает псевдонимы памяти, как описано выше, поэтому два огромных указателя, которые ссылаются на одну и ту же память location всегда равны.
    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]

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

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

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

Модель Данные Код Определение
Крошечный* около КС=ДС=СС
Маленький около** около ДС=СС
Середина около** далеко 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 существует всего семь моделей памяти: [7] поскольку большинство ссылок на символы имеют ширину всего 32 бита и если адреса известны во время соединения (в отличие от кода, не зависящего от позиции ). Это не влияет на используемые указатели, которые всегда являются плоскими 64-битными указателями, а влияет только на то, как можно размещать значения, доступ к которым осуществляется через символы.

См. также

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

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

[ редактировать ]
  • Руководство пользователя Turbo C++ версии 3.0 . Borland International, авторское право 1992 г.
  1. ^ «Набор инструкций Intel — ЛЕС» . Страницы набора инструкций Intel . Стамбульский технологический университет/ Intel . Проверено 19 октября 2015 г.
  2. ^ «Руководство разработчика архитектур Intel 64 и IA-32: Том 3A» . Интел. стр. 3–17 . Проверено 13 сентября 2011 г.
  3. ^ «Руководство программиста по архитектуре AMD64, том 2: Системное программирование» (PDF) . АМД. стр. 82–84 . Проверено 13 сентября 2011 г.
  4. ^ «Руководство разработчика архитектур Intel 64 и IA-32: Том 3A» . Интел. стр. 4–41 . Проверено 13 сентября 2011 г.
  5. ^ «Руководство программиста по архитектуре AMD64, том 2: Системное программирование» (PDF) . АМД. п. 139 . Проверено 13 сентября 2011 г.
  6. ^ «Справочник по языку Open Watcom C, версия 2» (PDF) . github.com/open-ватком . Откройте Ватком . Проверено 10 января 2018 г.
  7. ^ «Двоичный интерфейс приложения System V, дополнение к процессору с архитектурой AMD64, черновая версия 0.99.7» (PDF) . стр. 33–35.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a8dbb3d39407333229052a1db7f5ad77__1714189140
URL1:https://arc.ask3.ru/arc/aa/a8/77/a8dbb3d39407333229052a1db7f5ad77.html
Заголовок, (Title) документа по адресу, URL1:
x86 memory models - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)