Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MPT_otvety_na_ekzamen.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
416.51 Кб
Скачать
  1. Назначение и структура дескрипторов кода и данных:

Общий вид этих дескрипторов приведен на рисунке III.2.

63 Байт 7 55 52 Байт 6 48 47 Байт 5 Байт 4 32

Базовый адрес

сегмента

(биты 31…24)

G D 0 U

Предел сегмента

(биты 19…16)

Байт прав доступа

Базовый адрес сегмента

(биты 23…16)

Базовый адрес сегмента (биты 15…0)

Размер (предел) сегмента (биты 15…0)

31 Байт 3 Байт 2 16 15 Байт 1 Байт 0 0

Рис III.2 Формат дескриптора кода и данных МП семейства х86

Здесь:

G (Granularity) - гранулярность размера сегмента (G = 0  в байтах, G = 1  в страницах по 4К).

D (Default size) – разрядность, по умолчанию, адресов, операндов и указателя стека (D = 0  16 бит, D = 1  32 бита). Благодаря этому биту процессоры i386+, без специальных дополнительных мер, могут переключаться с выполнения 16 битного кода на 32 битный код и обратно. Для сегментов данных и стека справедлива аналогичная интерпретация. Когда бит D = 0, стековые операции производятся с 16 битными элементами и в качестве указателя стека привлекается регистр SP. Кроме того, максимальный размер стека ограничен 64 Кбайт. Когда бит D = 1, стековые операции производятся с 32 битными элементами и в качестве указателя стека привлекается регистр ESP, при этом максимальный размер стека может быть увеличен до 4 Гбайт.

U (Users) – бит пользователя, используется по его усмотрению. Процессор этот бит игнорирует.

AR (Access rights byte) – байт прав доступа.

Байт прав доступа у дескрипторов кодового сегмента имеет структуру, приведенную на рисунке III.3, а у дескрипторов сегментов данных и стека структуру, приведенную на рисунке III.4.

7 6 5 4 3 2 1 0

P

DPL

S

E

C

R

A

Рис.IV.3 Байт прав доступа дескрипторов сегментов кода.

7 6 5 4 3 2 1 0

P

DPL

S

E

ED

W

A

Рис.III.4 Байт прав доступа дескрипторов сегментов данных и

стека.

Здесь:

DPL (Descriptor Privilege Level) – уровень привилегий сегмента: (00, 01, 10, 11: при этом уровень 00 является высшим уровнем, а уровень 11- низшим).

S (System) – признак системного сегмента: (S=0 характеризует системный сегмент, а S=1 - сегмент кода, стека, или сегмент данных).

E (Executable) – признак исполняемости сегмента. (Для сегмента кода E=1, для сегментов данных или стека E = 0).

C (Conforming) – признак подчиненности сегмента: (При С=1 код запрашиваемого сегмента будет исполняться, если текущий уровень привилегий процессора (CPL) не выше уровня привилегий дескриптора запрашиваемого сегмента (DPL); При С=0 (неподчиненный сегмент), управление на данный сегмент может передаваться, только, если CPL=DPL).

R (Readable) – признак читаемости кодового сегмента. При R=1, можно считать, т.е. скопировать содержимое кодового сегмента. Если же R=0, то содержимое кодового сегмента считать нельзя, что является защитой от несанкционированного (случайного или умышленного) копирования программ.

