Сегментная адресация памяти: различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м 17+16=33, орфография
викификация, оформление, стилевые правки
Строка 1:
'''Сегментная адресация памяти''' — схема адресации памяти компьютера.
 
Архитектура x86 позволяет использовать сегментную (логическую) адресацию памяти. При этом адрес конкретной ячейки памяти делится на две части: ''сегмент'' и ''смещение''. (<ref>Сегментную адресацию можно уподобить делению текста на абзацы. По этой аналогии сегмент соответствует абзацу, а смещение — номеру слова ''в этом абзаце''.)</ref>
 
'''Сегментом''' называется условно выделенная область адресного пространства определённого размера.
 
'''Базой сегмента''' называется линейный адрес (адрес относительно всего объёма памяти), который указывает на начало сегмента в адресном пространстве (на первую его ячейку (нулевое смещение)).
 
'''Сегментный адрес''' (или логический) адрес'' соответствует линейному адресу ''(База сегмента)''+''(Смещение)''.
 
'''Селектором''' называется число (в [[x86]] — (16-2=14)-[[бит]]ноебитное), однозначно определяющее сегмент. Селектор загружается в сегментные регистры.
 
В [[Реальный режим|реальном]] и [[Защищённый режим|защищённом режимах]] x86-процессора сегментнаяфункционирование адресациясегментной функционируетадресации несколько по-разномуотличается.
 
== Сегментная адресация в реальном режиме ==
В реальном режиме процессора всё адресное пространство делится на одинаковые безразмерные сегменты. База каждого последующего сегмента смещена относительно базы предыдущего на 16 [[байт]] (т. н. ''параграф''). Таким образом, сегменты частично перекрывают друг друга. (Например, байт 17 сегмента 2, — это также и байт <math>1=17-16=1</math> сегмента 3, и байт <math>33=17+16=33</math> сегмента 1).
 
Селектор 16-разрядный, определяети задаёт номер сегмента. Учитывая, что сегменты следуют друг за другом с постоянным интервалом в 2<sup>4</sup>=16 байт, то очень легко выяснить линейный адрес сегмента, умножая его на 16.
 
== Сегментная адресация в защищённом режиме (селекторная адресация) ==
В защищённом режиме процессора адресное пространство задачи делится на сегменты различных размеров с различными базами. Для определения базы и размера сегментов служат [[дескриптор сегмента|дескрипторы сегментов]], хранящиеся в дескрипторных таблицах ([[Дескрипторные таблицы|дескрипторных таблицах]] (GDT и LDT]]).
 
[[ИзображениеФайл:Segment addressing.png]]
 
Здесь сегменты № 3 и № 11 указывают на одну и ту же область. Такие сегменты называются алиасными ({{lang-en|Alias}}). Сегмент № 7 охватывает сегменты № 1, № 2, № 3 и № 11. Сегмент № 5 указывает на GDT, позволяя её изменять (это никак не относится к GDT — её настоящий дескриптор хранится в регистре [[GDTR]] (показан жёлтым)). Адресация через локальную таблицу дескрипторов (LDT) происходит аналогично.
Строка 28:
* RPL — см.: [[Сегментная защита памяти]];
* TI определяет дескрипторную таблицу (GDT или LDT при 0 или 1 соответственно), из которой выбирается дескриптор;
* номер дескриптора — порядковый номер в дескрипторной таблице .<ref>Так как размер дескриптора равен восьми байтам, а номер дескриптора начинается с третьего бита, то можно адресовать дескриптор (если надо), просто обнулив RPL и TI.</ref>
 
== Примечания ==
{{примечания}}
 
== См. также ==
* [[Виртуальная память]]
 
== Примечания ==
{{примечания}}
 
== Ссылки ==
* http://www.intel.com/products/processor/manuals/
 
{{rq|wikify}}