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

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Содержимое страницы заменено на «* {{rq|wikify}} Категория:Программирование x86 Категория:Виртуал...»
Строка 1:
*
= ВИКИПЕДИЯ - ТОП ОЛЕГ ПЛОХОЙ =
{{Обобщить}}<!-- есть сегментная адресация = http://en.wikipedia.org/wiki/Memory_segmentation а есть оно же в x86 http://en.wikipedia.org/wiki/X86_memory_segmentation -- при обобщении переименовать эту в "Сегментная адресация памяти x86" а общую писать с нуля. -->
{{refless}}
 
 
''Селектором'' называется число (в [[x86]] — 16-битное), однозначно определяющее сегмент. [[Селектор]] загружается в сегментные регистры.
 
В [[Реальный режим|реальном]] и [[Защищённый режим|защищённом]] режимах x86-процессора функционирование сегментной адресации отличается.
 
== Сегментная адресация в реальном режиме ==
В [[реальный режим|реальном режиме процессора]] всё [[адресное пространство (информатика)|адресное пространство]] делится на одинаковые сегменты размером 65536 байт (<math>2^{16}</math> байт). Начало каждого последующего сегмента (так называемая База сегмента) смещено относительно базы предыдущего на минимальный размер сегмента, то есть на 16 [[байт]] (т. н. ''параграф''). Таким образом, сегменты могут частично перекрывать друг друга. (Например, байт 17 сегмента 2 — это также и байт <math>1=17-16</math> сегмента 3, и байт <math>33=17+16</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) происходит аналогично.
 
Селектор также 16-разрядный, но делится на три части: RPL (биты 0-1), TI (бит 2) и номер дескриптора ([биты 3-15).
* RPL — см.: [[Сегментная защита памяти]];
* TI определяет дескрипторную таблицу (GDT или LDT при 0 или 1 соответственно), из которой выбирается дескриптор;
* номер дескриптора — порядковый номер в дескрипторной таблице. Так как размер дескриптора равен восьми байтам, а номер дескриптора начинается с третьего бита, то можно адресовать дескриптор (если надо), просто обнулив RPL и TI.
 
== См. также ==
* [[Виртуальная память]]
 
== Примечания ==
{{примечания}}
 
== Ссылки ==
* [http://www.intel.com/products/processor/manuals/ Intel 64 and IA-32 Architectures Software Developer's Manuals] / Intel {{ref-en}}
* [http://citforum.ru/hardware/memory/mem_0501.shtml E.0. Сегментная организация памяти в микропроцессорах i8086/88 и в реальном режиме работы микропоцессоров x86.], [http://citforum.ru/hardware/memory/mem_0502.shtml E.1. Сегментация памяти в защищенном режиме.] / Серия: "Основы информационных систем" Выпуск 2 (VII). Память. Юрий А. Денисов
* [http://www.intuit.ru/studies/courses/2192/31/lecture/982?page=3 Лекция 8: Организация памяти компьютера. Простейшие схемы управления памятью.] / Основы операционных систем, 2004, ISBN 978-5-9556-0044-4
{{rq|wikify}}
 
{{Аспекты операционных систем}}
 
[[Категория:Программирование x86]]