A (Accessed) – признак обращения к данному сегменту. Если A=0, то это означает, что к моменту контрольного обращения к этому биту, обращения процессора к данному сегменту (кода, данных или стека) не было. Если же A=1, то это означает, что к данному моменту селектор этого сегмента уже загружался в сегментный регистр или для него выполнялась команда тестирования. Обычно, операционная система привлекает бит A для того, чтобы выбрать нечасто используемые сегменты, которые при необходимости можно передать на жесткий диск (при P = 0) в процессе свопинга (swapping). Биты A у дескрипторов всех сегментов первоначально должны находиться в состоянии 0. Через регулярные интервалы времени ОС сканирует все дескрипторы и сбрасывает их биты A в нуль. Если в некоторый момент времени у дескриптора определялся бит A=1, то это означает, что к нему после предыдущего сканирования были обращения. При этом ОС производит инкремент времени последнего использования таких сегментов. Когда появляется необходимость выбирать сегмент в оперативной памяти для передачи его на жесткий диск, то этим сегментом будет сегмент неиспользованный за интервал сканирования, т.е. тот у которого бит A=0. Если к этому моменту у всех сегментов A=1, то будет выбран сегмент, к которому дольше всего не было обращения, т.е. интервал времени от последнего обращения к нему до момента принятия решения о свопинге было максимальным. Описанный принцип, по которому из оперативной памяти выбирается сегмент, подлежащий передаче во внешнюю память, носит название алгоритма LRU (Least Recently Used – наименее используемый к настоящему моменту времени).

Очевидно, каждому сегменту должен соответствовать свой счетчик, подсчитывающий время от последнего обращения к сегменту. Тогда, при использовании, например, 16 сегментов, необходимо 16 счетчиков. Если же сегментов значительно больше, то и счетчиков соответственно должно быть больше. Поэтому иногда делают так, что биты A сбрасываются все после того, как они у всех дескрипторов стали равными 1 (при этом дескриптор, к которому было последнее обращение, остается с битом A=1) и все начинается сначала. Такой способ особенно широко применяется при свопинге страниц, при использовании страничной организации памяти.

ED (Expansion Direction или Expand Down) – признак направления изменения адресов при обращении к данному сегменту. Этот признак является признаком отличия сегмента стека (ED = 1) от сегмента собственно данных (ED = 0). Он управляет интерпретацией поля предела. В сегменте данных адресация в процессе изменения начинается с базового адреса сегмента (зафиксированного в сегментном регистре), и границей сегмента будет адрес равный сумме базового адреса и предела сегмента. Поэтому для сегмента данных допустимыми будут все смещения меньшие или равные указанному пределу.

В сегменте стека, адреса ячеек стека, при его использовании, изменяются в сторону уменьшения адресов. Поэтому начальным адресом стековой памяти будет являться сумма базового адреса и константы 0FFFFh (64К-1), в случае, когда бит D = 0, т.е. в случае 16 разрядной адресации, либо суммой базового адреса и константы 0FFFFFFFFh (4Г-1), в случае, когда бит D = 1, т.е. в случае 32 разрядной адресации. Минимальный же адрес стековой памяти определяется значением предела. Так как все смещения в сегменте должны быть больше предела, максимальный размер стека получается, когда предел равен 0. Минимальный же размер стека получается, когда предел равен либо 0FFFFh (при D=0), либо 0FFFFFFFFh (при D = 1), что соответствует пустому сегменту с нулевым размером.

Сегменты стека по существу являются разновидностью сегментов данных. Они отличаются от сегментов, собственно данных, с разрешенными операциями записи и считывания, только интерпретацией поля предела, которое определяет размер стека с учетом бита гранулярности G. Отметим сразу же, что термин «расширение вниз», т.е. к меньшим адресам, относится к той графической иллюстрации адресного пространства, в которой нулевой адрес находится внизу рисунка, а максимальный адрес вверху.

На рис III.5 иллюстрировано различие между интерпретацией поля предела для сегментов данных и сегментов стека в случае, когда они оба имеют предел 1FFFh (G = 0). Отметим, что в процессорах i386+ при бите D = 1, бит гранулярности G также должен находиться в состоянии 1. Если же бит D = 0, то и бит G должен находиться в состоянии 0. Следовательно, необходимо не только определить 32 битный сегмент стека с максимальным адресом 4Г-1, но и установить предел в единицах 4К байт (т.е. в страницах).

Рис III.5. Интерпретация поля предела для сегментов данных и

сегментов стека

