Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral


Управление памятью

Ключевым моментом управления памятью в процессоре 80286 является преобразование адреса, т. е. превращение адресов, используемых программами, в адреса, воспринимаемые схемами памяти. Напомним, что указатель в процессоре 80286 (и в микропроцессорах 8086, 8088 и 80186) имеет длину 32 бита.

Он состоит из 16-битного селектора сегмента и 16-битного смещения в выбранном сегменте. Когда указатель находится в памяти, смещение содержится по меньшему адресу, а затем размещается селектор сегмента, адрес которого на 2 больше. Это соответствует соглашению о хранении более значимых величин по большим адресам. Но, как мы видели в гл. 2, наиболее часто два компонента указателя разделены, причем селектор находится в сегментном регистре, а смещение либо вычисляется в соответствии с режимом адресации операнда (прямая, база + смещение и др.), либо находится в регистре (IP, BP и др.) Этот принцип действует в реальном и виртуальном режимах работы процессора 80286, Однако оба режима различаются тем, каким образом из селектора и смещения образуется физический адрес памяти. Под физическим адресом мы понимаем то единственное число, которое передается в память для обращения к ней.

Вычисление физического адреса в реальном режиме.

Это действие уже рассматривалось, поэтому здесь мы только напомним о нем. В реальном режиме 32-битный указатель называется реальным адресом.

На рисунке показано преобразование реального адреса в физический. Шестнадцатибитный селектор сдвигается на 4 бита влево (т. е. умножается на 16), определяя 20-битный базовый адрес сегмента. Затем к базовому адресу прибавляется 16-битное смещение и в результате получается 20-битный физический адрес При сложении переполнение игнорируется. Несмотря на то, что 16-битные селектор и смещение допускают 216 сегментов по 216 байт, результирующее адресное пространство составляет на 216 х 216 = 232 (около 4 млрд.) байт, а всего 220 (около 1 млн.) байт. Объясняется это перекрытием сегментов. Например, два реальных адреса с парами (селектор, смещение) = (2, 5) и (1, 21) соответствуют одному и тому же физическому адресу 37. Чтобы получить большее адресное пространство, допускаемое 32-битным указателем, требуется другой способ преобразования адреса.

НЕ нашли? Не то? Что вы ищете?

Вычисление физического адреса в виртуальном режиме.

В виртуальном режиме 32-битный указатель называется виртуальным адресом. Он, как и реальный адрес, состоит из 16-битных селектора и смещения. По-прежнему селектор определяет базовый адрес сегмента, к которому для получения физического адреса прибавляется смещение. Но вместо образования базового адреса сегмента путем сдвига селектора влево на 4 бита базовый адрес получается посредством обращения (индексирования) к таблице в памяти, что показано. Селектор виртуального адреса состоит из трех полей: запрашиваемый уровень привилегий RPL, индикатор таблицы TI и индекс. Поле RPL использ. операцион. системой для решения рассматриваемой далее проблемы "троянского коня".

Это поле на участвует в преобразовании адреса и обсуждается в разделе по кольцам защиты. Поле индикатора таблицы показывает, какая из двух таблиц привлекается для поиска базового адреса. Если TI = 0, то используется глобальная дескрипторная таблица GDT. Система с процессором 80286 имеет одну таблицу GDT, которая разделяется всеми задачами. Если TI = 1, то используется локальная дескрипторная таблица LDT, причем каждая задача имеет свою LDT. Следовательно, базовые адреса сегментов, разделяемых всеми задачами, хранятся в GDT, a базовые адреса "частных" сегментов каждой задачи находятся в LDT. Поле индекса селектора служит индексом выбранной таблицы. Каждый элемент таблицы называется дескриптором. Таблица индексируется с нуля и значение i поля индекса относится к i-му дескриптору в таблице. Дескрипторы имеют длину 8 байт и каждый из них содержит 24-битный базовый адрес соответствующего сегмента, т. е. он занимает 3 байта из 8. Назначение остальных байт дескриптора мы рассмотрим в дальнейшем. Полученный из выбранного дескриптора 24-битный базовый адрес суммируется с 16-битным смещением, в результате чего получается 24-битный физический адрес. Переполнение при сложении игнорируется.

Регистры преобразования адреса, назначение и использование теневых регистров

На рис.3 показаны все регистры преобразования адреса и их теневые

регистры

Рис.3. Регистры преобразования адреса

Когда селектор загружает в сегментный регистр, соответствующий дескриптор автоматически загружается в его теневой регистр.

