Компьютерные системы
Когда программа машинного уровня сталкивается с состоянием ошибки, например, с недействительным кодом команды, с командой или адресом данных, находящимися вне адресного пространства, тогда в процессе выполнения программы возникает сбой, называемый исключительной ситуацией. Поведение последней напоминает вызов процедуры, активизирующей обработчик исключительных ситуаций, — процедуру, входящую в операционную систему. Выполнение команды halt также должно запускать исключительную ситуацию. Обработка исключительных ситуаций является частью архитектуры системы команд для процессора. Вообще говоря, возникновение исключительной ситуации должно останавливать процессор в точке непосредственно перед командой ее вызывающей, или сразу за ней, в зависимости от типа исключительной ситуации. Очевидно, что все команды до точки возникновения исключительной ситуации должны быть выполнены, но ни одна из команд, следующих сразу за этой точкой, не должна никак влиять на состояние, видимое для программиста.
В конвейерной системе обработка исключительных ситуаций имеет определенные тонкости. Во-первых, исключительные ситуации могут одновременно запускаться многоадресными командами. Например, в ходе одного цикла конвейерного функционирования можно организовать такой порядок:
- память для хранения команд будет сообщать на этапе выборки адрес команды, выходящий за установленные рамки;
- память для хранения данных будет сообщать на этапе памяти адрес данных, выходящий за установленные рамки;
- управляющая логика будет сообщать недействительный код для команды на этапе декодирования.
Теперь необходимо определить, о какой из этих исключительных ситуаций процессор должен сообщить операционной системе. Основным правилом является установка приоритета самой дальней в конвейере исключительной ситуации, активизированной командой. В приведенном примере такой ситуацией будет адрес, выходящий за пределы адресного пространства, на который попытается выйти команда на этапе памяти.
Что касается программы машинного уровня, команда на этапе памяти, по идее, должна выполниться до запуска команд на этапах декодирования или выборки, и, следовательно, только об этой исключительной ситуации должно быть сообщено операционной системе. Вторая особенность возникает, когда команда выбирается, начинает выполняться, вызывает исключительную ситуацию и впоследствии отменяется из-за некорректно спрогнозированной ветви. В данной программе конвейер прогнозирует то, что ветвь выбираться не должна, поэтому он выберет и попытается использовать байт со значением Oxff в качестве команды (сгенерированный в компонующем автокоде с использованием директивы .byte).
Поэтому этап декодирования выявит исключительную ситуацию недействительной команды. Позже конвейер обнаружит, что ветвь отклоняется, поэтому команда в адресе 0х00е не должна даже выбираться. Управляющая логика конвейера отменит эту команду, однако в задачу входит необходимость избежать возникновения исключительной ситуации. Третья тонкость возникает из-за того, что конвейерный процессор обновляет различные части состояния системы на разных этапах. Команда, следующая за командой, вызывающей исключительную ситуацию, может изменить определенную часть состояния до завершения исключающей команды. Например, рассмотрим следующую кодовую последовательность, в которой предполагается, что пользовательские программы не получают доступ к адресам, превышающим ОхсООООООО.