OSDev Wiki
Advertisement

Сегментные регистры используются при формировании линейных адресов памяти. Вторым компонентом для формирования линейного адреса является смещение, называемое также эффективным адресом (применительно к архитектуре IA-32 эти называния равноправны, хотя первое применяется намного чаще). Способ вычисления линейного адреса зависит от режима работы процессора и подробно описан в разделе Формирование линейного адреса.

В микропроцессоре 8086 было четыре 16-разрядных сегментных регистра:

  • CS — сегментный регистр кода;
  • DS — сегментный регистр данных;
  • ES — сегментный регистр дополнительных данных;
  • SS — сегментный регистр стека.

Начиная с микропроцессора 80386, сегментных регистров стало шесть, но их разрядность не изменилась. «Новичками» стали два сегментных регистра дополнительных данных — FS и GS.

Общие правила использования сегментных регистров процессором таковы:

  • для выборки кода команды всегда используется сегментный регистр CS;
  • при обращении к стеку (смещение формируется с использованием регистров SP/ESP/RSP или BP/EBP/RBP) всегда используется сегментный регистр SS;
  • в строковых операциях при обращении к операнду-приёмнику (смещение в регистре DI/EDI/RDI) применяется сегментный регистр ES;
  • во всех остальных случаях, если не используется префикс замены сегмента, доступ к памяти осуществляется с использованием сегментного регистра DS. При наличии префикса замены сегмента вместо DS используется указанный префиксом сегментный регистр.

В реальном режиме содержимое каждого сегментного регистра представляет собой номер параграфа — 16-байтового участка памяти, выровненного на границу 16 байт.

В защищённом режиме каждый сегментный регистр делится на три части, как показано на рисунке:

SegmentRegister

Бит TI в этом случае указывает, какая таблица дескрипторов должна использоваться: нуль соответствует таблице глобальных дескрипторов (GDT), единица — таблице локальных дескрипторов (LDT). Поле Index является номером (индексом) дескриптора в таблице дескрипторов; этот дескриптор используется при вычислении линейного адреса. Наконец, поле RPL является запрошенным уровнем привилегий, используемым для контроля прав доступа программы к сегменту (подробнее об этом говорится в разделе Защита на уровне сегментов). Частным случаем RPL является текущий уровень привилегий — CPL, чьё значение в любой момент времени находится в сегментном регистре CS.

В 64-разрядном режиме сегментные регистры CS, DS, ES и SS в формировании линейного адреса не участвуют, поскольку сегментация в этом режиме не поддерживаются. Сегментные регистры FS и GS могут использоваться в качестве дополнительных регистров базы, о чём подробнее говорится в разделе Эффективный адрес.

Advertisement