Сегментная адресация памяти

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

Сегментная адресация памяти — схема логической адресации памяти компьютера в архитектуре x86. Линейный адрес конкретной ячейки памяти, который в некоторых режимах работы процессора будет совпадать с физическим адресом, делится на две части: сегмент и смещение.[1] Сегментом называется условно выделенная область адресного пространства определённого размера, а смещением — адрес ячейки памяти относительно начала сегмента. Базой сегмента называется линейный адрес (адрес относительно всего объёма памяти), который указывает на начало сегмента в адресном пространстве. В результате получается сегментный (логический) адрес, который соответствует линейному адресу база сегмента+смещение и который выставляется процессором на шину адреса.

Селектором называется число (в x86 — 14-битное), однозначно определяющее сегмент. Селектор загружается в сегментные регистры.

В реальном и защищённом режимах x86-процессора функционирование сегментной адресации отличается.

Сегментная адресация в реальном режиме

В реальном режиме процессора всё адресное пространство делится на одинаковые сегменты размером 65536 байт. База каждого последующего сегмента смещена относительно базы предыдущего на 16 байт (т. н. параграф). Таким образом, сегменты частично перекрывают друг друга. (Например, байт 17 сегмента 2 — это также и байт <math>1=17-16</math> сегмента 3, и байт <math>33=17+16</math> сегмента 1.)

Селектор 16-разрядный и задаёт номер сегмента. Учитывая, что сегменты следуют друг за другом с постоянным интервалом в 24=16 байт, очень легко выяснить линейный адрес сегмента, умножая его на 16.

Сегментная адресация в защищённом режиме (селекторная адресация)

В защищённом режиме процессора адресное пространство задачи делится на сегменты различных размеров с различными базами. Для определения базы и размера сегментов служат дескрипторы сегментов, хранящиеся в дескрипторных таблицах (GDT и LDT).

Файл:Segment addressing.png

Здесь сегменты № 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 соответственно), из которой выбирается дескриптор;
  • номер дескриптора — порядковый номер в дескрипторной таблице.[2]

См. также

Примечания

  1. Сегментную адресацию можно умозрительно уподобить делению текста на абзацы. По этой аналогии сегмент соответствует абзацу, а смещение — номеру символа в этом абзаце.
  2. Так как размер дескриптора равен восьми байтам, а номер дескриптора начинается с третьего бита, то можно адресовать дескриптор (если надо), просто обнулив RPL и TI.

Ссылки


ca:Segmentació de memòria cs:Segmentace de:Segmentierung (Speicherverwaltung) en:Memory segmentation es:Segmentación de memoria eu:Segmentazio (memoria) fr:Segmentation (informatique) it:Segmentazione (memoria) ja:セグメント方式 ko:메모리 세그먼트 pl:Segmentacja pamięci pt:Segmentação (memória) zh:記憶體區段

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....