Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 32
Текст из файла (страница 32)
Нижеперечислены некоторые рекомендации по контролю передаваемых параметров.• Следует проверять счетчики циклов и повторений на минимальные и максимальные значения.• Необходимо проверить 8- и 16-разрядные параметры, передаваемые в 32-разрядных регистрах. Когда процедуре передается короткий параметр, его следуетрасширить знаковым разрядом или нулем для заполнения всего 32-разрядногорегистра.• Следует стремиться свести к минимуму время работы процессора с запрещенными прерываниями. Если процедуре требуется запрещать прерывания, необходимо, чтобы вызывающая программа не могла влиять на время нахожденияпроцессора с запрещенными прерываниями (флаг IF = 0).• Процедура никогда не должна воспринимать как параметр код или указательна код.• В операциях процессора следует явно задавать состояние флага направленияDF для цепочечных команд.Q Заключительная команда RET или RET n в процедуре должна точно соответствовать полю WC (Word Counter — счетчик слов) шлюза вызова; при этомп = 4 х WC, так как счетчик задает число двойных слов, а п соответствует байтам.аНе следует применять шлюзы вызовов для функций, которым передается переменное число параметров (см.
предыдущую рекомендацию). При необходимости нужно воспользоваться счетчиком и указателем параметров.QФункции не могут возвращать значения в стеке (см. предыдущую рекомендацию), так как после возврата стеки процедуры и вызывающей программы находятся точно в таком состоянии, в каком они были до вызова.uВ Процедуре следует сохранять и восстанавливать все сегментные регистры. Безэтого, если какой-либо сегментный регистр привлекался для адресации данных, недоступных вызывающей программе, процессор автоматически загрузитвнего пустой селектор.122Глава 4.
Особенности архитектуры микропроцессоров i80x86Рекомендуется контролировать все обращения к памяти. Нетрудно представить себеситуацию, когда РЬЗ-программа' передает PLO-процедуре указатель селектор -.смещение и запрашивает считать или записать несколько байтов по этому адресу. Типичным примером может служить процедура дискового ввода-вывода, которая воспринимает как параметр системный номер файла, счетчик байтов и адрес, по которомузаписываются данные с диска. Хотя PLO-процедура имеет привилегии для производства такой операции, у РЬЗ-программы разрешения на это может не быть.Система прерываний 32-разрядныхмикропроцессоров i80x86В микропроцессорах семейства i80x86 система прерываний построена таким образом, чтобы, с одной стороны, обеспечить возможность создавать эффективные и надежные мультипрограммные и мультизадачные операционные системы, которыедолжны функционировать в защищенном режиме, а с другой стороны, обеспечитьвозможность выполнять программы, разработанные для реального режима.
Рассмотрим вкратце оба режима.Работа системы прерываний в реальном режимеВ реальном режиме работы в системе прерываний используется понятие векторапрерывания, поскольку для указания адреса программы обработки прерыванияздесь требуется не одно значение, а два (значение для сегментного регистра кодаи значение для указателя команд), то есть мы имеем дело не со скалярной величиной, а с «векторной», состоящей из двух скалярных.Итак, каждый вектор прерывания состоит из четырех байтов, или двух слов: первые два содержат новое значение для регистра IP, а следующие два — новое значение для регистра CS. Таблица векторов прерывания занимает 1024 байт.
Таким образом, в ней может быть задано 256 векторов прерываний. В процессоре i8086 этатаблица располагается на адресах 00000H-003FFH. Расположение этой таблицыв процессорах i80286 и в более поздних определяется значением регистра IDTR(Interrupt Descriptor Table Register — регистр таблицы дескрипторов прерываний).При включении или сбросе процессора i80x86 этот регистр обнуляется. Однакопри необходимости можно в регистре IDTR указать смещение и таким образомперейти на новую таблицу векторов прерываний.Таблица векторов прерываний заполняется (инициализируется) при запуске системы, но, в принципе, может быть изменена или перемещена.Каждый вектор прерывания имеет свой номер, называемый номером прерывания,который указывает его место в таблице. Этот номер, помноженный на четыре (сдвигна два разряда влево и заполнение освободившихся битов нулями) и сложенныйс содержимым регистра IDTR, дает абсолютный адрес первого байта вектора прерываний в оперативной памяти.Программа, имеющая уровень привилегий 3.
Иначе говоря, работающая в кольце защиты с номеромс и с т е м а прерываний 32-разрядных микропроцессоров J80x861 23Подобно вызову процедуры прерывание заставляет микропроцессор сохранить встеке информацию для последующего возврата, а затем перейти к группе команд,адрес которых определяется вектором прерывания. Таким образом, прерываниевызывает косвенный переход к своей подпрограмме обработки за счет полученияее адреса из вектора прерывания.В IBM PC, как и в других вычислительных системах, прерывания бывают двухвидов: внутренние и внешние.Внутренние прерывания, как мы уже знаем, возникают в результате работы процессора в ситуациях, которые нуждаются в специальном обслуживании, или привыполнении специальных команд (INT, INTO).
Это следующие прерывания:О прерывание при делении на ноль (номер прерывания 0);• прерывание по флагу TF (Trap Flag — флаг трассировки) 1 обычно используется специальными программами отладки типа DEBUG (номер прерывания 1);Q прерывания, возникающие при выполнении команд INT (Interrupt — прерывание) и INTO (Interrupt if Overflow — прерывание по переполнению), называются программными.В качестве операнда команды INT указывается номер прерывания, которое нужновыполнить, например INT 10H.
Программные прерывания как средство переходана соответствующую процедуру были введены для того, чтобы выполнение этойпроцедуры осуществлялось в привилегированном режиме, а не в обычном пользовательском.Внешние прерывания возникают по сигналу какого-нибудь внешнего устройства.Существует два специальных внешних сигнала среди входных сигналов процессора, при помощи которых можно прервать выполнение текущей программы и темсамым переключить работу центрального процессора. Это сигналы NMI (No MaskInterrupt — немаскируемое прерывание) и INTR (Interrupt Request — запрос напрерывание).
Соответственно, внешние прерывания подразделяются на немаскируемые и маскируемые.Маскируемые прерывания генерируются контроллером прерываний по заявке определенных периферийных устройств2. Контроллер прерываний (его обозначение18259А) поддерживает восемь уровней (линий) приоритета; к каждому уровню«привязано» одно периферийное устройство3. Маскируемые прерывания частоназывают аппаратными прерываниями.23Флаг трассировки — специальный бит в регистре PSW (Program Status Word — слово состоянияпрограммы), который в случае равенства единице вызывает приостанов после каждой команды игенерирует прерывание для организации режима отладки с пошаговым выполнением программы.Чаще всего регистр PSW в микропроцессорах Intel 80x86 называют регистром ([шагов.Сигнал запроса на прерывание чаще всего является сигналом готовности внешнего устройства (соответствующего контроллера внешнего устройства) па выполнение следующей команды, связаннойсУправлением операциями ввода-вывода.качестве внешнего периферийного устройства, занимающего одну линию запроса на прерывание,Может быть использовано специальное управляющее устройство, которое позволяет разделять этусамую линию запроса между несколькими внешними устройствами.124Глава 4.
Особенности архитектуры микропроцессоров J80x86Как известно, прерывания могут быть инициированы внешним устройством ПЭВМили специальной командой прерывания из программы. В любом случае если прерывания разрешены, то выполняется следующая процедура.1. В стек помещается регистр флагов PSW.2. Флаг включения-выключения прерываний IF и флаг трассировки TF, находящиеся в регистре PSW, обнуляются для блокировки других маскируемых прерываний и исключения пошагового режима исполнения команд.3.