модели памяти x86
В вычислениях модели памяти 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-битное адресное пространство представляет собой «крошечную» модель памяти для сегментированного адресного пространства. В обоих случаях все четыре сегментных регистра содержат одно и то же значение.
х86-64
[ редактировать ]На платформе x86-64 существует всего семь моделей памяти: [7] поскольку большинство ссылок на символы имеют ширину всего 32 бита и если адреса известны во время соединения (в отличие от кода, не зависящего от позиции ). Это не влияет на используемые указатели, которые всегда являются плоскими 64-битными указателями, а влияет только на то, как можно размещать значения, доступ к которым осуществляется через символы.
См. также
[ редактировать ]Библиография
[ редактировать ]- Руководство пользователя Turbo C++ версии 3.0 . Borland International, авторское право 1992 г.
Ссылки
[ редактировать ]- ^ «Набор инструкций Intel — ЛЕС» . Страницы набора инструкций Intel . Стамбульский технологический университет/ Intel . Проверено 19 октября 2015 г.
- ^ «Руководство разработчика архитектур Intel 64 и IA-32: Том 3A» . Интел. стр. 3–17 . Проверено 13 сентября 2011 г.
- ^ «Руководство программиста по архитектуре AMD64, том 2: Системное программирование» (PDF) . АМД. стр. 82–84 . Проверено 13 сентября 2011 г.
- ^ «Руководство разработчика архитектур Intel 64 и IA-32: Том 3A» . Интел. стр. 4–41 . Проверено 13 сентября 2011 г.
- ^ «Руководство программиста по архитектуре AMD64, том 2: Системное программирование» (PDF) . АМД. п. 139 . Проверено 13 сентября 2011 г.
- ^ «Справочник по языку Open Watcom C, версия 2» (PDF) . github.com/open-ватком . Откройте Ватком . Проверено 10 января 2018 г.
- ^ «Двоичный интерфейс приложения System V, дополнение к процессору с архитектурой AMD64, черновая версия 0.99.7» (PDF) . стр. 33–35.