Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004) (1186255), страница 98
Текст из файла (страница 98)
Это же имя должно быть повторено в директиве ENDP,заканчивающей описание процедуры. Предложения между этими двумядирективами образуют тело процедуры (подпрограмму).Имяпроцедуры является фактически меткой первой из команд тела, поэтомуданную команду не надо специально метить.Если в директиве PROC указан параметр NEAR или он вообще неуказан, то такая процедура считается "близкой" и обращаться к нейможно только из того сегмента команд, где она описана.
Дело в том,что ассемблер будет заменять все команды CALL, где указано имяданной процедуры, на машинные команды близкого перехода свозвратом, а все команды RET внутри процедуры - на близкие возвраты.Если же в директиве PROC указан параметр FAR, то это "дальняя"процедура: все обращения к ней и все команды RET внутри неерассматриваются ассемблером как дальние переходы. Обращаться кэтой процедуре можно из любых сегментов команд.Таким образом, достаточно лишь указать тип процедуры (близкаяона или дальняя), всю же остальную работу возьмет на себя ассемблер:переходы на нее и возвраты из нее будут автоматически согласованы сэтим типом.
В этом главное (и единственное) достоинство описанияподпрограмм в виде процедур. (Отметим, что метки и имена,описанные в процедуре, не локализуются в ней.)Например, вычисление ax:=sign(ax) можно описать в видепроцедуры следующим образом:SING PROC FAR ;дальняя процедураCMP AX,0JE SGN1 ;AX=0 - перейти к SGN1MOV AX,1 ;AX:=1 (флаги не изменились!)JG SGN1 ;AX>0 - перейти к sgn1MOV AX,-1 ;AX:=-1SGN1: RET;дальний возвратSIGN ENDP...Возможный пример обращения к этой процедуре:;CX:=SIGN(VAR)MOV AX,VARCALL SIGN ;дальний вызовMOV CX,AX500Защищенный режимРассмотрим работу в защищенном режиме процессоров 80286,80386 и более старших моделей.Адресация в защищенном режиме 16-разрядного МП 80286В этом режиме механизм адресации сильно отличается отмеханизма адресации в реальном режиме.
За счет использования 24битной адресной шины процессора 80286 физическое адресноепространство достигает 16 Мбайт (224 - 16 М).В данном режиме для определения адресов также необходимы дварегистра, однако содержимое каждого регистра сегмента несоответствует непосредственно какому-либо месту в оперативнойпамяти. Регистр сегмента, который в защищенном режиме называютселектором, в действительности становится индексом, указывающим наэлемент таблицы, называемой таблицей дескрипторов (Descriptor Table).Каждый элемент этой таблицы (называемый дескриптором)характеризует один сегмент команд или один сегмент данных. Сегментстека относят при этом к сегментам данных, поскольку он не содержитисполняемых команд.Дескриптор содержит физический адрес начала сегмента в памяти(базовый адрес), его размер, а также другую информацию.
Базовыйадрес размещается на 24 бит (а не на 20, как в реальном режиме),поэтому сегменты не обязательно должны быть теперь выровнены наадрес, кратный 16. Размер сегмента указывается в 16 битах, и поэтомуможет принимать любые значения, меньшие или равные 64 Кбайт. Вэтом состоит фундаментальное отличие от реального режима, гдекаждый сегмент по умолчанию имеет размер 64 Кбайт.
После определения базового адреса сегмента к нему прибавляется значение смещения(размещаемого на 16 бит), и процессор может обратиться ксоответствующей ячейке памяти. Очевидно, чти метод вычисленияфизических адресов в защищенном режиме значительно сложнее, чем вреальном режиме. Однако эти вычисления выполняются процессором ине наблюдаемы для программиста, для которого механизм адресациивыглядит неизменным. Действительно, как и в реальном режиме, команды, стек или данные адресуются с помощью соответствующего регистрасегмента (называемого селектором) и смещения.501Эти данные позволяют теперь определить максимальный размерадресного пространства, доступного для каждой программы.
В самомделе, мы видели, что поле индекса какого-либо регистра селектора имеетразмер 13 бит, что позволяет обратиться к 8192 (213 - 8192)дескрипторам в каждой таблице. Зная значение бита индикаторатаблицы, можно обратиться к двум таблицам, которые содержат по 8192дескриптора. Каждый из этих дескрипторов соответствует сегменту смаксимальным размером 64 Кбайт (216 - 64К). Таким образом, полнаявиртуальная память, доступная для каждой задачи составляет 8192*2*64Кбайт, что равно 1 Гбайт (2U*2*216 - 230 - 1 Гбайт).
Пересчет адреса ввиртуальной памяти в реальную оперативную память производитсяпроцессором автоматически. Это соответствует тому, что физическиеадреса не наблюдаемы или прозрачны для программы.502Адресация в защищенном режиме МП 80386 и старшеЗащищенный режим, появившейся в МП 80286 имел не всевозможности, доступные в 32-разрядных процессорах, какими являются80386, 80486 и Pentium. На рисунке показано, как в этих МП (при работев защищенном режиме) генерируется физический адрес памяти наоснове содержимого базового и индексного регистров, а такжесодержащегося команде значения смещения.
Для получения 32503разрядного исполнительного адреса значение индексного регистраумножается на коэффициент масштабирования, равный 1, 2,4 или 8,затем результат прибавляется к содержимому базового регистра сучетом заданного в команде смещения. Четырнадцать старших битоводного из шести сегментных регистров определяют дескриптор,используемый в качестве индекса в таблице дескрипторов из которойизвлекается 32-разрядный базовый адрес. Этот адрес прибавляется кисполнительному адресу внутри сегмента, вследствие чего получается32-разрядный линейный адрес.
Страничный блок, используя таблицустраниц, транслирует линейный адрес в 32-разрядный физический адрес.Таблицы страниц и дескрипторов сегментов довольно велики,поэтому хранятся в основной памяти. Для обеспечения быстройтрансляции может использоваться буфер быстрого преобразованияадресов TLB. В таблицах дескрипторов сегментов содержатся поля правдоступа, а также поля границ сегментов, определяющие ихмаксимальный размер. Этими параметрами управляет операционнаясистема. Они нужны для защиты как операционной системы, так иприкладных программ, находящихся в основной памяти. Отсюда иназвание данного режима работы процессора — «защищенный».504Защищенный режим предназначен для обеспечения независимостивыполнения нескольких задач, что подразумевает защиту ресурсоводной задачи от возможного воздействия другой (под задачамиподразумеваются как приложения, так и задачи операционной системы).Основным защищаемым ресурсом является память, в которойхранятся коды, данные и различные системные таблицы (например,таблица прерываний).
Защищать требуется и совместно используемуюаппаратуру, обращение к которой обычно происходит через операцииввода/вывода и прерывания. В защищенном режиме процессораппаратно реализует многие функции защиты, необходимые дляпостроения супервизора многозадачной ОС, в том числе механизмвиртуальной памяти.Защита памяти основана на сегментации. Сегмент — это блокпространства памяти определенного назначения. К элементам сегментавозможно обращение с помощью различных инструкций процессора,использующих разные режимы адресации для формирования адреса впределах сегмента. Максимальный размер сегмента — 4 Гбайт (дляпроцессоров 8086 и 80286 предел был всего 64 Кбайт).
Сегменты памятивыделяются задачам операционной системой, но в реальном режимелюбая задача может переопределить значение сегментных регистров,задающих положение сегмента в пространстве памяти, и «залезть» вчужую область данных или кода. В защищенном режиме сегменты тожераспределяются операционной системой, но прикладная программасможет использовать только разрешенные для нее сегменты памяти,выбирая их с помощью селекторов из предварительно сформированныхтаблиц дескрипторов сегментов.Процессор может обращаться только к тем сегментам памяти, длякоторых имеются дескрипторы в таблицах.
Механизм сегментацииформирует линейный адрес по схеме, приведенной на рисунке.505Дескрипторы выбираются с помощью 16-битных селекторов,программно загружаемых в сегментные регистры; формат селекторовприведен на рисунке.Индекс совместно с индикатором таблицы TI позволяет выбратьдескриптор из локальной (TI=1) или глобальной (TI=0) таблицыдескрипторов.
Для неиспользуемых сегментных регистров предназначеннулевой селектор сегмента, формально адресующийся к самому первомуэлементу глобальной таблицы. Попытка обращения к памяти по такомусегментному регистру вызовет исключение. Исключение возникнет ипри попытке загрузки нулевого селектора в регистр CS или SS; ПолеRPL указывает требуемый уровень привилегий.Дескрипторы представляют собой 8-байтные структуры данных,исйЪльзуе-мые для определения свойств программных элементов(сегментов, вентилей и таблиц). Дескриптор определяет положениеэлемента в памяти, размер занимаемой им области (лимит), егоназначение и характеристики защиты. Все дескрипторы хранятся втаблицах, обращение к которым поддерживается процессоромаппаратно.Защита памяти с помощью сегментации не позволяет:— использовать сегменты не по назначению (например, пытатьсятрактовать область данных как коды инструкций);506— нарушать права доступа (пытаться модифицировать сегмент,предназначенный только для чтения, обращаться к сегменту, не имеядостаточных привилегий, и т.
п.);— адресоваться к элементам, выходящим за лимит сегмента;— изменять содержимое таблиц дескрипторов (то есть параметровсегментов), не имея достаточных привилегий.Защищенный режим предоставляет средства переключения задач.Состояние каждой задачи (значение всех связанных с ней регистровпроцессора) может быть сохранено в специальном сегменте состояниязадачи TSS, на который указывает селектор в регистре задачи TR. Припереключении задач достаточно загрузить новый селектор в регистрзадачи, и состояние текущей задачи автоматически сохранится в ее TSS,а в процессор загрузится состояние новой (возможно, ранее прерванной)задачи, и начнется (продолжится) ее выполнение.Четырехуровневаяиерархическаясистемапривилегийпредназначена для управления использованием привилегированныхинструкций и доступом к дескрипторам.