W (Writable) – признак того, что в данный сегмент данных информация может быть записана и модифицирована (W = 1). Если же W =0, то этот сегмент является сегментом, для которого разрешено только считывание информации. Запись же информации в него или ее модифицирование – запрещена. Таким образом, память сегмента данных в этом случае работает в режиме ROM – памяти. Этот режим работы сегмента бывает очень важным в случае, если в сегменте размещены некоторые данные, таблицы, константы, которые широко используются многими программами и изменение, в которых может быть осуществлено только на системном уровне.

Кроме того, сегмент с запрещенной записью не нужно передавать на диск (если его все же нужно удалить из памяти), так как после передачи его с диска в оперативную память он не изменялся. Следовательно, ограничения на доступ по записи повышает эффективность системы виртуальной памяти, сокращая дисковые передачи.

P (Present) – бит присутствия сегмента в оперативной памяти: (P = 1  присутствует, P = 0  отсутствует).

В первом случае проверяются: условие нахождения задаваемого адреса в пределах выбираемого сегмента, т.е., что бы смещение в сегменте (эффективный адрес) было меньше значения предела сегмента, указанного в дескрипторе, а также соответствие выбранного сегмента (исполнительный, исполнительный считываемый, данных только считывания, данных считывания и записи, стека) запрашиваемому сегменту. Так, например, при загрузке селектора в сегментный регистр данных (т.е. в DS, ES, FS, и GS) тип дескриптора должен разрешать считывание из сегмента. Только исполняемые сегменты для этих регистров не допускаются, но сегменты с разрешенными операциями исполнения и считывания допустимы. В случае загрузки селектора в сегментный регистр SS в дескрипторе соответствующего сегмента должны быть разрешены операции считывания и записи. При загрузке регистра CS сегмент должен быть обязательно исполняемым. Кроме этого проверяются и некоторые другие условия. Если же хотя бы одна из этих проверок не удовлетворяется, то формируется запрос прерывания (особый случай) и загрузка селектора не производится.

После этого формируется линейный (физический) адрес путем сложения базового адреса выбранного сегмента со смещением в сегменте, формируемом в соответствии с типом адресной части команды.

Если же P = 0, в дескрипторе выделяется базовый адрес сегмента и вызывается внешняя память (винчестер). Затем, по этому базовому адресу выбирается требуемый сегмент, расположенный на винчестере, и перезаписывается на свободное место в оперативной памяти. После этого адрес, по которому этот сегмент записан в оперативную память, заносится в дескриптор на место, предназначенное для хранения базового адреса, атрибуту P присваивается значение 1 и этот дескриптор инициируется заново. Если же свободного места в оперативной памяти в данное время нет, то по атрибуту А определяется сегмент, к которому было меньше всего обращений, и он передается во внешнюю память (винчестер) на свободное место. После этой передачи, адрес, по которому данный сегмент записался на винчестер, заносится в дескриптор данного сегмента на место размещения базового адреса сегмента, а его атрибут P устанавливается в нулевое состояние. Затем на освободившееся место оперативной памяти считывается с диска требуемый сегмент по алгоритму, описанному выше.

При включенной страничной организации памяти, линейный адрес формируется аналогично, но свопинга (т.е. обмена информацией между ОЗУ и внешней памятью) на уровне сегментов не происходит. В элементе таблицы страниц также есть бит P, который определяет наличие страницы в оперативной физической памяти. При обращении к странице, в элементе которой P = 0, реализуется особый случай (исключение) страничного нарушения, при котором операционная система осуществляет:

  • Копирование в ОЗУ запрашиваемой страницы из внешней

памяти (винчестера);

  • Установку P = 1 и запись в элемент таблицы страниц нового адреса

страницы в ОЗУ;

- Стирание копии старого элемента в таблице страниц в буфере TLB;

- Рестарт команды, вызвавший особый случай.

Таким образом, байт прав доступа сегментов кодовых отличается от байта прав доступа сегментов данных и стека 1 и 2 битом, которые имеют для того и другого типов сегментов принципиально различное значение. Остальные же биты байта прав доступа сегментов этого типа выполняют одинаковые функции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]