Под архитектурой вычислительной машины понимается её организация с точки зрения программиста. Понятие архитектуры включает в себя такие особенности организации ЭВМ, как набор инструкций, типы данных, режимы адресации и пр. Специфическое устройство элементов аппаратуры, которые реализуют эти особенности, называется исполнением вычислительной машины. Любая заданная архитектура может быть реализована различными способами. Программа, которая может быть выполнена вычислительной машиной с одним исполнением данной архитектуры, должна выполняться вычислительными машинами с любым другим исполнением этой архитектуры.
Например, ЭВМ семейства VAX, такие как VAX-11/730, VAX-11/750, VAX-11/780 и др., представляют разные исполнения архитектуры VAX. Различные модели ЭВМ семейства VAX отличаются по стоимости и производительности. С изменением технологии появляются новые исполнения архитектуры VAX. Поскольку новые модели ЭВМ будут поддерживать ту же архитектуру, то на этих ЭВМ можно будет выполнять программы, разработанные для более ранних моделей.
В предыдущих главах были описаны те части архитектуры VAX, с которыми приходится сталкиваться при написании обычных пользовательских программ. В данной главе рассматриваются особенности архитектуры, используемые операционной системой. Кроме того, будет рассмотрена реализация некоторых элементов архитектуры. В главе обсуждаются такие понятия, как виртуальная память, кэш-память, системные привилегии, а также структура системных интерфейсов и физический уровень ввода-вывода.
С первых дней существования вычислительной техники память вычислительных машин разделялась на память с высоким и низким быстродействием. Наличие двух типов памяти объясняется тем, что память с низким быстродействием может быть на несколько порядков дешевле, чем быстродействующая память. С развитием технологии происходит замена памяти с низким быстродействием на новые варианты её исполнения, обладающие более высоким быстродействием. В настоящее время в большинстве вычислительных машин в качестве быстродействующей памяти применяется полупроводниковая память, а в качестве памяти с низким быстродействием - дисковые запоминающие устройства. Типичная вычислительная система на базе ЭВМ VAX-11/780 может иметь 8 Мбайт быстродействующей полупроводниковой памяти и 1000 Мбайт более медленной дисковой памяти. (С введением технологических улучшений оба типа памяти становятся всё более дешёвыми, поэтому объём памяти для типичных вычислительных систем будет увеличиваться.)
Как правило, быстродействующая, или основная память используется для запоминания работающих программ и данных, к которым эти программы активно обращаются. Более медленная, или внешняя память большой ёмкости применяется для хранения файлов программ и данных, сохраняемых для дальнейшего использования. Встречаются две трудности, усложняющие эту простую схему распределения памяти.
Первая состоит в том, что часто объём памяти, требуемый для больших задач, превышает имеющийся в наличии объём основной памяти. Одним из первых решений этой проблемы была организация оверлейных программ. Эго означает, что написанные специальным образом программы располагаются во внешней памяти и по частям загружаются в основную память для выполнения. После завершения выполнения одной программной секции в основную память вызывается другая программная секция, которая перекрывает область основной памяти, использованную первой секцией. Для повышения эффективности такого процесса программист должен тщательно разделить программу на отдельные секции, которые могли бы успешно выполняться, не требуя многочисленных обменов какого-либо рода между секциями. Некоторые первые попытки автоматизировать процесс организации перекрытия привели к созданию того, что теперь получило название виртуальная память.
Вторая трудность возникает при использовании вычислительных машин в мультипрограммном режиме. Для повышения эффективности работы вычислительной системы желательно иметь не одну, а несколько программ, одновременно загруженных в память. Если одна из программ находится в состоянии ожидания, что случается при выполнении довольно медленных операций ввода-вывода, то в это время может выполняться другая программа, время простоя процессора при этом сокращается. Например, устройство построчной печати может распечатывать 600 строк в минуту, или 10 строк в секунду. Пока одна программа ожидает завершения печати очередной строки, в другой программе может быть выполнено 100 тыс. и более инструкций. При осуществлении ввода-вывода с терминала в интерактивном режиме работы время ожидания ещё больше, и, пока пользователь решает, какой символ ему напечатать следующим, могут быть выполнены миллионы инструкций. Такое одновременное выполнение программ различных пользователей называется режимом разделения времени. Поэтому терминалы вычислительной системы, используемые в интерактивном режиме, часто называют терминалами, работающими в режиме разделения времени.
Как было рассмотрено в предыдущих главах, обычная программа пользователя занимает некоторое множество ячеек памяти. На ЭВМ семейства VAX программы обычно компонуются так, что располагаются в памяти, начиная с адреса ^X200. Если бы адреса программы являлись адресами реальной (физической) памяти, то возникла бы проблема. Невозможно иметь две разные программы, занимающие одну и ту же область памяти одновременно. Для решения этого на ЭВМ семейства VAX используется некая система отображения, позволяющая отображать адреса программы пользователя в некоторые другие адреса реальной памяти. Например, адреса программы ^X200, ^X201, ^X202, ... могли быть отображены в адреса ^X3C600, ^X3C601, ^X3C602, ... физической памяти ЭВМ семейства VAX. Поскольку программа другого пользователя могла бы иметь адреса ^X200, ... отображённые в другие адреса памяти ЭВМ семейства VAX, то здесь конфликта не возникает.
Алгоритм отображения адреса может быть достаточно простым. Один из способов состоит в использовании регистра смещения, который содержит значение смещения. Всякий раз при обращении программы к адресу значение смещения автоматически прибавляется к этому адресу для вычисления исполнительного адреса. В приведённом выше примере в регистре смещения могло бы находиться значение ^X3C400. Поэтому если программа обращается к адресу ^X202, то к нему прибавляется смещение ^X3C4C0 и производится выбор исполнительного адреса ^X3C602. Это сложение выполняется автоматически, поэтому в программе пользователя не требуется специально выполнять какие-либо действия. Что касается программы, то она запросила содержимое ячейки с адресом ^X202, а затем и получила содержимое ячейки с адресом ^X202. Для программы адрес ^X202 является явным "видимым" адресом. Такие адреса называются виртуальными, подобно виртуальному изображению, которое мы видим в зеркале. Адрес ^X202 - виртуальный адрес, а адрес ^X3C602 - реальный или абсолютный (физический) адрес. При выполнении другой программы в регистре смещения будет находиться другое значение, поэтому различным будет и отображение виртуальных адресов в реальные адреса.
Некоторые устаревшие вычислительные системы имели только один регистр смещения. Таким образом, все адреса программы отображались в некоторую непрерывную область реальной памяти. Существует проблема, связанная с тем, что не все программы занимают одинаковый объём памяти, а при завершении одной программы её место в памяти должно быть занято другой программой. В результате между программами могут образоваться неиспользуемые участки памяти. Это получило название фрагментации памяти. Одним из решений является страничная организация памяти. Например, память ЭВМ семейства VAX разбивается на страницы по 512 байтов. Для каждой страницы имеется регистр смещения. Каждая страница (или 512 байтов) виртуального адресного пространства программы может быть отображена в некоторую страницу реальной памяти. Страницы в реальной памяти размещаются необязательно непрерывно; размещение страниц в памяти осуществляется операционной системой с помощью специального алгоритма нахождения свободных страниц.
В добавление к проблемам отображения адресов и фрагментации памяти существует ещё проблема защиты памяти. Если несколько пользователей работают на ЭВМ в режиме разделения времени, решая свои несвязанные с другими пользователями задачи[1], то должен быть обеспечен способ защиты информации, находящейся в области памяти, выделенной одному пользователю, от попыток со стороны другого пользователя изменить или даже просто получить доступ к этой информации. Кроме того, должна быть защищена от изменения и/или доступа со стороны всех пользователей область памяти, зарезервированная для операционной системы.
Целиком весь процесс, включающий распределение памяти, отображение виртуальных адресов программы и реализацию защиты памяти, объединён под общим названием - управление памятью. В управлении памятью участвуют как технические, так и программные средства. Распределение памяти и загрузка программ в память требуют применения сложных алгоритмов и являются в основном функциями, реализованными программно. Для того чтобы программа могла выполняться с максимальной скоростью, процесс отображения адресов реализуется с помощью специальной аппаратуры. К техническим средствам системы управления памятью относятся такие устройства, как регистр или регистры смещения, а также сумматор, автоматически складывающий содержимое регистра смещения с каждым виртуальным адресом, формируемым программой. Кроме того, технические средства системы управления памятью обеспечивают защиту памяти, ограничивая или предотвращая доступ пользователей к определённым страницам.
Для того чтобы рассматриваемая система управления памятью была полной системой виртуальной памяти, необходима ещё и автоматическая смена страниц. В предыдущем разделе обсуждалось, как большие программы с оверлейной организацией могут по частям загружаться в память, перекрывая выделенную область памяти, или выгружаться из памяти, когда это необходимо. Также рассматривалось, как программа может разделяться на страницы, причём каждой странице отводится свой собственный регистр смещения. Эти два способа сочетаются в системе виртуальной памяти.
Для операционной системы VAX/VMS вместе со всеми выполняемыми в определённый момент времени программами пользователей требуется набор страниц памяти. Этот набор страниц можно представить себе как одну очень большую программу. В многопользовательской вычислительной системе обычно не хватает реальной памяти, чтобы одновременно загрузить в память все страницы. В результате необходим аппарат перекрытия или смены страниц, чтобы пользователи могли получать в основную память страницы своих программ.
В какой-то момент времени некоторые страницы набора могут на самом деле находиться в быстродействующей памяти. Ссылки к этим страницам преобразуются с помощью регистров смещения, описанных ранее. Страницы, не поместившиеся в памяти, размещаются на таких внешних запоминающих устройствах большой ёмкости, как магнитные диски. Если программа обращается к такой странице, то система управления памятью должна загрузить в реальную память страницу и занести в регистр смещения страницы соответствующее значение. Для того чтобы найти неиспользуемую страницу в основной памяти, системе управления памятью может потребоваться переслать некоторые другие страницы из основной памяти на внешнее запоминающее устройство большой ёмкости. Таким образом система виртуальной памяти обеспечивает смену страниц.
Например, программа во время выполнения обращается к различным ячейкам памяти. Если адреса этих ячеек относятся к странице, которая в текущий момент расположена в памяти, то производятся выборка или занесение информации по адресу, вычисляемому с помощью регистра смещения. Если требуемая страница отсутствует в памяти, то выполнение операций выборки или занесения прерывается. Эта ситуация называется прерыванием по отсутствию страницы (page fault). Когда происходит прерывание по отсутствию страницы, система управления памятью производит определённую последовательность действий для загрузки соответствующей страницы в память и инициализации её регистра смещения, чтобы можно было адресовать ячейки этой страницы.
При возникновении прерывания по отсутствию страницы соответствующая страница должна быть считана с внешнего запоминающего устройства большой ёмкости и помещена в основную, или реальную, память. Если в реальной памяти ещё имеются неиспользуемые страницы, то может быть назначена одна из этих страниц, но при большой загрузке вычислительной машины, по всей вероятности, неиспользуемых страниц в основной, или реальной, памяти может и не быть. Это означает, что система управления памятью должна найти страницу и предоставить её программе. Чтобы сделать это, операционная система применяет некоторый алгоритм для выбора страницы, которая, вероятно, не потребуется в ближайшее время. Выбранная страница выделяется программе. Однако, перед тем как выделить страницу, операционная система сохраняет старое содержимое страницы на внешнем запоминающем устройстве большой ёмкости, так что сохранённая страница несколько позже может быть возвращена обратно той программе, к которой она относится. Затем с внешнего запоминающего устройства большой ёмкости считывается требуемая страница и помещается на выделенную страницу памяти. Соответствующий регистр смещения инициализируется так, чтобы можно было адресовать эту страницу, и страница помечается как доступная. После этого управление возвращается программе, которая была прервана по отсутствию страницы.
Рассмотрим специфический пример, иллюстрирующий работу виртуальной памяти при выполнении программы. При загрузке программы загрузчик определяет, сколько памяти требуется для программы[2] . Если диапазон адресов программы ограничен ^X200 - ^X21FF, то программа занимает ^X2000 = 8192 байтов, или ^X10, иначе - 16 страниц памяти. Отметим, что это является распределением виртуальной памяти, поскольку не гарантируется какое-либо частное распределение страниц реальной памяти. В связи с тем, что виртуальные страницы могут пересылаться в реальную память и обратно, на запоминающем устройстве большой ёмкости сохраняется самая последняя копия содержимого 16 страниц.
Предположим, что во время выполнения программы пользователь попытался обратиться к содержимому ячейки памяти с адресом ^X8C4. Возможно, что в программе выполняется инструкция MOVL A,R0 и оказалось, что символическому адресу A соответствует адрес ^X8C4. Предположим далее, что страница, содержащая ячейку с адресом ^X8C4, была выгружена из памяти на внешнее запоминающее устройство большой ёмкости или страница просто ещё не была загружена. В любом случае в реальной памяти нет страницы, назначенной для виртуальных адресов в диапазоне ^X800 - ^X9FF. В итоге при выполнении инструкции MOVL A,R0 произойдёт прерывание по отсутствию страницы, для обработки которого управление будет передано операционной системе.
Поскольку адрес ^X8C4 является допустимым для данной программы, операционная система должна найти страницу реальной памяти. Операционная система с помощью какого-то алгоритма (алгоритм будет рассмотрен позже) может принять решение, что страница реальной памяти, начинающаяся с адреса ^X000A3C00, подходит для того, чтобы выделить её программе. Весьма вероятно, что страница уже используется, может быть данной программой, или может быть какой-либо другой.
Предположим, что страница реальной памяти, начинающаяся с адреса ^X000A3C00, была назначена виртуальной странице некоторой программы. Тогда перед тем, как страница реальной памяти может быть использована, её содержимое должно быть сохранено на внешнем запоминающем устройстве большой ёмкости. Как только старое содержимое страницы сохранится, страница памяти становится доступной.
Для того чтобы обработка прерывания по отсутствию страницы была завершена, требуемая информация должна быть загружена с внешнего запоминающего устройства большой ёмкости на доступную теперь страницу памяти. В данном примере страница информации, находящаяся на внешнем запоминающем устройстве большой ёмкости, могла быть скопирована на страницу памяти, начинающуюся с адреса ^X000A3C00. Регистр смещения страницы для данной программы устанавливается так, чтобы отобразить виртуальную страницу с адресом ^X800 на страницу реальной памяти, начинающуюся c адреса ^X000A3C00. В то же время регистр смещения страницы для предыдущей программы должен быть установлен так, чтобы показать, что страница предыдущей программы больше не существует в реальной памяти. Операционная система может затем вернуть управление рассматриваемой программе, и инструкция MOVL A,R0 может быть выполнена успешно.
Не приходится и говорить, что процесс обмена страниц может стать достаточно сложным. Рассмотрим, например, такую инструкцию, как ADDL3 A,B,C. Для выполнения этой инструкции процессор должен обратиться к четырём данным - к самой инструкции, а также её операндам A, B и C. Поскольку все эти четыре элемента могут находиться на несуществующей в реальной памяти странице, во время выполнения инструкции может произойти ряд прерываний по отсутствию страницы.
В действительности ситуация сложнее, чем кажется. Например, если операнд A, имеющий формат длинного слова, расположен по виртуальному адресу ^X9FE, то одна половина длинного слова находится на одной странице, а его вторая половина - на другой. В результате обращение к операнду A может в худшем случае вызвать два прерывания по отсутствию страницы. Аналогичная ситуация возникает и когда сама инструкция пересекает границу страницы. Прерывание по отсутствию страницы может произойти при выборке инструкции. В любом случае создание системы виртуальной памяти, работающей корректно и эффективно, - чрезвычайно сложная задача, включающая разработку технического и программного обеспечения.
В предыдущем разделе был упомянут алгоритм для выбора страницы, выгружаемой на внешнее запоминающее устройство большой ёмкости при возникновении прерывания по отсутствию страницы. Когда принимается решение о том, какая страница должна быть выгружена, важно выбрать страницу, которая вряд ли потребуется сразу. Неудачный подбор страниц для выгрузки может привести к тому, что при выполнении каждой инструкции будет происходить прерывание по отсутствию страницы. Эта ситуация может отразиться на выполнении программы; выполнение будет настолько медленным, как если бы внешнее запоминающее устройство большой ёмкости выступало в роли основной памяти.
Идеальным выбором страницы, предназначенной для выгрузки, могла быть страница памяти, которая не понадобится ещё долгое время. К сожалению, это невозможно предсказать в масштабе реального времени. Поэтому алгоритмы базируются на эвристических методах. Одним из таких алгоритмов является алгоритм выбора дольше всего не использовавшейся страницы. Предположение строится на том, что если страница давно не использовалась, то вряд ли она потребуется в ближайшее время. Могут быть случаи, когда это предложение не оправдывается, но в среднем посылка правильная. Однако этот алгоритм весьма дорогой как с точки зрения технических средств, так и программного обеспечения. Для определения того, какая страница давно не использовалась, может потребоваться, чтобы каждый регистр страницы имел таймер, автоматически устанавливающийся при очередном обращении к странице. Кроме того, должен осуществляться поиск регистра страницы с наиболее ранней установкой таймера.
Один простой алгоритм для выбора выгружаемой страницы состоит в том, что производится случайный выбор. Другой простой алгоритм основан на последовательном выборе страниц. Практически простой алгоритм может быть не намного хуже более сложного и дорогого алгоритма. (Следует отметить, что простые алгоритмы могут быть улучшены, если повысить вероятность предпочтительного выбора страниц программ с меньшим приоритетом.)
Основная цель организации виртуальной памяти, описанной в предыдущих разделах, состоит в том, что доступная программе память может быть значительно увеличена за счёт обмена страниц между дорогой быстродействующей основной памятью и более медленной и дешёвой дисковой памятью. При соответствующем использовании программа может выполняться в системе виртуальной памяти с подкачкой страниц так же быстро, как если бы она выполнялась, находясь целиком в основной памяти. Возникает вопрос, может ли быть сделана подобная оценка при сравнении основной памяти и более дорогой сверхоперативной памяти. Эффект мог быть почти таким же, как если бы программа выполнялась в более быстрой памяти.
Действительно, такая система памяти может быть реализована; она получила название кэш-памяти или быстродействующей буферной памяти. Кэш-память состоит из быстродействующих элементов памяти и имеет блочную организацию. Блоки кэш-памяти называются фреймами (чтобы отличать их от страниц виртуальной памяти). Обычно фреймы меньше, чем страницы. В зависимости от исполнения размер фрейма может изменяться от десятков до сотен байтов. В противоположность этому длина страницы может изменяться от сотен до тысяч байтов.
По мере того как информация из основной памяти используется программой, в кэш-память загружаются фреймы с этой информацией. Поэтому, если требуются другие данные из загруженного фрейма, они считываются уже из кэш-памяти; таким образом сокращается время доступа. Когда программа записывает информацию в память, то она заносится и в кэш-память, и в основную память, так что позже будет доступна из любой памяти этих двух типов. Это называется сквозной записью.
В то время как основная память может быть на несколько порядков быстрее, чем дисковая память, кэш-память быстрее основной памяти только в несколько раз. В результате нужны быстрые и простые алгоритмы загрузки фреймов, сквозной записи, выбора фрейма для перезаписи и прежде всего для определения, имеются ли данные в кэш-памяти. Эти алгоритмы должны быть реализованы непосредственно аппаратурой, поскольку прерывание выполнения программ и обработка прерываний программными средствами могут свести на нет любое преимущественное быстродействие. При такой реализации применение кэш-памяти может повысить быстродействие вычислительной машины в 2 - 3 раза.
В предыдущем разделе рассматривались основные принципы организации управления памятью, виртуальной адресации, виртуальной памяти и кэш-памяти. Эти принципы организации не являются свойственными исключительно ЭВМ семейства VAX, они могут быть отнесены ко многим разработкам вычислительных машин. В данном разделе будут рассмотрены некоторые подробности того, как осуществляется управление памятью на ЭВМ семейства VAX. Изучение управления памятью включает как особенности архитектуры, которые одинаковы для всех моделей ЭВМ семейства VAX, так и особенности исполнения, которые могут отличаться для различных моделей. Например, тогда как старшие модели ЭВМ семейства VAX имеют большую кэш-память, младшие модели семейства имеют маленькую кэш-память или не имеют её вовсе. Поскольку охватить все особенности конкретных моделей достаточно трудно и изложение было бы долгим, в этой главе мы ограничимся обсуждением только особенностей, свойственных большинству или всем моделям ЭВМ семейства VAX.
Одной из особенностей организации виртуальной памяти на ЭВМ семейства VAX является деление виртуального адресного пространства на области. Виртуальное адресное пространство на ЭВМ VAX составляет 4 Гбайта. Это виртуальное пространство разбивается на страницы, имеющие такую же длину, как блоки или физические записи на диске. Фирма DEC стандартизовала длину блока, сделав её равной 512 байтам, или 1/2 Кбайта. Для того чтобы отобразить всю виртуальную память, потребовалось бы приблизительно
4 Гбайта/0,5 Кбайт на страницу = 8 млн. страниц
или
8 млн. длинных слов (элементов в таблице страниц).
Эти 8 млн. элементов в таблице страниц, имеющих формат длинного слова, могут занять 8 × 4 = 32 Мбайта памяти. Это не только намного больше того объёма реальной памяти, который имеют большинство ЭВМ семейства VAX, но и превышает максимальный объём памяти, которая может быть установлена на многих моделях ЭВМ семейства VAX. Невозможно сохранять всю информацию об отображении виртуальных адресов в реальной памяти. Однако, по счастью, большинство приложений имеют более скромные требования к памяти. В любом случае таблицы страниц памяти для программ пользователей в действительности хранятся в виртуальной памяти. Это позволяет разбивать на страницы и сами таблицы страниц.
Для того чтобы упростить нахождение смещения для страницы и других её атрибутов[3], вся такого рода информация, относящаяся к странице, сохраняется в непрерывных таблицах с последовательной организацией. Элемент в таблице страниц может быть найден с помощью прямой индексации, индексом элемента в таблице служат старшие биты виртуального адреса. В простейшем виде это могло ограничить программу использованием множества последовательных виртуальных адресов, начинающихся с адреса ^X00000000. Для большей гибкости, чтобы можно было иметь дело с фиксированными системными областями, а также с такими заранее не определёнными параметрами, как длина программы и стека, 4 Гбайта виртуального адресного пространства разделяются на две области - по 2 Гбайта каждая, называемые пространством процесса и пространством системы. Пространство процесса занимает диапазон виртуальных адресов ^X00000000 - ^X7FFFFFFF. Пространство системы занимает оставшуюся часть виртуального пространства, начинающуюся с адреса ^X80000000 и оканчивающуюся адресом ^XFFFFFFFF. Однако в системах VAX последнего поколения используется только первая половина пространства системы, т.е. ограниченная диапазоном адресов ^X8000000 - ^XBFFFFFFF. Пространство системы отводится для постоянно находящихся в памяти системных подпрограмм, области стека для системных подпрограмм, а также функций ввода-вывода, описанных в этой главе ниже. Хотя пользователи при обращении к некоторым системным подпрограммам могут иметь доступ с правом на чтение, эта область защищается от пользователей по записи.
Пространство процесса выделяется для каждого процесса пользователя или, иначе, множества выполняемых программ. Таблица страниц необходима для каждой области, выделенной для процесса пользователя. При передаче управления от одного процесса пользователя к другому происходит переключение таблиц страниц. Переключение таблиц страниц является частью того, что называется переключением контекста, и будет описываться далее.
Одна из проблем, возникающая, когда пользователю выделяется непрерывная область памяти, состоит в том, что объём памяти, требуемый программе, может во время её выполнения увеличиваться. На ЭВМ семейства VAX эта проблема решается добавлением дополнительной области для увеличения памяти к концу программы, так что общее пространство памяти, необходимое программе, остаётся непрерывным при её увеличении.
В то время как требуемая программе память увеличивается по мере увеличения адресов памяти, увеличение области стека, интенсивно используемой в программах на ЭВМ семейства VAX, происходит по направлению "вниз" - в сторону младших адресов памяти, Для разрешения этой проблемы на ЭВМ семейства VAX пространство процесса также разделяется на две области. Первая называется пространством P0 или областью программы и используется в основном для программ и данных. Вторая называется пространством P1 или областью управления и предназначается в основном для организации стека и для некоторых системных функций, связанных с обслуживанием программ пользователя. Пространство P0 начинается с виртуального адреса ^X00000000 и кончается адресом ^X3FFFFFFF. Это пространство является отображающимся пространством, заданным в таблице страниц, начиная с адреса ^X00000000 и выше. Если в программе пользователя происходит обращение к адресу, принадлежащему пространству P0, но оказавшемуся старше любого отображаемого в таблице страниц адреса, произойдёт прерывание по отсутствию страницы. Если операционная система решает, что программа имеет право на большее пространство, то таблица страниц расширяется и программе выделяются дополнительные страницы виртуальной памяти.
Поскольку по мере занесения информации в стек значение указателя стека уменьшается, отображение пространства P1 противоположно пространству P0. Пространство P1 начинается с виртуального адреса ^X40000000 и кончается адресом ^X7FFFFFFF, но выделение памяти из этого пространства происходит в обратном направлении - в сторону уменьшения адресов памяти выделяется столько, сколько необходимо для стека.
Для того чтобы ускорить преобразование виртуальных адресов в реальные адреса, применяется быстродействующее устройство памяти, называемое буфером трансляции. Буфер трансляции предназначен для хранения наиболее часто используемых адресов. Работа этого быстродействующего устройства памяти для процесса трансляции адресов аналогична работе кэш-памяти. Так же как и кэш-память, буфер трансляции является весьма дорогой частью аппаратуры ЭВМ и может быть включен или отсутствовать в различных моделях ЭВМ семейства VAX. Однако, подобно кэш-памяти, наличие буфера трансляции прозрачно для программиста, т.е. является для него скрытым. Программист не может сказать, имеет ли ЭВМ кэш-память или буфер трансляции, наличие этих устройств отражается только на увеличении скорости выполнения программы.
Особенностью внутреннего устройства, присущей в различной форме как кэш-памяти, так и буферу трансляции является ассоциативная память. Обычная память с произвольной выборкой информации имеет дешифратор адреса, который преобразует адрес так, чтобы можно было выбрать одну из N ячеек памяти. Например, память объёмом 4 млн. длинных слов могла бы иметь дешифратор адреса, который позволил бы выбрать одну ячейку памяти из 4 млн. ячеек. Дешифратор работает так просто потому, что число ячеек памяти в точности соответствует числу возможных доступных адресов.
Напротив, ассоциативная память имеет относительно небольшое число ячеек, которые соответствуют адресам из значительно большего адресного пространства. Это означает, что адресов намного больше, чем ячеек этой памяти. Как следствие, некоторые адреса не соответствует какой-либо ячейке. Иначе говоря, не существует полного отображения адресов к ячейкам памяти.
Это такая же ситуация, которая возникает и с буфером трансляции, поскольку ограниченный объём буфера позволяет вместить только наиболее часто используемые адреса. Если бы буфер трансляции был реализован программно, алгоритм поиска требовал бы включения многочисленных сравнений. Такой поиск был бы медленным и буфер трансляции не оправдал бы своего назначения. Для решения данной проблемы буфер трансляции адреса страницы реализуется аппаратно с помощью большого числа параллельно работающих электронных схем сравнения, обеспечивая высокую скорость доступа к хранимым данным. Буфер (или память), реализованный с помощью параллельных схем сравнения для выполнения очень быстрого поиска, называется ассоциативной памятью. Методы проектирования ассоциативной памяти применяются при разработке разнообразных частей больших вычислительных машин, включая в том числе буферы трансляции адреса страницы и кэш-память.
Когда пользователь начинает сеанс работы с системой, ему для выполнения программ выделяются ресурсы. Выполнение программ включает выполнение не только программ пользователя, но и любых системных программ, вызываемых командами операционной системы, такими как COPY, DELETE, MACRO, LINK и т.д. Любая выполняющаяся по команде пользователя программа называется процессом пользователя. Что касается операционной системы, то она обслуживает ряд процессов. Некоторые их этих процессов являются процессами пользователей, некоторые являются системными процессами. Для каждого процесса необходимы следующие ресурсы вычислительной машины:
Перечисленные ресурсы называются контекстом процесса и выделяются персонально для каждого пользователя.
Очевидно, ячейка виртуальной памяти с адресом ^X8E4 одной программы - это совсем иная ячейка, чем ячейка виртуальной памяти ^X8E4 какой-либо ещё программы. Каждая программа должна иметь своё собственное отображение виртуальных адресов, так чтобы каждая программа имела доступ к различным адресам реальной памяти. Аналогично одна программа использует регистры R0, R1 и т. д., и те же регистры используют другие программы, выполняющиеся в то же самое время. При переключении операционной системой управления между различными процессами операционная система для данного процесса должна загрузить в регистры R0, R1 и т.д. корректные значения и установить регистры - указатели таблиц страниц и регистры длины таблиц страниц (определяющие местонахождение и длину таблиц страниц пространства P0 и P1), чтобы задать соответствующие назначения виртуальных адресов для этого процесса. Все значения сохраняются в системной области памяти, а операция сохранения контекста и загрузки другого называется переключением контекста. ЭВМ семейства VAX имеют инструкции, позволяющие эффективно реализовывать переключение контекста.
Поскольку переключение контекста или любая операция, включающая отображение памяти или другие системные функции, может оказать влияние на всех пользователей, эти операции могут выполняться только привилегированными программами. Различного рода защита и привилегии, имеющиеся на ЭВМ семейства VAX, обсуждаются далее в данной главе.
а. |
Оверлей. |
б. |
Виртуальный адрес. |
в. |
Виртуальная память. |
г. |
Кэш-память. |
д. |
Страница. |
е. |
Фрейм. |
ж. |
Контекст процесса. |
|
|
В любой многопользовательской системе для исключения случайного или преднамеренного влияния пользователей друг на друга должны быть различные системы защиты. В то же время, для хорошо отлаженных системных процессов необходимо дать возможность превышать защиту и другие ограничения, так чтобы они могли выполнять такие действия, как загрузка и выгрузка процессов пользователей, или даже позволять процессам пользователей взаимодействовать между собой.
Для того чтобы упростить разделение привилегий, которые может иметь программа, по группам, на ЭВМ семейства VAX имеются четыре уровня привилегий, действие которых проявляется при выполнении программы. Эти уровни привилегий называются режимами доступа, поскольку они предназначены для контроля за тем, к какого рода операциям программа имеет доступ. Ниже перечислены режимы доступа в порядке снижения старшинства:
Как уже отмечалось, в длинных словах смещения страницы имеются некоторые дополнительные биты, применяемые для защиты памяти. Отдельные страницы могут использоваться беспрепятственно, другие могут быть открыты для чтения, но защищены от записи, а к третьим вовсе может быть запрещён доступ. Эта организация защиты распространяется на все режимы доступа, так что для различных режимов могут существовать и различные типы защиты. Таким образом, для любой страницы возможно установить биты защиты так, чтобы программы, выполняющиеся в режиме пользователя, не имели к ней доступа, программы, выполняющиеся в режиме супервизора, имели доступ по чтению, а программы, выполняющиеся в режимах управления и ядра, имели доступ по чтению и записи. Отметим, что режимы доступа образуют строгую иерархию. Поэтому программа, выполняющаяся в старших режимах, имеет доступ любой привилегии младших режимов доступа. Если программа в режиме пользователя имеет доступ к странице по чтению, то и все программы в старших режимах доступа могут иметь такой доступ. Привилегия доступа по записи подразумевает наличие привилегии доступа по чтению. В табл. 14.1 показано, как используются биты 27 - 30 элемента таблицы страниц для задания прав доступа к странице для различных режимов доступа. Обратите внимание! В таблице нет ни одной записи, которая бы позволила программам, выполняющимся в младших режимах доступа, иметь большее право доступа, чем программам, выполняющимся в старших режимах.
|
Режимы |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Код |
Ядра |
Управления |
Супервизора |
Пользователя |
|||||||||
0000 |
нет |
нет |
нет |
нет |
|||||||||
0001 |
------------------------------- не используется ------------------------------- |
||||||||||||
0011 |
Чт/Зап |
только Чт |
нет |
нет |
|||||||||
0100 |
только Чт |
нет |
нет |
нет |
|||||||||
0101 |
Чт/Зап |
Чт/Зап |
Чт/Зап |
Чт/Зап |
|||||||||
0110 |
Чт/Зап |
Чт/Зап |
нет |
нет |
|||||||||
0111 |
Чт/Зап |
только Чт |
нет |
нет |
|||||||||
1000 |
Чт/Зап |
Чт/Зап |
Чт/Зап |
нет |
|||||||||
1001 |
Чт/Зап |
Чт/Зап |
только Чт |
нет |
|||||||||
1010 |
Чт/Зап |
только Чт |
только Чт |
нет |
|||||||||
1011 |
только Чт |
только Чт |
только Чт |
нет |
|||||||||
1100 |
Чт/Зап |
Чт/Зап |
Чт/Зап |
только Чт |
|||||||||
1101 |
Чт/Зап |
Чт/Зап |
только Чт |
только Чт |
|||||||||
1110 |
Чт/Зап |
только Чт |
только Чт |
только Чт |
|||||||||
1111 |
только Чт |
только Чт |
только Чт |
только Чт |
|||||||||
|
Кроме того, что режимы доступа влияют на доступ к памяти, они также влияют и на использование инструкций. Например, резервные инструкции для чтения и записи содержимого регистра управления процессора и для загрузки или сохранения контекста процесса могут выполняться только в режиме ядра. Любая попытка выполнить эти инструкции в любом другом режиме вызовет прерывание по резервной инструкции. Резервные инструкции являются инструкциями, которые для своего использования требуют специальных привилегий.
Операционная система VAX/VMS устроена так, что операции разного рода выполняются в различных режимах доступа. Следующий список даёт представление об использовании режимов доступа.
Режим |
Применение |
---|---|
Пользователя |
Программы пользователей, утилиты, компиляторы, отладчики |
Супервизора |
Интерпретатор командного языка |
Управления |
Вызов системных сервисных подпрограмм и функций подсистемы RMS |
Ядра |
Управление страницами виртуальной памяти, планирование процессов, физический уровень ввода-вывода |
Инструкция PROBE позволяет программе проверить допустимость выполнения операций, связанных с обращением к памяти, перед выполнением этих операций. Имеется ряд соображений, почему такая проверка может оказаться полезной. Во-первых, это защита операционной системы. Программа пользователя может вызывать процедуры подсистемы управления записями (RMS), которые выполняются в более привилегированном режиме, таком как режим управления. Программа пользователя может в качестве аргументов передавать некоторые адреса. Предположим, что данные находящиеся по этим адресам, были защищены от доступа в режиме пользователя, но не от доступа в режиме супервизора. Тогда процедуры подсистемы RMS могли бы успешно осуществить запрещённый для программы пользователя доступ при их вызове этой программой.
Для защиты от подобных действий более привилегированной процедуре следует проверить все адреса, передаваемые в качестве аргументов, при её вызове из менее привилегированной программы, чтобы сделать нечто такое, в результате чего менее привилегированная программа имела бы разрешенный для неё доступ при обращении к этим адресам.
Имеется две инструкции PROBE. Одна инструкция служит для проверки права доступа по чтению (PROBER), а другая - для проверки права доступа по записи (PROBEW). Данные инструкции имеют три аргумента:
Аргумент "Режим доступа" определяет, какой режим доступа должен быть проверен:
ЭВМ семейства VAX сохраняют информацию о предыдущем режиме, когда вызов программы с более привилегированным режимом изменяет режим доступа. Инструкции PROBE определяют, какой из режимов более привилегированный: указанный в инструкции или предыдущий режим. Отметьте, что режимы со старшими номерами являются менее привилегированными.
Базовый адрес и длина позволяют специфицировать массив байтов. Однако контролируется только первый и последний адреса, так что массив, занимающий больше чем две страницы, следует проверить по частям.
Например, инструкция
PROBER #3,#50,A
могла бы использоваться для контроля того, имеет ли программа пользователя право на доступ по чтению 50 байтов, начинающихся с адреса A. Аналогично инструкция
PROBEW #3,#4,B
могла бы проконтролировать, имеет ли программа пользователя право на доступ по записи для обращения к длинному слову с адресом B. Для любой из этих инструкций бит Z применяется для проверки права на доступ. Если бит Z = 1, доступ является запрещённым; если бит Z = 0, доступ разрешён. Поэтому после инструкций PROBE для завершения проверки следует поместить инструкцию типа
BEQL NO_ACCESS
или
BNEQ ACCESS_LEGAL
Отметим, что здесь было сделано несколько допущений. Первое: доступ по записи предполагает наличие доступа по чтению, а запрет на чтение предполагает запрет по записи. Второе: режим #3, или режим пользователя, является наименее привилегированным. Поэтому предыдущие инструкции PROBE проверяли права режима доступа пользователя, невзирая на значение предыдущего режима.
Кроме 16 регистров общего назначения процессора (R0, R1, ...) на ЭВМ семейства VAX имеется ряд регистров специального назначения. Эти регистры служат для управления внутренней работой ЭВМ семейства VAX. В их число входят такие регистры, как указатели таблиц страниц виртуальной памяти. Отметим, что, поскольку большинство из этих регистров доступны только программам, выполняющимся в режиме ярда, здесь будут рассмотрены только наиболее общие принципы их использования. Помимо упомянутых регистров имеются некоторые регистры, использование которых отличается на разных моделях ЭВМ; такие регистры могут быть у одних моделей ЭВМ, но отсутствовать у других.
Один регистр должен быть упомянут специально, он называется длинное слово состояния процессора PSL. Этот регистр содержит поля битов, в которые заносится информация различного рода о состоянии выполняющегося процесса. Например, два бита определяют уровень доступа процесса 0, 1, 2 или 3 для режима ядра, управления, супервизора или пользователя соответственно. Ещё 2 бита сохраняют информацию о предыдущем режиме, данная информация использовалась инструкциями PROBE. Ещё 4 бита содержат коды условий - биты N, С, Z и V.
При выполнении программы биты регистра PSL изменяются. Например, любая инструкция, оказывающая влияние на коды условий, будет заносить информацию в поле битов кодов условий. Чтобы изменить режим доступа, необходимо занести в регистр PSL соответствующую информацию. И, конечно, для этого требуются некоторые привилегии. Однако можно прочитать содержимое регистра PSL с помощью инструкции MOVPSL. По инструкции MOVPSL содержимое регистра PSL копируется в указанное длинное слово. Инструкцию MOVPSL можно применять для определения текущего или предыдущего режима доступа, а также для получения некоторой другой информации о состоянии процессора. В приведённом ниже списке показано назначение отдельных битов регистра PSL, более подробную информацию можно получить в книге "VAX Architecture Handbook".
Биты |
Назначение |
---|---|
0 |
Бит С |
1 |
Бит V |
2 |
Бит Z |
3 |
Бит N |
4 |
Бит трассировки, может использоваться для эмуляции пошагового выполнения программы при отладке |
5 |
Бит разрешения прерывания по переполнению целого числа |
6 |
Бит разрешения прерывания по потере значимости числа с плавающей точкой |
7 |
Бит разрешения прерывания по переполнению десятичного числа |
8-15 |
Должны содержать 0 |
16-20 |
Уровень приоритета прерывания |
21 |
Должен содержать 0 |
22-23 |
Предыдущий режим работы процессора |
24-25 |
Текущий режим работы процессора |
26 |
Флаг стека прерываний |
27 |
Флаг выполнения первой части инструкции; некоторые инструкции, занимающие при выполнении много времени, могут быть прерваны на середине (признак неоконченного выполнения) |
28-29 |
Должны содержать 0 |
30 |
Бит задержки трассировки |
31 |
Бит режима совместимости, если он установлен, то процессор будет выполнять инструкции ЭВМ серии PDP-11 |
Отметим, что младшие 16 битов (биты 0-15) не содержат привилегированной информации и поэтому могут быть модифицированы программой пользователя (за исключением битов 8-15, которые не используются и всегда должны иметь значение 0). Младшие 16 битов иногда называются словом состояния процессора PSW. Младшие 8 битов PSW могут модифицироваться; установка и сброс этих битов осуществляются с помощью инструкций BISPSW или BICPSW. Например, инструкция
BISPSW #^X20
устанавливает бит разрешения прерывания по переполнению целого числа. Если затем какая-либо инструкция программы установит при выполнении бит V, то прерывание по переполнению целого числа приведёт к прекращению выполнения программы и будет выдано сообщение об ошибке. Установка этого бита может помочь при определении корректности целочисленных вычислений, но может и создать проблему для каких-либо программ, в которых используются арифметические операции над целыми числами без знака.
Для ускорения обмена между программами с различными привилегиями и помощи операционной системе в организации защиты в системе имеется пять различных стеков. Этими стеками являются: стек режима пользователя, стек режима супервизора, стек режима управления, стек режима ядра и стек прерываний. Подразумевается, что имеется также пять регистров указателей стека. При работе в одном из режимов доступа, всякий раз когда инструкция обращается к регистру SP явным или не явным образом, используется соответствующий режиму указатель стека. Выбор первых четырёх указателей стека определяется текущим режимом доступа. Указатель стека прерываний используется, если установлен бит 26 регистра PSL. Обычно программа может получить доступ только к своему собственному указателю стека - стеку режима пользователя. Тем не менее имеются две инструкции MTPR и MFPR (переслать в регистр процессора и переслать из регистра процессора), которые позволяют программам, выполняющимся в режиме ядра, получить доступ ко всем пяти регистрам-указателям стека.
Эти инструкции также используются для доступа к регистрам базы и длины, которые определяют таблицы страниц виртуальных адресов для пространства P0, пространства P1 и пространства системы. Кроме того, существует ещё целый ряд регистров, к которым можно получить доступ с помощью этих инструкций. Чтобы узнать, какие регистры имеет конкретная модель ЭВМ семейства VAX, читатель должен обратиться к книге "VAX Architecture Handbook".
Системный интерфейс типа шина представляет собой совокупность электрических проводников, используемых для подключения к процессору вычислительной машины его памяти, а также периферийных устройств. Обычно шину составляет большое число проводников - линий связи, для каждого передаваемого или принимаемого бита информации выделяется своя линия. Это позволяет обеспечивать одновременную передачу всех битов информации, что намного быстрее, чем передача информации по одному биту, осуществляемая по одной линии, как делается в системах последовательной передачи данных. Процессор передаёт по шине адрес и управляющую информацию, а устройство памяти или периферийное устройство, которое опознает этот адрес, в ответ будет передавать или принимать данные по линиям данных шины.
Обычно даже простейшие ЭВМ имеют несколько различных шин. Однако наличие некоторых шин может быть прозрачно для пользователя, т.е. скрытым от него. Например, процессор ЭВМ семейства VAX имеет внутреннюю шину, соединяющую между собой регистры процессора. Такие шины могут быть полностью размещены на одной печатной плате или даже находиться внутри одной микросхемы.
С другой стороны, имеются шины, предназначенные для передачи данных между различными частями вычислительной системы. Пользователям важно немного знать об этих шинах, поскольку они влияют на конфигурацию системы и на использование периферийных устройств. Разные модели ЭВМ семейства VAX имеют ряд шин различного рода. Большинство ЭВМ семейства VAX имеют несколько шин различного назначения. В следующих разделах будут кратко описаны шины, применяемые в ЭВМ семейства VAX, а также будет показано, как они используются в различных моделях ЭВМ VAX.
Процессоры старших моделей ЭВМ семейства VAX, таких как VAX-11/780, VAX-11/782 и VAX-11/785, подключаются к памяти и к некоторым контроллерам периферийных устройств посредством высокоскоростной синхронной шины, называемой синхронной магистралью межблочных соединений или шиной SBI. Работа синхронной шины синхронизируется тактовыми импульсами, и все устройства, подключённые к шине, должны быть способны ответить на запросы в строго определённом интервале времени. Для шины SBI период повторения тактовых импульсов составляет 200 нс (1 нс = 10-9 с). Шина обеспечивает одновременную передачу 32 битов информации, кроме того, возможна и двойная передача информации, которая позволяет передавать по одному адресу две посылки по 32 бита каждая. Это повышает скорость передачи шины SBI и даёт номинальную скорость передачи 13,3 млн. байтов/с.
Высокоскоростная синхронная шина, такая как SBI, может использоваться только на очень коротком расстоянии и только для подключения устройств, способных работать со скоростью синхронной передачи. Если скорость устройств различается, то синхронная шина должна работать со скоростью самого медленного подключённого к шине устройства. Для разрешения этой проблемы могут применяться асинхронные шины. Асинхронные шины соединяют устройства, которые отвечают на запросы с той скоростью, с которой они могут это сделать, а затем сигнализируют о завершении передачи. Такая сигнализация между устройствами, подтверждающая завершение какой-либо операции, называется квитированием.
Для связи процессора с периферийными устройствами в ЭВМ семейства VAX применяются несколько асинхронных шин. На младших моделях ЭВМ семейства VAX одна из этих асинхронных шин может выступать в качестве основной системной шины, но на старших моделях ЭВМ семейства VAX эти шины подключаются к шине SBI с помощью адаптеров. Адаптеры имеют небольшого объёма быстродействующую буферную память обратного магазинного типа (дисциплина обслуживания "первым пришёл - первым вышел"), называемую SILO. Наличие буферной памяти позволяет адаптерам передавать данные шине SBI 64-битовыми порциями и тем самым извлекать преимущество двойной передачи по шине SBI. Первоначально асинхронные шины были разработаны для различных моделей ЭВМ серии PDP-11 или LSI-11. В связи с тем, что объём основной памяти на этих машинах меньше, чем на ЭВМ семейства VAX, адаптеры имеют возможность выполнять отображение адресов. Ниже приводятся основные характеристики асинхронных шин.
Шина MASSBUS - высокоскоростная шина с 16-битовым трактом данных. Передача управляющей информации осуществляется асинхронно, а данные передаются синхронно. Шина была первоначально разработана для ЭВМ PDP-11/70, в настоящее время используется на некоторых старших моделях ЭВМ семейства VAX для подключения высокоскоростных дисковых устройств, таких как диски типов RP и RM. Скорость передачи данных шины MASSBUS может достигать 2 млн. байтов/с.
Шина UNIBUS - полностью асинхронная шина с 16-битовым трактом данных. Первоначально применялась на всех ЭВМ серии PDP-11, для ЭВМ серии LSI-11 не использовалась. Шина UNIBUS позволяет подключить к ЭВМ семейства VAX любые периферийные устройства, которые могут быть подключены к ЭВМ серии PDP-11. Шина используется для подключения большинства устройств ввода-вывода, за исключением высокоскоростных дисков, подключаемых к шине MASSBUS. Младшие модели ЭВМ семейства VAX, такие как VAX-11/730, применяют шину UNIBUS для подключения всех устройств ввода-вывода. Скорость передачи данных шины UNIBUS может достигать 1,5 млн. байтов/с.
Шина Q-BUS - дешёвая, полностью асинхронная шина с 16-битовым трактом данных. Первоначально была разработана для ЭВМ серии LSI-11, как более дешёвый альтернативный вариант шине UNIBUS. Стоимость шины снижается за счёт использования одних и тех же линий как для передачи данных, так и для передачи младших 16 битов адреса. Это означает, что данные и адреса должны передаваться в разное время. Конечно, это несколько замедляет работу пользователя, но при этом сокращается количество микросхем для каждого периферийного контроллера почти наполовину. ЭВМ серии VAX-11 непосредственно не используют шину Q-BUS. Тем не менее старшие модели, такие как VAX-11/780, имеют установленную внутри центральной стойки ЭВМ серии LSI-11, которая служит для управления консолью оператора и начальной загрузки системы. Поэтому, хотя эти модели ЭВМ семейства VAX номинально и включают шину Q-BUS, она не используется во время нормальной работы системы. Однако ЭВМ серии Micro VAX были спроектированы так, что шина Q-BUS была единственной внешней шиной, используемой и для подключения памяти, и для подключения периферийных устройств.
В отличие от многих вычислительных машин ЭВМ семейства VAX не имеют специальных инструкций для выполнения операций ввода-вывода. Вместо этого на ЭВМ семейства VAX для выполнения операций ввода-вывода применяются обычные инструкции обработки данных, такие как семейства инструкций MOV, ADD, INC и т.д., которые активизируют операции ввода-вывода при обращении к специально зарезервированным адресам.
В конце верхней части реального (в противоположность виртуальному) адресного пространства для устройств ввода-вывода зарезервирован 1 Мбайт пространства, данная область адресов не используется как обычная память. Адреса в этой области относятся к регистрам контроллеров устройств, подключённых к шинам MASSBUS или UNIBUS. (Для ЭВМ серии MicroVAX адреса относятся к регистрам контроллеров ввода-вывода, подключённых к шине Q-BUS.) Биты или комбинации битов в регистрах устройств служат для активизации периферийных устройств или для получения информации о состоянии устройства. Например, загруженный в регистр команд код может быть указанием выполнить перемотку магнитной ленты. В регистре состояния один из битов может использоваться как признак завершения операций ввода-вывода, а какой-либо ещё бит использоваться для индикации ошибки. Каждое устройство имеет свой собственный набор регистров и свой собственный способ интерпретации битов.
Следует отметить, что адреса регистров устройств являются адресами реальной памяти, поэтому, чтобы программа могла получить к ним доступ, на них должны быть отображены виртуальные адреса. Однако поскольку для операционной системы существует потенциальная опасность её разрушения при неправильном обращении к устройствам на физическом уровне, то эти адреса помечаются как доступные только в режиме ядра. (Если бы пользователь имел доступ на физическом уровне к такому устройству, как магнитный диск, то он бы мог читать, модифицировать или удалять файлы и каталоги на диске, минуя таким образом систему защиты файлов ОС VAX/VMS.)
Для достижения высокой производительности вычислительной системы необходимо минимизировать для программ требуемое число обращений к регистрам устройств ввода-вывода при работе с этими устройствами. Например, если для передачи каждого байта с диска требовалось бы выполнение инструкции MOVB, то это сильно бы загрузило процессор. В действительности, ЭВМ семейства VAX не настолько быстрые машины, чтобы сохранить свою производительность, работая подобным образом с высокоскоростными дисками. Чтобы избежать таких потерь, большинство устройств ввода-вывода ЭВМ семейства VAX работают в режиме прямого доступа к памяти. Это означает, что, начав выполнение операции, устройство способно самостоятельно напрямую осуществлять чтение или запись информации в память ЭВМ семейства VAX, не требуя при этом какого-либо вмешательства со стороны программы; операция выполняется до тех пор, пока не будет передан полностью весь блок информации.
Прямой доступ к памяти выполняется частично с помощью контроллера устройства ввода-вывода и частично с помощью адаптера системной шины. Поскольку обе шины MASSBUS и UNIBUS имеют 16-битовый тракт данных, они способны передавать только слова и байты. Передача таких небольших блоков информации неэффективна для ЭВМ семейства VAX, для которых предпочтительнее использовать 32-битовую передачу или 64-битовую двойную передачу. Чтобы извлечь преимущество из такой более эффективной передачи, адаптеры системных шин снабжаются буферной памятью (SILO), в которой хранятся передаваемые данные. Весь обмен в режиме прямого доступа к памяти адаптеры пытаются по возможности выполнить 64-битовыми посылками. (Если длина передаваемого блока информации не кратна 64 битам, то для завершения передачи блока должна быть сделана лишняя передача.) Буферная память адаптера работает обратным образом по отношению к тому, как работает обычный стек. В случае стека элемент, помещённый в стек последним, извлекается из стека первым. В буферной памяти адаптера первый помещённый элемент первым же и извлекается. У применяемых в настоящее время адаптеров объём буферной памяти составляет 64 байта. Этот объём буферной памяти вполне достаточен для передачи по шине SBI данных с минимальной задержкой, а тогда как шина SBI будет занята передачей данных других устройств - для обработки полученных данных.
При прямом доступе к памяти или при выполнении других процессов ввода-вывода процессор ЭВМ был бы сильно загружен, если бы он непрерывно контролировал завершение процесса ввода-вывода. Для решения этой проблемы в современных вычислительных машинах используется аппарат прерываний. Прерывание - это сигнал, который заставляет процессор отложить выполнение текущей программы и начать выполнение специальной программы, называемой процедурой обработки прерывания. При прерывании программы сохраняется достаточно информации, чтобы управление могло быть передано обратно прерванной программе и она могла продолжить выполнение так, как будто она и не прерывалась. На ЭВМ семейства VAX в стеке прерываний сохраняется содержимое программного счётчика (регистр PC) и содержимое длинного слова состояния процессора (регистр PSL). Любой другой регистр, используемый процедурой обработки прерывания, должен сохраняться самой процедурой.
Местонахождение процедур обработки прерываний определяют длинные слова, называемые векторами прерываний, каждое из которых содержит начальный адрес частной процедуры обработки прерываний. Это называется векторной обработкой прерываний или обработкой прерываний по вектору. На ЭВМ семейства VAX векторы прерывания и процедуры обработки прерываний находятся в защищённом пространстве памяти системы; эти процедуры выполняются в режиме ядра. Однако операционная система VAX/VMS обеспечивает способы для вызова процедур обработки прерываний, написанных пользователями. Эти способы называются асинхронными системными прерываниями (AST). При соответствующей установке программа пользователя может иметь процедуры обработки завершения ввода-вывода, которые активизируются системными прерываниями. Это позволяет программе продолжать вычисление, вместо того чтобы ожидать, пока будет завершена операция ввода-вывода. Чтобы получить дополнительную информацию по использованию асинхронных системных прерываний, читателю следует просмотреть гл. 11 или обратиться к системному руководству "VAX/VMS System Services Reference Manual".
Прерывания по исключительным ситуациям подобны прерываниям ввода-вывода, однако отличаются от них тем, что вызываются не внешними событиями, такими как завершение ввода-вывода, а внутренними, такими как переполнение, использование запрещённых или резервных инструкций или операндов, или обращением к запрещённой области памяти. В большинстве случаев при возникновении исключительной ситуации выполнение программы завершается и выдаётся сообщение об ошибке. Тем не менее возможно иметь написанные пользователем процедуры, активизируемые при возникновении некоторых исключительных ситуаций. Такие процедуры называются процедурами обработки исключительных ситуаций.
Исключительные ситуации разделяются в основном на две категории - ловушки (trap) и отказы (fault). В случае исключительной ситуации типа ловушки прерывание происходит после завершения выполнения инструкции. Сохранённое значение программного счётчика является адресом следующей инструкции, которая должна выполняться. Примером такой исключительной ситуации является прерывание по переполнению целого числа. Если в регистре PSL установлен бит разрешения прерывания по переполнению целого числа, то прерывание произойдёт в том случае, если при выполнении какой-либо инструкции обработки целых чисел, такой как ADDL3, будет установлен бит V. Операция, вызвавшая установку бита V, будет завершена, а результат (который может быть корректным при работе с числами без знака) будет помещён по адресу операнда результата.
Исключительная ситуация типа отказа возникает, если выполнение инструкции не может быть завершено. В этом случае в регистре PC будет восстановлено значение; которое находилось в нём перед выполнением инструкции. Это позволяет процедуре обработки исключительной ситуации исследовать инструкцию и определять, в чём причина. Вполне возможно, что процедура обработки исключительной ситуации сможет устранить эту причину. Например, на моделях ЭВМ семейства VAX, не имеющих инструкций для работы с числами с плавающей точкой типов G и Н, для программной эмуляции этих инструкций можно использовать обработку прерывания по резервной инструкции, возникающего при отказе выполнения инструкции, отсутствующей в наборе инструкций. При этом с точки зрения пользователя программа будет выполняться корректно, хотя и медленнее, чем когда инструкции реализуются аппаратно.
Когда поступает запрос на прерывание, процессор будет занят выполнением очередной инструкции. Обычно, перед тем как передать управление процедуре обработки прерывания, процессор завершает выполнение инструкции. Однако сложные инструкции, такие как инструкции обработки символьных строк, описанные в гл. 13, представляют потенциальную проблему. Такие инструкции могут выполняться довольно продолжительное время, а многие высокоприоритетные события не могут ждать, пока завершится выполнение таких инструкций. (Даже на вычислительных системах VAX пересылка 65536 байтов может занять значительную долю секунды.)
Для решения проблемы инструкции с потенциально большим временем выполнения разрабатывались так, что они могут прерываться до завершения своего выполнения. Такие инструкции называются прерываемыми инструкциями. При возврате управления прерванной программе, выполнение прерванной инструкции продолжается с той точки, на которой оно было приостановлено.
При прерывании прерываемой инструкции во время её выполнения необходимо сохранить промежуточные результаты, так чтобы её выполнение возобновилось с той точки, где она была прервана. (Если было бы необходимо начинать выполнение инструкции каждый раз с начала, то серии прерываний могли бы задержать завершение инструкции на неопределённое время.) Поскольку прерываемые инструкции во время выполнения используют регистры R0 - R5 для хранения промежуточных результатов, то восстановление после прерывания является быстрым и эффективным. К прерываемым инструкциям относятся инструкции семейства POLY, описанные в гл. 12, а также инструкции обработки символьной информации и упакованных десятичных чисел, описанные в гл. 13.
В случаях, когда несколько процессов или устройств модифицируют одну информацию, существует опасность неправильной корректировки информации. Это верно для любых запоминающих устройств, включая основную память или магнитные диски. Например, предположим, что вы должны университету сумму 2001 долл., из них 2000 долл, за обучение и 1 долл, пени за библиотеку. Если случится так, что оба платёжных листа будут обрабатываться приблизительно в одно и то же время, то может произойти следующее:
В итоге вы произвели выплаты 1 долл, и 2000 долл., по счёту 2001 долл., но на устройстве памяти осталась информация, которая показывает, что вы должны 2000 долл.
Те же самые ошибки могут происходить, когда процесс и устройство модифицируют одну и ту же область памяти. Избежать такой ошибки с помощью только системного программного обеспечения может быть трудно. Решением проблемы является блокировка информации, чтобы она не была доступна одному процессу в то время, пока другой процесс модифицирует информацию. В приведённом примере, если ваш баланс был бы блокирован, то процесс "казначей" не мог бы иметь к нему доступ, пока процесс "библиотека" модифицировал ваш баланс.
Для поддержки работы операционной системы и работы параллельно выполняемых процессов в набор инструкций ЭВМ семейства VAX включены следующие семь инструкций:
Режим |
Применение |
---|---|
Пользователя |
Программы пользователя, утилиты, компиляторы, отладчики |
Супервизора |
Интерпретатор команд. |
Управления |
Вызовы системных сервисных программ и функций RMS. |
Ядра |
Управление страницами виртуальной памяти, планирование процессов, ввод и вывод на физическом уровне. |
а. |
Привилегии. |
б. |
Режим доступа. |
в. |
Регистры процессора. |
г. |
Шина. |
д. |
UNIBUS. |
е. |
MASSBUS. |
ж. |
Q-BUS. |
з. |
Прямой доступ к памяти. |
и. |
Прерывание. |
к. |
Ловушка. |
л. |
Отказ. |
|
|
< НАЗАД | ОГЛАВЛЕНИЕ | ВПЕРЁД > |
[1] Иногда пользователи, работая в режиме разделения времени, занимаются решением одной общей задачи, такой, например, как резервирование авиабилетов. В этих случаях между программами осуществляется управляемое взаимодействие.
[2] В ОС VAX/VMS процесс загрузки программы тесно связан с реализацией виртуальной памяти. Поэтому программа, которую можно было бы назвать загрузчиком, называется активатором образа (см гл. 15).
[3] В предыдущем разделе говорилось, что вся эта информация содержится в регистре смещения страницы. Термин "регистр смещения страницы" использовался авторами как условный для упрощения изложения. Не следует понимать, что для каждой страницы виртуальной памяти на самом деле имеется реальный физический регистр. - Прим. ред.