Сегментная адресация памяти
| В данной статье или разделе имеется список источников или внешних ссылок, но источники отдельных утверждений остаются неясными из-за отсутствия сносок.
Вы можете улучшить статью, внеся более точные указания на источники.
|
Сегментная адресация памяти — схема логической адресации памяти компьютера в архитектуре x86. Линейный адрес конкретной ячейки памяти, который в некоторых режимах работы процессора будет совпадать с физическим адресом, делится на две части: сегмент и смещение. Сегментом называется условно выделенная область адресного пространства определённого размера, а смещением — адрес ячейки памяти относительно начала сегмента. Базой сегмента называется линейный адрес (адрес относительно всего объёма памяти), который указывает на начало сегмента в адресном пространстве. В результате получается сегментный (логический) адрес, который соответствует линейному адресу база сегмента+смещение и который выставляется процессором на шину адреса.
Селектором называется число (в x86 — 16-битное), однозначно определяющее сегмент. Селектор загружается в сегментные регистры.
В реальном и защищённом режимах x86-процессора функционирование сегментной адресации отличается.
Содержание |
[править] Сегментная адресация в реальном режиме
В реальном режиме процессора всё адресное пространство делится на одинаковые сегменты размером 65536 байт. База каждого последующего сегмента смещена относительно базы предыдущего на 16 байт (т. н. параграф). Таким образом, сегменты частично перекрывают друг друга. (Например, байт 17 сегмента 2 — это также и байт
сегмента 3, и байт
сегмента 1.)
Селектор 16-разрядный и задаёт номер сегмента. Учитывая, что сегменты следуют друг за другом с постоянным интервалом в 24=16 байт, очень легко выяснить линейный адрес сегмента, умножая его на 16.
[править] Сегментная адресация в защищённом режиме (селекторная адресация)
В защищённом режиме процессора адресное пространство задачи делится на сегменты различных размеров с различными базами. Для определения базы и размера сегментов служат дескрипторы сегментов, хранящиеся в дескрипторных таблицах (GDT и LDT).
Здесь сегменты № 3 и № 11 указывают на одну и ту же область. Такие сегменты называются алиасными (англ. 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.
[править] См. также
[править] Примечания
[править] Ссылки
- Intel® 64 and IA-32 Architectures Software Developer's Manuals
- Линейный адрес, сегментный адрес (контрольная по информатике)
Для улучшения этой статьи желательно?:
|
|
|
|
|---|---|
| Ядро |
Гибридное • Микро • Модульное • Монолитное • Нано • Экзо • Драйвер • Пространство пользователя • Область пользователя |
| Управление процессом |
|
| Управление памятью |
Защита памяти • Сегментная адресация памяти • Страничная память • Менеджер виртуальной памяти • Ошибка сегментации • Общая ошибка защиты |
| Примеры |
AmigaOS • BSD • GNU/Linux • Mac OS • Mac OS X • Microsoft Windows • MS-DOS • OpenSolaris • OS/2 • UNIX |
| Прочее | |


