Cтраница 2
Программно-доступными функциональными частями МП являются регистры общего назначения ( для хранения операндов и результатов выполнения команд), сегментные ( для хранения базовых адресов текущих сегментов памяти), адреса команд и признаков. Регистры общего назначения разбиты на две группы по четыре регистра в каждой: данных, индексные и указатели. Старшие и младшие восемь разрядов группы регистров данных могут быть адресованы раздельно. В этом случае они образуют набор из восьми 8-разрядных регистров. [16]
![]() |
Адресация памяти в защищенном режиме процессора Intel 80286. [17] |
Таким образом, на сумматор, вычисляющий физический адрес памяти, подается не содержимое сегментного регистра, как в предыдущем случае, а базовый адрес сегмента из таблицы дескрипторов. [18]
Наблюдательный читатель, возможно, уже заметил, что одна из основных сложностей при дескрипторной адресации - это разрешение конфликта между желанием, с одной стороны, поместить базовый адрес сегмента непосредственно в дескриптор и, с другой стороны, желанием сделать сегменты перемещаемыми. Когда необходимо переместить часть структуры во время исполнения программы ( как, например, в случае, когда сегменты повторно перемещаются в основную память в системах с виртуальной памятью), должна быть найдена и обновлена каждая ссылка на перемещаемый сегмент ( объект), чтобы отразить новое местоположение объекта. [19]
![]() |
Пример использования команды XLAT. [20] |
Команды LDS и LES используются, в основном, при обращении к данным, находящимся вне текущих сегментов DS или ES, так, что возникает необходимость изменить базовый адрес сегмента. Пара 16-разрядных адресов - база сегмента и смещение в сегменте, называемая указателем, предварительно загружается в память. Значение смещения содержится в двух первых байтах указателя, а базовый адрес сегмента - в третьем и четвертом байтах. По команде LDS ( или LES) происходит обращение к указателю и осуществляется загрузка регистра DS ( или ES) базовым адресом, а смещение пересылается в регистр, указанный полем reg постбайта команды. [21]
Имя таблицы отображения используется для указания текущей таблицы отображения, а смещение обозначает конкретный элемент таблицы отображения в таблице отображения. Базовый адрес сегмента берется из информации, содержащейся в элементе таблицы отображения. [23]
Затем сопроцессор считает адрес блока конфигурации системы, содержащийся в байтах с адресами FFFF8H - FFFFBH. Значения базового адреса сегмента блока конфигурации и смещения преобразуются в 20-разрядный физический адрес, который записывается во внутренний регистр. Этот байт задает режим запроса / предоставления ( разряд R) и физическую ширину шины ввода-вывода ( разряд I): при 1 0 -шина ввода-вывода 8-разрядная, при 1 1 - шина 16-разрядная. Далее, после считывания байта SOC, сопроцессор читает значения базового адреса сегмента блока управления каналами и смещения, которые преобразуются в 20-разрядный физический адрес и помещаются в другой внутренний регистр. Этот регистр недоступен для программ каналов, так что блок управления канала не может перемещаться во время работы без повторной инициализации СП. [24]
Область памяти с дескрипторами называется таблицей дескрипторов. Каждый дескриптор сегмента содержит базовый адрес сегмента, размер сегмента ( от 1 до 64 Кбайт) и его атрибуты. Базовый адрес сегмента имеет разрядность 24 бит, что обеспечивает адресацию 16 Мбайт физической памяти. [25]
Каждый элемент п таблицы содержит два слова, определяющие начальный логический адрес подпрограммы. Слово с большим адресом содержит базовый адрес сегмента, а слово с меньшим адресом - смещение подпрограммы от начала кодового сегмента. [26]
![]() |
Регистр признаков EFLAGS процессора 80386. [27] |
В защищенном режиме в регистры дескрипторов загружается 32-битный базовый адрес сегмента, 32-битный лимит и атрибуты сегментов. [28]
![]() |
Преобразование пары ( селектор, смещение в линейный адрес. [29] |
Если разбиение на страницы блокировано ( это определяется по биту в регистре глобального управления), линейный адрес интерпретируется как физический адрес и отправляется в память для чтения или записи. Таким образом, при блокировке разбиения на страницы мы имеем чистую схему сегментации, где каждый базовый адрес сегмента дан в его дескрипторе. Допускается перекрытие сегментов, поскольку было бы слишком утомительно тратить много времени на проверку, чтобы все сегменты были непересекающимися. [30]