Т. о. в виртуальном режиме происходит преобразование виртуального адреса в физический. Виртуальный адрес состоит из сеслектора, по которому процессор может определить адрес базы сегмента и значение смещения, которое складывается с базовым адресом. Селектор определяет соответствующий базовый адрес сегмента путем обращения к таблице. Один бит селектора показывает нужно ли использовать таблицу глобальную для всей системы, или локальную для текущей задачи. Селектор содержит также индекс, который позволяет получить дескриптор сегмента. Этот адрес содержит адрес базы выбранного сегмента. Каждый селектор обращается к соответствующему дескриптору, а дескриптор к соответствующему сегменту. Чтобы ускорить обращение к памяти, при загрузке селектора в сегментный регистр соответствующий дескриптор автоматически загружается в теневой регистр этого сегментного регистра. Дальнейшее обращение к памяти через сегментный регистр не требует обращения к таблице, т. к. базовый адрес выбранного сегмента находится в теневом регистре.

Дескриптор сегмента — служебная структура в памяти, которая определяет сегмент. Длина дескриптора равна восьми байтам.

Структура сегментного дескриптора

    База (жёлтые поля, 32 бита) — начало сегмента в линейной памяти Лимит (красные поля, 20 бит) — (размер сегмента в байтах)-1 (База+Лимит = линейный адрес последнего байта) Права доступа (синие поля, 12 бит) — флаги, определяющие наличие сегмента в памяти, уровень защиты, тип, разрядность + один пользовательский флаг

Байт прав доступа (AR, англ. Access Rights, биты 8-15 на рисунке):

    Бит P определяет доступность сегмента (0 — сегмента нет, 1 — есть). При обращении к сегменту со сброшенным битом P происходит исключение #NP, обработчик которого может загрузить/создать сегмент. Номер привилегий DPL содержит 2-битный номер (0-3), определяющий, к какому уровню (кольцу) защиты относится этот сегмент. Тип сегмента (биты 8-12 на рисунке). Старший бит (S) определяет сегмент как системный (S=0) или пользовательский (S=1). Значение прочих бит для системных и пользовательских сегментов описано в таблице:

Типы системных сегментов

Биты AR

Описание

3

2

1

0

0

0

0

0

0

Зарезервировано

1

0

0

0

1

Свободный 16-битный TSS

2

0

0

1

0

LDT

3

0

0

1

1

Занятый 16-битный TSS

4

0

1

0

0

16-битный шлюз вызова

5

0

1

0

1

Шлюз задачи

6

0

1

1

0

16-битный шлюз прерывания

7

0

1

1

1

16-битный шлюз ловушки

8

1

0

0

0

Зарезервировано

9

1

0

0

1

Свободный 32-битный TSS

A

1

0

1

0

Зарезервировано

B

1

0

1

1

Занятый 32-битный TSS

C

1

1

0

0

32-битный шлюз вызова

D

1

1

0

1

Зарезервировано

E

1

1

1

0

32-битный шлюз прерывания

F

1

1

1

1

32-битный шлюз ловушки

Типы пользовательских сегментов

Биты AR

Описание

3

2

1

0

0

0

0

Сегмент данных только для чтения

2

0

0

1

Сегмент данных для чтения/записи

4

0

1

0

Сегмент данных только для чтения, растёт вниз

6

0

1

1

Сегмент данных для чтения/записи, растёт вниз

8

1

0

0

Сегмент кода только для выполнения

A

1

0

1

Сегмент кода для выполнения/чтения

C

1

1

0

Подчинённый сегмент кода только для выполнения

E

1

1

1

Подчинённый сегмент кода для выполнения/чтения

Младший бит байта AR пользовательских сегментов (A, англ. Accessed, бит 8 на рисунке) можно использовать для сбора статистики о сегменте. При первом же обращении ксегменту (чтение, запись, выполнение) он устанавливается процессором в 1.

    Флаг гранулярности G определяет лимит сегмента: при G=0 лимит равен значению соответствующего поля в дескрипторе, а при G=1 лимит равен полю дескриптора, умноженному на (212 = 4096). Таким образом при G=0 максимальный размер сегмента 1 МБайт, а при G=1 4 ГБайт. Флаг разрядности DB (бит 22 на рисунке) актуален для пользовательских сегментов кода и стека. Определяет разрядность в 16 бит при нулевом и 32 бит при единичном значении. Зарезервированный флаг (серое поле) должен всегда равняться нулю. Пользовательский флаг AVL (A, бит 20 на рисунке) отдан операционной системе. Его состояние никак не влияет на работу с сегментом.