Text
                    СРЕДНЕЕ ПРОФЕССИОНАЛЬНОЕ ОБРАЗОВАНИЕ

В.В. СТЕПИНА

АРХИТЕКТУРА ЭВМ

И ВЫЧИСЛИТЕЛЬНЫЕ
СИСТЕМЫ

УЧЕБНИК

Рекомендовано Экспертным советом при ГБОУ УМЦ ПОДОгМ
для использования в образовательном процессе профессиональных
образовательно/х организаций города Москвы в качестве
учебника для студентов среднего профессионального образования
по специальности 2.09.0?.04 «Информационные система!
(по отраслям)»

Москва
КУРС
ИНФРА-М
2026

УДК 004.2(075.8) ББК 32.973-02я73 С79 ФЗ Издание не подлежит маркировке № 436-ФЗ в соответствии с п. 1 ч. 4 ст. 11 Рецензент: В. В. Гуров — канд. техн, наук, преподаватель кафедры «Информаци- онные технологии» ГАПОУ Колледж предпринимательства № 11. Степина В.В. С79 Архитектура ЭВМ и вычислительные системы : учебник/ В.В. Сте- пина. — Москва: КУРС: ИНФРА-М, 2026 — 384 с. — (Среднее про- фессиональное образование). ISBN 978-5-906923-07-3 (КУРС) ISBN 978-5-16-012261-8 (ИНФРА-М, print) ISBN 978-5-16-105268-6 (ИНФРА-М, online) Рассмотрены информационно-логические основы электронно-вычис- лительной техники, типовые логические элементы и устройства ЭВМ, структура и функционирование процессора, принципы организации и построения ЭВМ, периферийные устройства ЭВМ, методы и сред- ства сопряжения, основы программирования процессора, вычисления в многопроцессорных и многоядерных системах. Изложены принципы функционирования и вводные основы проектирования цифровой вычис- лительной техники. Описаны тенденции развития архитектуры и аппарат- ного обеспечения электронных вычислительных систем, методы повы- шения производительности многопроцессорных и многоядерных систем, энергосберегающие технологии. УДК 004.2(075.8) ББК 32.973-02я73 ISBN 978-5-906923-07-3 (КУРС) ISBN 978-5-16-012261-8 (ИНФРА-М, print) ISBN 978-5-16-105268-6 (ИНФРА-М, online) © Степина В В., 2017 ©КУРС, 2017 Оригинал-макет подготовлен в Издательстве «КУРС» Подписано в печать 27 09.2017. Формат 60x90/16. Бумага офсетная. Гарнитура Newton. Печать цифровая. Усл. печ. л. 24.0. ППТ 20 экз. Заказ № 00000 ТК 640317-661253-121216 ООО Издательство «КУРС» 127273, Москва, ул. Олонецкая, д. 17А, офис 104 Тел.: (495) 203-57-83. E-mail: kursizdat@gmail.com ООО «Научно-издательский центр ИНФРА-М» 127282, Москва, ул. Полярная, д. 31В, стр. 1 Тел.: (495) 280-15-96, 280-33-86. Факс: (495) 280-36-29 E-mail: books@infra-m.ru http://www.infra-m.ru
ПРЕДИСЛОВИЕ Учебник ориентирован на дисциплину «Архитектура ЭВМ и вы- числительные системы» для специальности среднего профессиональ- ного образования (230701) 09.02.05 «Прикладная информатика», входящей в укрупненную группу специальностей (230000) 09.00.00 «Информатика и вычислительная техника», и построен на фунда- ментальном утверждении современного классика компьютерной науки Эндрю Танепбаума о том, что компьютер можно рассматривать как иерархию структурных уровней организации. Это утверждение в равной мере относится как к аппаратной ор- ганизации, так и к структуре и организации программного обеспе- чения. Более того, исследование взаимодействия уровней организа- ции компьютеров показывает, что нередко затруднительно провести четкую границу между аппаратной и программной реализациями функциональностей. Однако просматривается определенная зако- номерность, состоящая в том, что чем ниже расположен уровень, тем в большей степени он реализован средствами аппаратуры (а не сред- ствами программирования). Появляются новые языки программирования еще более высокого уровня, и каждый такой язык использует своего предшественника как основу, поэтому вычислительную машину можно рассматривать в виде рада многоуровневой машины, и самый нижний уровень — это уровень физической реализации цифровых логических элементов. Подход к компьютеру как к многоуровневой иерархической структуре позволяет продолжать заниматься дальнейшей разработ- кой системы, работая на вышележащем уровне. Однако реализация, по крайней мере, некоторых функций с использованием возможно- стей нижележащих уровней позволяет повысить эффективность сис- темы, правда иногда ценой повышения трудоемкости разработки. Изучение иерархических уровней (особенно изучение уровня ко- манд процессора) дает возможность приобрести знания, использо- вание которых может помочь как системному, так и прикладному программисту в эффективной разработке программного продукта, позволяя повысить эксплуатационные характеристики программных модулей (уменьшить объем требуемой памяти, увеличить скорость выполнения). Учебник состоит из девяти глав. В первой главе даются базовые понятия вычислительной техники.
Во второй и третьей главах рассматривается цифровой логиче- ский уровень: арифметические и логические основы вычисли- тельной техники; основные цифровые логические устройства (ком- бинационные логические устройства и устройства с памятью). Четвертая глава посвящена архитектуре микропроцессора. На этом уровне в обработке команд участвует арифметико-логиче- ское устройство (АЛУ), представлен уровень микроархитектуры и ар- хитектуры набора команд На этом уровне рассматриваются архи- тектура памяти, режимы адресации, регистры, машинные команды. Пятая и шестая главы посвящены организации микропроцессор- ной системы и режимам работы. В седьмой главе описывается уровень операционных систем. При- водится краткий обзор операционных систем, управление ресурсами вычислительных систем. Восьмая глава посвящена четвертому уровню, который представ- ляет собой символическую форму одного из языков более низкого уровня — ассемблера. Рассмотрены примеры программ на языке ас- семблера для конкретной архитектуры, операционной системы и ва- рианты синтаксиса языка. В девятой главе рассматриваются параллельные вычислительные системы, производительность параллельных вычислительных систем и тенденции развития вычислительных систем.
Глава 1 ОСНОВНЫЕ ПОНЯТИЯ АРХИТЕКТУРЫ АППАРАТНЫХ СРЕДСТВ, ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЫ, СИСТЕМНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 1,1. Базовые понятия вычислительной системы Для введения в дисциплину ознакомимся с основными поняти- ями, которые определяют ее содержание. Рассмотрим понятия «вы- числительная машина», «вычислительная система», определим раз- ницу между компьютерами и информационной системой, между понятиями «архитектура» и «структура» аппаратных средств вычис- лительной системы. Согласно ГОСТ 15971-90 вычислительная машина (ВМ) — сово- купность технических средств, создающая возможность проведения обработки информации (данных) и получения результата в необхо- димой форме. Под техническими средствами понимают все оборудо- вание, предназначенное для автоматизированной обработки данных. Как правило, в состав ВМ входит и системное программное обеспе- чение. Вычислительную машину, основные функциональные устройства которой выполнены на электронных компонентах, называют элект- ронной вычислительной машиной (ЭВМ). В последнее время в отечественной литературе широкое распро- странение получил англоязычный термин «компьютер» (англ. Com- puter — вычислитель). Мы будем использовать эти термины как рав- ноправные. Следует отметить, что в настоящее время активно ведутся разработки компьютеров, работа которых основана на оптических, фотонных, квантовых и других физических принципах. Например, оптические компьютеры в своей работе используют скорость света, а нс скорость электричества, что делает их наилучшими проводни- ками данных. Сверхъестественный мир квантовой механики не под- чиняется законам общей классической физики. Квантовый бит (qu-
bit) не существует в типичных 0- или 1-бинарных формах сегодняш- них компьютеров — квантовый бит может существовать в одной из них или же в обеих системах одновременно. В связи с этим поня- тие «электронная вычислительная машина», в котором акцентиру- ется, что машина построена на основе электронных устройств, ста- новится более узким, чем понятие «компьютер». С развитием вычислительной техники появились многопроцес- сорные системы и сети, объединяющие большое количество от- дельных процессоров и вычислительных машин, программные сис- темы, реализующие параллельную обработку данных на многих вы- числительных узлах. Появился термин «вычислительные системы». Система (от греч. systema — целое, составленное из частей соеди- нение) — это совокупность элементов (объектов), взаимодействующих друг с другом, образующих определенную целостность, единство. Объект (от лат. objectum — предмет) — это термин, используемый для обозначения элементов системы. Вычислительную систему (ВС) стандарт ISO/IEC2382/1-93 опре- деляет как одну или несколько вычислительных машин, периферий- ное оборудование и программное обеспечение, которые выполняют обработку данных. Вычислительная система состоит из связанных между собой средств вычислительной техники, содержащих не менее двух основных про- цессоров, имеющих общую память и устройство ввода-вывода. Формально отличие ВС от ВМ выражается в количестве вычис- лительных средств. Множественность этих средств позволяет реали- зовать в ВС параллельную обработку Таким образом, вычислительная система является результатом интеграции аппаратных средств и программного обеспечения, функ- ционирующих в единой системе и предназначенных для совместного выполнения информационно-вычислительных процессов. Аппаратное средство (hardware) включает в себя все внешние и внутренние физические компоненты компьютерной системы (из п. 3.7.2 ГОСТ Р 53394-2009) Программное обеспечение (software) по ГОСТ Р 53394-2009 — это совокупность информации (данных) и программ, которые обраба- тываются компьютерной системой. С технической точки зрения вычислительная система — это ком- плекс вычислительных средств, объединенных в информационно- вычислительную сеть. Основной отличительной чертой вычислительных систем по от- ношению к ЭВМ является наличие в них нескольких вычислителей,
реализующих параллельную обработку. Точного различия между вы- числительными машинами и вычислительными системами опреде- лить невозможно; так как вычислительные машины даже с одним процессором обладают разными средствами распараллеливания, а вычислительные системы могут состоять из традиционных вычис- лительных машин или пропессоров. Необходимо понимать разницу между компьютерами и инфор- мационной системой’ компьютеры оснащены специальными про- граммными системами, являются технической базой и инструментом для информационных систем. Информационная система — это организационно упорядоченная совокупность документов (массивов документов) и информацион- ных технологий, в том числе с использованием средств вычисли- тельной техники и связи, реализующих информационные процессы [1, ст. 2] (из и. 3.1.7 ГОСТ Р 54089-2010) Информационная система немыслима без персонала, взаимодей- ствующего с компьютерами и телекоммуникациями. Информационная система с технической точки зрения — это вза- имосвязанная совокупность средств, методов и персонала, исполь- зуемых для хранения, обработки и выдачи информации в интересах достижения поставленной цели. С развитием средств вычислительной техники изменился подход к созданию вычислительных машин. Вместо разработки аппаратуры и средств математического обеспечения стала проектироваться сис- тема, состоящая из синтеза аппаратных и программных средств. При этом на главный план выдвинулась концепция взаимодействия ап- паратных и программных средств. Так возникло новое понятие — ар- хитектура вычислительной машины. Архитектура (architecture)— это базовая организация системы, во- площенная в ее компонентах, их отношениях между собой и с окру- жением, а также принципы, определяющие проектирование и раз- витие системы [ИСО/МЭК 15288:2008, определение 4.5]. Архитектура вычис лительной машины (Computer architecture) — это концептуальная структура вычислительной машины, определяющая проведение обработки информации и включающая методы преобра- зования информации в данные и принципы взаимодействия техни- ческих средств и программного обеспечения [ГОСТ 15971-90, опре- деление 29]. Таким образом, архитектуру вычислительной машины можно представить как множество взаимосвязанных компонентов, вклю- чающих элементы различной природы: программное обеспечение
(software), аппаратное обеспечение (hardware), алгоритмическое обеспечение (brainware), специальное фирменное обеспечение (firm- ware), создающих возможность проведения обработки информации и получения результата в необходимой форме. Следует отличать архитектуру вычислительной машины от ее структуры. Структура — это отношение между элементами системы [ISO/ IEC2382/1-93J. Структура вычислительной машины определяет отношение между ее элементами (множество взаимосвязанных компонентов) на уровне детализации. Элементами детализации могут быть различ- ные функциональные узлы (блоки, устройства и т.д.). Графически описание вычислительной машины на любом уровне детализации представляется в виде структурных схем. Под архитектурой вычислительной машины понимают общее описание принципов организации аппаратно-программных средств и основных их характеристик, определяющих функциональные воз- можности вычислительной машины. Архитектура вычислительной системы — совокупность характе- ристик и параметров, определяющих функционально-логичную и структурно-организованную систему и затрагивающих в основном уровень параллельно работающих вычислителей. Понятие архитектуры охватывает общие понятия организации системы, включающие такие высокоуровневые аспекты разработки компьютера, как система памяти, структура системной шины, орга- низация ввода/вывода и т.п. Архитектура определяет принципы действия, информационные связи и взаимное соединение основных логических узлов компью- тера процессора, оперативного запоминающего устройства (ЗУ), внешних ЗУ и периферийных устройств. Общность архитектуры раз- ных компьютеров обеспечивает их совместимость с точки зрения пользователя. 1.2. Многоуровневая организация вычислительных машин Согласно всемирно известному специалисту в области инфор- мационных технологий Эндрю Таненбауму в основе структурной организации компьютера лежит идея иерархической структуры, в которой каждый уровень выполняет вполне определенную функцию. Это утверждение в равной мере относится как к аппа-
ратной организации, так и к организации программного обеспе- чения. Достоинства такого представления вычислительных машин: • каждый верхний уровень интерпретируется одним или несколь- кими нижними уровнями; • каждый из уровней можно проектировать независимо; • чем ниже уровень, на котором реализуется программа, тем более высокая производительность достижима; • модификация нижних уровней не влияет на реализацию верхних. Понятие семантического разрыва между уровнями Преобразование операторов языков высокого уровня в машин- ный код или в микрокоманды требует от транслятора, во-первых, умения распознать операторы и команды различных уровней и, во-вторых, для любого оператора языка высокого уровня генери- ровать десятки или сотни команд низкого уровня. Это приводит к усложнению транслятора, увеличению трудоемкости его разра- ботки, снижению производительности генерируемых программ. На- личие этих проблем называют семантическим разрывом между уров- нями. Основным способом его преодоления является специализация машин, при которой операторы проблемно-ориентированных язы- ков могут непосредственно выполняться аппаратными средствами машины и не требовать трансляции. Примеры: аппаратная реали- зация графических преобразований; аппаратная реализация опера- ций с векторами и матрицами. Языки, уровни и виртуальные машины Основой функционирования любой вычислительной машины является ее способность выполнять заданные действия. Аппаратные средства любой вычислительной машины способны выполнять только ограниченный набор сравнительно простых команд. Эти при- митивные команды составляют так называемый машинный язык машины. Говоря о сложности аппаратуры компьютера, машинные команды целесообразно делать как можно проще, но примитивность большинства машинных команд делает их использование неудобным и трудным. Для эффективной работы человека с компьютером раз- работчики вводят другой набор команд, более удобный для челове- ческого общения (языки более высокого уровня). Появляются новые языки программирования еще более высокого уровня, и каждый такой язык использует своего предшественника
как основу, поэтому вычислительную машину рассмотрим в виде ряда многоуровневой машины, структура которой изображена на рис. 1.1. Между языками программирования и существующей виртуальной машиной существует тесная связь. Язык, находящийся в самом низу иерархической структуры компьютера, является при- митивным, а тот, что расположен на ее вершине, — самым сложным. Большинство современных вычислительных машин включают 6—7 уровней виртуализации. Нижние уровни, начиная с машинного, более консервативны к изменениям. Уровень п Уровень 2 Уровень 1 Уровень О Программы на языке Мп либо интерпретируются программой- интерпретатором, работающей на машине более низкого уровня, либо транслируются на машинный язык более низкого уровня Программы на языке М, либо интерпретируются программой- интерпрета’ором. работающей на машине более низкого уровня либс транслируются на машинный язык более низкого уровня Программы на языке М, либо ингерпре1ирую1ся программои- интерпрета-ором, работающей на машине более низкого уровня, либо гранслируюгся на машинный язык более низкого уровня Программы на языке Мо либо интерпретируются программои- интеопретаторсм, работающей на машине более низкого уровня, либс транслируются на машинный язык более низкого уровня Рис. 1.1. Структура многоуровневой вычислительной машины Компьютер с п уровнями можно рассматривать как п разных вир- туальных машин, у каждой из которых есть свой машинный язык. Термины «уровень» и «виртуальная машина» мы будем использовать как синонимы. Только программы, написанные наЯ0, могут выпол- няться компьютером без трансляции или интерпретации. Прог- раммы, написанные на Яь Я2,..., Яи, должны проходить через интер- претатор более низкого уровня или транслироваться на язык, соот- ветствующий более низкому уровню.
Современные многоуровневые вычислительные машины Современные компьютеры можно представить как структуру, со- стоящую из шести уровней (рис. 1.2). Уровень 5 Уровень 4 Уровень 3 Уровень 2 Уровень 1 Уровень 0 Рис. 1.2. Структура шестиуровневого компьютера Способ поддержки каждого уровня указан под ним, в скобках дано название соответствующего программного обеспечения. Существуют уровни, которые расположены ниже нулевого уровня. Эти уровни не рассматриваются из-за сложности материала, так как они попадают в сферу таких направлений, как элементная база микро- и наноэлектроники, микросистемная техника. Урсвень 0: цифровой логический уровень. Цифровой логический уровень представляет собой аппаратное обеспечение компьютера. Объектами цифрового логического уровня являются цифровые ло- гические устройства. Для описания того, как функционируют циф- ровые логические устройства, используется математический аппарат алгебры логики, в которой используются логический ноль и логиче- ская единица. Основу для проектирования сложных цифровых устройств со- ставляют функции. Базовые логические элементы — это схемы, со- держащие электронные ключи (вентили) и выполняющие основные логические операции. Сложные логические функции можно выра-
зить через совокупность конечного числа базисных логических функций, таких как «НЕ», «И», «ИЛИ». Одним из важнейших элементов цифровой техники является триггер (англ. Trigger — защелка, спусковой крючок). Триггер имеет два устойчивых состояния, одно из которых соответствует двоичной единице, а другое — двоичному нулю. Сам триггер не является базо- вым элементом, так как ои собирается из более простых логических схем. Триггер — это электронная схема, широко применяемая в ре- гистрах компьютера для надежного запоминания двоичной единицы (бита памяти). Биты памяти, объединенные в группы, например по 16, 32 или 64, формируют регистры. Каждый регистр может содержать одно дво- ичное число до определенного предела. Уровень 1: уровень микроархитектуры. В компьютерной инженерии микроархитектура (англ, microarchitecture; иногда сокращается до march или uarch), также называемая организацией компьютера, — это способ, которым данная архитектура набора команд (ISA, АНК) реализована в процессоре. Каждая АНК может быть реализована с помощью различных микроархитектур. Реализации могут варьиро- ваться в зависимости от целей конкретной разработки или в резуль- тате технологических сдвигов. Архитектура компьютера является комбинацией микроархитектуры, микрокода и АПК. На этом уровне в обработке команд участвует арифметико-логиче- ское устройство (АЛУ). АПУ состоит из регистров, сумматора с соот- ветствующими логическими схемами и элемента управления выпол- няемым процессом. Оперативная память организована в виде после- довательностей, которые группируются в машинные слова. Арифметико-логическое устройство работает в соответствии с сооб- щаемыми ему именами (кодами) операций, которые при пересылке данных нужно выполнить над переменными, помещаемыми в ре- гистры. Над какими кодами производится операция, куда помещается ее результат — определяется выполняемой командой. Примерами обработки могут служить логические операции («И», «ИЛИ», «Исклю- чающего ИЛИ» и т.д.), т.е. побитные операции над операндами, а также арифметические операции (сложение, вычитание, умножение, деление и т.д.). Команды содержат от одного до трех операндов. В операционном устройстве (АЛУ) реализуется заданная после- довательность микрокоманд (команд), в микропрограммном устрой- стве управления (УУ) задается последовательность микрокоманд (команд).
Различают два вида микрокоманд: внешние — такие микроко- манды, которые поступают в АЛУ от внешних источников и вызы- вают в нем преобразование информации, и внутренние — те, кото- рые генерируются в АЛУ и оказывают влияние на микропрограмм- ное устройство, изменяя, таким образом, нормальный порядок следования команд. Микропрограмма — это интерпретатор для команд на уровне 2. Микропрограмма вызывает команды из памяти и выполняет их одну за другой, а результаты вычислений из АЛУ передаются в оператив- ную память по кодовым шинам записи. На некоторых машинах работа тракта данных контролируется особой программой, которая называется микропрограммой. На дру- гих машинах тракт данных контролируется аппа ратными средствами. Например, при выполнении команды ADD микропрограмма вы- зывает из памяти операнды команды сложения, помещает их в ре- гистры, АЛУ вычисляет сумму операндов, а затем результат пере- правляется обратно в память На компьютере с аппаратным кон- тролем тракта данных происходит такая же процедура, но при этом нет программы, интерпретирующей команды уровня 2. Машины с различной микроархитектурой могут иметь одинако- вую архитектуру набора команд и, таким образом, быть пригодными для выполнения тех же программ. Новые микроархитектуры и/или схемотехнические решения вместе с прогрессом в полупроводнико- вой промышленности являются тем, что позволяет новым поколе- ниям процессоров достигать более высокой производительности, используя ту же АНК. Уровень 2: уровень архитектуры набора команд. Архитектура набора команд (англ, instruction set architecture, ISA) — часть архитектуры компьютера, определяющая программируемую часть ядра микропро- цессора. На этом уровне определяются реализованные в микропро- цессоре конкретного типа: • архитектура памяти; • взаимодействие с внешними устройствами ввода/вывода; • режимы адресации; • регистры;; • машинные команды; • различные типы внутренних данных (например, с плавающей за- пятой, целочисленные типы и т.д.); • обработчики прерываний и исключительных состояний. В современных микроархитектурах используется конвейерный тракт. Конвейер содержит такие стадии, как выбор инструкций, де-
кодирование инструкций, исполнение и запись результата. Некото- рые архитектуры включают также доступ к памяти. Дизайн конвей- ера является фундаментальным при разработке микроархитектуры. Устройства исполнения также являются ключевыми для микро- архитектуры. Они включают арифметико-логические устройства, устройства обработки чисел с плавающей точкой, устройства вы- борки и хранения, прогнозирование ветвления, параллелизм на уровне данных (SIMD). Эти блоки производят операции или вы- числения процессора. Выбор числа блоков исполнения, их задержек, пропускной способности и способа соединения памяти с системой также является микроархитектурным решением. Проектные решения уровня системы, такие как включать или нет периферийные устройства типа контроллеров памяти, могут счи- таться частью процесса разработки микроархитектуры, поскольку они содержат решения по уровню производительности и способам соединения этих периферийных устройств. В отличие от архитектурного дизайна, где достижение определен- ного уровня производительности является главной целью, проекти- рование микроархитектуры уделяет большее внимание другим огра- ничениям. Поскольку дизайн микроархитектуры прямо влияет на то, что происходит в системе, внимание должно быть уделено таким про- блемам, как площадь/стоимость чипа, потребление энергии, слож- ность логики, технологичность, простота отладки и тестируемость. Уровень 3: уровень операционной системы. Третий уровень опера- ционной системы является гибридным. Большинство команд в его языке есть как на третьем уровне, так и на втором — уровне архитек- туры набора команд (команды, имеющиеся на одном из уровней, вполне могут быть представлены и на других уровнях). У этого уровня есть некоторые дополнительные особенности: новый набор команд; другая организация памяти; способность выполнять две и более программы одновременно и некоторые другие. При постро- ении уровня 3 возможно больше вариантов, чем при построении уровней 1 и 2. Новые средства, появившиеся на уровне 3, выполняются интер- претатором, который работает на втором уровне. Этот интерпретатор был когда-то назван операционной системой. Команды уровня 3, идентичные командам уровня 2, выполняются микропрограммой или аппаратным обеспечением, но не операционной системой. Дру- гими словами, одна часть команд уровня 3 интерпретируется опера- ционной системой, а другая часть — микропрограммой. Вот почему этот уровень считается гибридным.
Между уровнями 3 и 4 есть существенная разница. Нижние три уровня задуманы не для того, чтобы с ними работал обычный про- граммист. Они изначально ориентированы на интерпретаторы и трансляторы, поддерживающие более высокие уровни. Эти транс- ляторы и интерпретаторы составляются так называемыми систем- ными программистами, которые специализируются на разработке новых виртуальных машин. Уровни с четвертого и выше предназна- чены для прикладных программистов, решающих конкретные задачи. Еще одно изменение, появившееся на уровне 4, — механизм под- держки более высоких уровней. Уровни 2 и 3 обычно интерпретиру- ются, а уровни 4, 5 и выше обычно, хотя и не всегда, транслируются. Другое отличие между уровнями 1, 2, 3 и уровнями 4, 5 и выше — особенность языка. Машинные языки уровней 1, 2 и 3 — цифровые. Программы, написанные на этих языках, состоят из длинных рядов цифр, которые воспринимаются компьютерами, но малопонятны для людей. Начиная с уровня 4, языки содержат слова и сокращения, понятные человеку. Уровень 4: уровень ассемблера. Уровень 4 представляет собой сим- волическую форму одного из языков более низкого уровня — ассем- блера. Ассемблер (от англ, assembler — сборщик) — транслятор исход- ного текста программы, написанной на языке ассемблера, в прог- рамму на машинном языке. Как и сам язык, ассемблеры, как правило, специфичны для кон- кретной архитектуры, операционной системы и варианта синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платфор- мах и операционных системах. Среди последних можно также выде- лить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и операцион- ных систем. Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в даль- нейшем обрабатывает ассемблер. Также результатом ассемблирова- ния может быть не исполняемый, а объектный модуль, содержащий разрозненные блоки машинного кода и данных программы, из ко- торого (или из нескольких объектных модулей) в дальнейшем с по- мощью редактора связей может быть получен исполнимый файл.
Уровень 5: уровень языка прикладных программистов. Прикладная программа или приложение — программа, предназначенная для вы- полнения определенных задач и рассчитанная на непосредственное взаимодействие с пользователем. В большинстве операционных систем прикладные программы не могут обращаться к ресурсам ком- пьютера напрямую, а взаимодействуют с оборудованием и другими программами посредством операционной системы К прикладному программному обеспечению относятся компью- терные программы, написанные для пользователей или самими пользователями для задания компьютеру конкретной работы. Прог- раммы обработки заказов или создания списков рассылки — пример прикладного программного обеспечения Программистов, которые пишут прикладное программное обеспечение, называют приклад- ными программистами. Языки, разработанные для прикладных программистов, называ- ются языками высокого уровня. Существуют сотни языков высокого уровня. Наиболее известные среди них — С, С4 +, Java, LISP и Pro- log. Программы, написанные на этих языках, обычно транслируются на j'poBeiib 3 или 4. Трансляторы, которые обрабатывают эти прог- раммы, называются компиляторами. Отметим, что иногда также имеет место интерпретация. Например, программы на языке Java сначала транслируются на язык, напоминающий ISA и называемый байт-кодом Java, который затем интерпретируется. В некоторых случаях уровень 5 состоит из интерпретатора для конкретной приклад ной области, например символической логики. Он предусматривает данные и операции для решения задач в этой области, выраженные при помощи специальной терминологии. Таким образом, компьютер проектируется как иерархическая структура уровней, которые надстраиваются друг над другом. Каждый уровень представляет собой определенную абстракцию различных объектов и операций. Рассматривая компьютер подобным образом, мы можем не принимать во внимание ненужные нам детали и, таким образом, сделать сложный предмет более простым для понимания. Набор типов данных, операций и характеристик каждого от- дельно взятого уровня называется архитектурой. Архитектура связана с программными аспектами. Например, сведения о том, сколько па- мяти можно использовать при написании программы, — часть архи- тектуры Аспекты реализации (например, технология, применяемая при реализации памяти) не являются частью архитектуры. Изучая методы проектирования программных элементов компьютерной системы, мы изучаем компьютерную архитектуру.
1.3. Общий состав и структура вычислительных систем Мы определили, что вычислительная система (ВС) — это некото- рое объединение аппаратных средств, средств управления аппарату- рой (физическими ресурсами), средств управления логическими ресурсами, системы программирования и прикладное программное обеспечение. Основой цифровых вычислительных систем являются логические цифровые схемы, основанные на элементах, принимающих два воз- можных фиксированных значения — «О» и «1». Информация в таких схемах представлена в виде импульсных электрических сигналов, имеющих амплитуду выше некоторого уровня (логический ночь) или ниже определенного уровня (логическая единипа). При построении цифровой БС реализован принцип программного управления. Суть этого принципа в следующем: цифровая схема построена таким образом, что может решать некоторый определенный набор простых задач или выполнять определенные действия (команды); комбини- руя эти действия в соответствии с заданным алгоритмом решения сложной задачи (программа), можно получить решение для очень широкого круга задач. Таким образом, цифровая ВС состоит из аппаратных и прог- раммных средств, которые выступают как неразрывное единство К аппаратным средствам относятся электронные схемы, из кото- рых построена система, и схемы, обеспечивающие их работоспособ- ность. К программным средствам относятся последовательности команд, реализующие решение задач и функции по обработке информации. Технические и эксплуатационные характеристики вычислительных машин Производительность вычислительной машины. Этот показатель определяется архитектурой процессора, иерархией внутренней и внешней памяти, пропускной способностью системного интер- фейса, системой прерывания, набором периферийных устройств в конкретной конфигурации, совершенством ОС и т.д. Основные единицы оценки производительности: • абсолютная, определяемая количеством элементарных работ, вы- полняемых в единицу времени; • относительная, определяемая для оцениваемой ЭВМ относи- тельно базовой в виде индекса производительности.
Для каждою вида производительности применяются следующие традиционные методы их определения. Пиковая производительность (быстродействие) определяется сред- ним числом команд типа «регистр — регистр», выполняемых в одну секунду без учета их статистического веса в выбранном классе задач. Номинальная производительность (быстродействие) определяется средним числом команд, выполняемых подсистемой «процессор — память» с учетом их статистического веса в выбранном классе задач. Она рассчитывается, как правило, по формулам и специальным ме- тодикам, предложенным для процессоров определенных архитектур, и измеряется с помощью разработанных для них измерительных программ, реализующих соответствующую эталонную нагрузку. Для данных типов производительностей используются следующие единицы измерения: • MIPS (Mega Instruction Per Second) — миллион команд в секунду; • MFLOPS (Mega Floating Operations Per Second) — миллион опера- ций над числами с плавающей запятой в секунду; • GFLOPS (Giga Floating Operations Per Second) — миллиард опера- ций над числами с плавающей запятой в секунду и т.д. Системная производительность измеряется с помощью синтезиро- ванных типовых (тестовых) оценочных программ, реализованных на унифицированных языках высокого уровня. Унифицированные тестовые программы используют типичные алгоритмические дей- ствия, характерные для реальных применений, и штатные компиля- торы ЭВМ. Они рассчитаны на использование базовых технических средств и позволяют измерять производительность для расширенных конфигураций технических средств. Результаты оценки системной производительности ЭВМ конкретной архитектуры приводятся от- носительно базового образца, в качестве которого используются ЭВМ, являющиеся промышленными стандартами систем ЭВМ раз- личной архитектуры. Результаты оформляются в виде сравнительных таблиц, двумерных графиков и трехмерных изображений. Эксплуатационная производительность оценивается на основании использования данных о реальной рабочей нагрузке и функциони- ровании ЭВМ при выполнении типовых производственных нагрузок в основных областях применения. Расчеты делаются главным обра- зом на уровне типовых пакетов прикладных программ текстообра- ботки, систем управления базами данных, пакетов автоматизации проектирования, графических пакетов и т.д.
Классическая архитектура вычислительной машины Разнообразие современных вычислительных машин очень ве- лико, но все они представляет собой реализацию так называемой фон-неймановской (принстонской) архитектуры, представленной Джорджем фон Нейманом еще в 1945 г. Рассмотрим классическую архитектуру вычислительной машины на примере архитектуры фон Неймана. Принцип действия вычислительной машины состоит в выполне- нии программ — последовательностей арифметических, логических и других операций, описывающих решение определенной задачи. Программа (для ЭВМ) — это упорядоченная последовательность команд, подлежащая обработке (стандарт ISO 2382/1-84). Команда — это описание операции, которую должна выполнить вычислительная машина. Результат команды вырабатывается по точно определенным для данной команды правилам, заложенным в конструкцию компьютера. Электронные схемы каждого компьютера могут распознавать и вы- полнять ограниченный набор простых команд. На рис. 1.3 представлена схема фон-неймановской вычисли- тельной машины, на основе которой уже более полувека создаются современные вычислительные машины. Рис. 1.3. Схема фон-неймановской вычислительной машины Фон-неймановская архитектура состоит из следующих основных устройств: • памяти, которая включала 4096 машинных слов разрядностью 40 бит. Машинное слово содержало или команды (две команды по 20 бит), или целое число со знаком на 40 бит (8 бит указывали
на тип команды, а остальные 12 бит определяли одно из 212 = = 4096 слов); • арифметико-логического устройства (АЛУ), внутри которого на- ходится особый внутренний регистр разрядностью 40 бит, так называемый аккумулятор; • устройства управления (УУ), выполняет функции управления устройствами; • устройства ввода информации; • устройства вывода информации. Эти устройства соединены каналами связи, по которым переда- ется информация. В современных вычислителвных машинах арифметико-логиче- ское устройство и устройство управления сочетаются в одной мик- росхеме, которая называется центральным процессором (ЦП). Машинная команда считывает слово из памяти в аккумулятор или сохраняет содержимое аккумулятора в памяти. Машина фон Ней- мана выполняла арифметические операции толвко с фиксированной точкой, поскольку фон Нейман был отличным математиком и счи- тал, что плавающую точку можно держать в голове. В основу построения современных вычислительных машин были положены следующие принципы фон Неймана. 1. Принцип однородности памяти. Команды и данные хранятся в одной и той же памяти и внешне в памяти неразличимы. Распо- знать их можно только по способу использования, т.е одно и то же значение в ячейке памяти может использоваться и как данные, и как команда, и как адрес в зависимости лишь от способа обращения к нему. Это позволяет производить над командами те же операции, что и над числами, и, соответственно, открывает ряд возможностей. Так, циклически изменяя адресную часть команды, можно обеспе- чить обращение к последовательным элементам массива данных. Такой прием носит название модификации команд и с позиций со- временного программирования не приветствуется Более полезным является другое следствие принципа однородности, когда команды одной программы могут быть получены как результат исполнения другой программы. Эта возможность лежит в основе трансляции — перевода текста программы с языка высокого уровня на язык кон- кретной вычислительной машины. 2. Принцип адресности. Структурно основная память состоит из пронумерованных ячеек, причем процессору в произвольный мо- мент доступна любая ячейка. Двоичные коды команд и данных раз- деляются на единицы информации, называемые словами, и хранятся
в ячейках памяти, а для доступа к ним используются номера соответ- ствующих ячеек — адреса. 3. Принцип программного управления. Все вычисления, предусмот- ренные алгоритмом решения задачи, должны быть представлены в виде программы, состоящей из последовательности управляющих слов — команд. Каждая команда предписывает некоторую операцию из набора операций, реализуемых вычислительной машиной. Ко- манды программы хранятся в последовательных ячейках памяти вы- числительной машины и выполняются в естественной последова- тельности, т.е. в порядке их положения в программе. При необходи- мости с помощью специальных команд эта последовательность может быть изменена Решение об изменении порядка выполнения команд программы принимается либо на основании анализа резуль- татов предшествующих вычислений, либо безусловно. 4. Принцип двоичного кодирования. Согласно этому принципу вся информация (как данные, так и команды) кодируется двоичными цифрами 0 и 1. Каждый тип информации представляется двоичной последовательностью и имеет свой формат. Последовательность би- тов в формате, имеющая определенный смысл, называется полем. В числовой информации обычно выделяют поле знака и поле знача- щих разрядов В формате команды можно выделить два поля: поле кода операции и поле адресов. Огромным преимуществом фон-неймановской архитектуры яв- ляется ее простота, поэтому данная концепция легла в основу боль- шинства компьютеров общего назначения. Однако совместное ис- пользование шины для памяти программ и памяти данных приводит к так называемому узкому месту архитектуры фон Неймана. Термин «узкое место архитектуры фон Неймана» ввел Джон Бэкус в 1977 г. в своей лекции «Можно ли освободить программирование от стиля фон Неймана?», которую он прочитал при вручении ему Премии Тьюринга. Фон-неймановская архитектура — не единственный вариант по- строения вычислительных машин, есть и другие, которые не соот- ветствуют указанным принципам (например, потоковые машины). Однако подавляющее большинство современных компьютеров осно- ваны именно на указанных принципах, включая и сложные много- процессорные комплексы, которые можно рассматривать как объ- единение фон-неймановских машин. Таким образом, на основании этих принципов можно утверждать, что современная вычислительная машина — техническое устройство, которое после ввода в память начальных данных в виде цифровых
кодов и программы их обработки, выраженной тоже цифровыми кодами, способно автоматически осуществлять вычислительный процесс, заданный программой, и выдавать готовые результаты ре- шения задачи в форме, пригодной для восприятия человеком. Рассмотрим традиционную архитектуру микропроцессорной сис- темы на примере персонального компьютер типа IBM PC. Персональный компьютер типа IBM PC состоит из материнской платы (motherboard) и внешних плат, которые взаимодействуют между собой и с ресурсами материнской платы через шину. Все пас- сивные устройства (не могущие стать задачиками) на шине можно разделить на две группы — память и устройства ввода/вывода (порты). Циклы доступа для каждой из групп отличаются друг от друга как по временным характеристикам, так и по вырабатыва- емым на шине сигналам. Стандартной шиной для персональных компьютеров типа IBM PC/AT и совместимых с ними является шина ISA (Industrial Standart Arhnecture) Шина EISA, с которой ряд фирм выпускали персональ- ные компьютеры, уступила шине PCI и в настоящее время исполь- зуется редко. Основные отличия шины ISA персонального компьютера IBM PC/AT от своей предшественницы — шины компьютера IBM PC/XT заключаются в следующем: • шина А Т компьютеров позволяет использовать на внешних платах как 16-разрядные устройства ввода/вывода, так и 16-разрядную память; • цикл доступа к 16-разрядной памяти на внешней плате может быть выполнен без вставки тактов ожидания; • объем непосредственно адресуемой памяти на внешних платах может достигать 16 Мб; • внешняя плата может становиться хозяином (задатчиком) на шине и самостоятельно осуществлять доступ ко всем ресурсам как на шине, так и на материнской плате Чисто условно, для удобства понимания функционирования шины ISA, будем считать, что на материнской плате компьютера су- ществуют следующие устройства, способные быть владельцами (за- датчиками) шины: центральный процессор (ЦП); контроллер пря- мого доступа в память (ПДП); контроллер регенерации памяти (КРП). Кроме этого, задатчиком на шине может быть и внешняя плата. При выполнении цикла доступа на шине задатчиком может быть только одно из устройств. Рассмотрим подробнее функции этих устройств на шине ISA
Центральный процессор (ЦП) является основным задатчиком на шине. По умолчанию именно ЦП будет считаться задатчиком на шине. Контроллер ПДП, а также контроллер регенерации памяти запрещают работу ЦП на время своей работы. Контроллер ПДП — это устройство, связанное с сигналами за- проса на режим ПДП и сигналами подтверждения режима ПДП. Активный сигнал запроса на ПДП будет разрешать последующий захват шины контроллером ПДП для передачи данных из памяти в порты вывода или из портов ввода в память. Контроллер регенерации памяти становится владельцем шины и генерирует сигналы адреса и чтения памяти для регенерации ин- формации в микросхемах динамической памяти как на материнской памяти, так и внешних платах. Внешняя плата взаимодействует с остальными устройствами через разъем на шине ISA. Может становиться задатчиком на шине для доступа к памяти или устройствам ввода/вывода. Кроме этого, на материнской плате компьютера имеется ряд устройств, которые не могут быть задатчиками на шине, но, тем не менее, взаимодействуют с ней. Это следующие устройства. Часы реального времени (таймер-счетчик) — это устройство со- стоит из часов реального времени для поддержки даты, времени и таймера, как правило на базе микросхемы Intel 8254А. Один из тай- меров-счетчиков этой микросхемы вырабатывает импульсы с пе- риодом 15 мкс для запуска контроллера регенерации памяти на ре- генерацию. Кросс материнской платы — часть материнской платы, которая соединяет разъемы шины ISA для подключения внешних плат с дру- гими ресурсами на материнской плате. Память на материнской плате — часть или все микросхемы па- мяти прямого доступа (оперативного запоминающего устройства, ОЗУ), используемые для хранения информации ЦП. На внешних платах также могут быть размещены микросхемы дополнительной памяти. Контроллер прерываний — это устройство связано с линиями за- просов прерываний на шине. Прерывания требуют дальнейшего об- служивания ЦП. Устройства ввода/вывода — часть или все устройства ввода/вы- вода (такие как параллельные или последовательные порты) могут размещаться как на материнской плате, так и на внешних платах. Перестановщик байтов данных — это устройство позволяет обме- ниваться данными между собой 16- и 8-разрядными устройствами.
Архитектура персонального компьютера IBM PC/AT с точки зре- ния использования шины ISA показана на рис. 1.4. Рис. 1.4. Архитектура персонального компьютера типа IBM PC Внешние платы, устанавливаемые в разъемы шины, могут быть 8- и/или 16-разрядными. Восьмиразрядная плата имеет только один интерфейсный разъем и может оперировать только с 8-разрядными данными. Восьмиразрядный слог также не может быть задатчиком на шине. Шестнадцатиразрядная плата обязательно имеет два ин- терфейсных разъема: один основной, такой же, как в 8-разрядных платах, и один дополнительный. Такая плата может оперировать как с 8-, так и с 16-разрядными данными и, кроме этого, она может быть задатчиком на шине. Общее число устанавливаемых в разъемы шины плат ограничивается как нагрузочной способностью шины, так и конструктивным исполнением материнской платы. Как правило, допускается устанавливать не более восьми (пять 16-разрядных и три 8-разрядных) внешних плат на шину. Такое ограничение вызвано также и относительно небольшим количеством свободных линий запросов на ПДП и запросов на прерывания, имеющихся на шине. Основные особенности архитектуры персональных компьютеров сводятся к принципам компоновки аппаратуры, а также к выбран- ному набору системных аппаратных средств. Важная особенность подобной архитектуры — ее открытость, т.е. возможность включения в компьютер дополнительных устройств,
причем как системных устройств, так и разнообразных плат расши- рения Открытость предполагает также возможность простого встра- ивания программ пользователя на любом уровне программного обес- печения компьютера. Первый компьютер семейства, получивший широкое распростра- нение, IBM PC XT был выполнен на базе оригинальной системной магистрали PC XT-Bus. В дальнейшем (начиная с IBM PC/AT) она была доработана до магистрали, ставшей стандартной и получившей название ISA (Industry Standard Architecture). До недавнего времени ISA оставалась основой компьютера. Однако, начиная с появления процессоров i486 (в 1989 г.), она перестала удовлетворять требованиям производительности и ее стали дублировать более быстрыми шинами: VLB (VESA Local Bus) и PCI (Peripheral Component Interconnect bus) — или заменять совместимой c ISA магистралью EISA (Enhanced ISA). Постепенно шина PCI вы- теснила конкурентов и стала фактическим стандартом, а начиная с 1999 г. в новых компьютерах рекомендуется полностью отказы- ваться от магистрали ISA, оставляя только PCI. Правда, при этом приходится отказываться от применения плат расширения, разрабо- танных за долгие годы для подключения к магистрали ISA. Другое направление совершенствования архитектуры персональ- ного компьютера связано с максимальным ускорением обмена ин- формацией с системной памятью. Именно из системной памяти компьютер читает все исполняемые команды и в системной же па- мяти хранит данные. То есть больше всего обращений процессор совершает именно к памяти. Ускорение обмена с памятью приводит к существенному ускорению работы всей системы в целом. Но при использовании для обмена с памятью системной маги- страли приходится учитывать скоростные ограничения магистрали. Системная магистраль должна обеспечивать сопряжение с большим числом устройств, поэтому она должна иметь довольно большую протяженность; она требует применения входных и выходных буфе- ров для согласования с линиями магистрали. Циклы обмена по сис- темной магистрали сложны, и ускорять их нельзя. В результате су- щественного ускорения обмена процессора с памятью по магистрали добиться невозможно. Разработчиками был предложен следующий подход. Системная память подключается не к системной магистрали, а к специальной высокоскоростной шине, находящейся «ближе» к процессору, не тре- бующей сложных буферов и больших расстояний. В таком случае обмен с памятью идет с максимально возможной для данного про-
цессора скоростью и системная магистраль не замедляет его. Осо- бенно актуальным это становится в связи с ростом быстродействия процессора. Таким образом, структура персонального компьютера из одно- шинной, применявшейся только в первых компьютерах, становится трехшинной (рис. 1.5). Рис. 1.5. Организация связей в трехшинной структуре Назначение шин следующее: • к локальной шине подключаются центральный процессор и кэш- память (быстрая буферная память); • к шине памяти подключается оперативная и постоянная память компьютера, а также контроллер системной шины; • к системной шине (магистрали) подключаются все остальные устройства компьютера. Все три шины имеют адресные линии, линии данных и управля- ющие сигналы. Но состав и назначение линий этих шин не совпа- дают между собой, хотя они и выполняют одинаковые функции. С точки зрения процессора системная шина (магистраль) в системе всего одна, по ней он получает данные и команды и передает данные как в память, так и в устройства ввода/вывода. Временные задержки между системной памятью и процессором в данном случае минимальны, так как локальная шина и шина па- мяти соединены только простейшими быстродействующими буфе- рами. Еще меньше задержки между процессором и кэш-памятью, подключаемой непосредственно к локальной шине процессора и служащей для ускорения обмена процессора с системной памятью. Если в компьютере применяются две системные шины, например ISA и PCI, то каждая из них имеет свой собственный контроллер шины и работают они параллельно, не влияя друг на друга. Тогда
получается уже четырехшинная, а иногда и пятишинная структура (рис. 1.6). Шина АСР Шина PCI Рис. 1.6. Пример многошинной структуры В наиболее распространенных настольных компьютерах класса Desktop в качестве конструктивной основы используется системная или материнская плата (motherboard), на которой располагаются все основные системные узлы компьютера, а также несколько разъемов (слотов) системной шины для подключения дочерних плат — плат расширения (интерфейсных модулей, контроллеров, адаптеров). Как правило, современные системные платы допускают замену процес- сора, выбор его тактовой частоты, замену и наращивание оператив- ной памяти, выбор режимов работы других узлов. Центральное процессорное устройство Центральное процессорное устройство (ЦПУ; англ, central processing unit, CPU, дословно — «центральное обрабатывающее устройство») — это электронный блок либо интегральная схема (микропроцессор), исполняющие машинные инструкции (код программ), главная часть аппаратного обеспечения компьютера или программируемого логи- ческого контроллера. Иногда его называют микропроцессором или просто процессором. Процессор заменяет практически всю «жесткую логику», которая понадобилась бы в случае традиционной цифровой системы. Он вы- полняет арифметические функции (сложение, умножение и т.д.), логические функции (сдвиг, сравнение, маскирование кодов и т.д.), временное хранение кодов (во внутренних регистрах), пересылку кодов между узлами микропроцессорной системы и многое другое.
Количество таких элементарных операций, выполняемых процессо- ром, может достигать нескольких сотен. Развитие вычислительной техники сопровождается совершен- ствованием центральных процессоров. При проектировании новых моделей процессоров разработчики основывались на принципах со- вместимости, т.е. разные модели процессоров, различающиеся по производительности, должны были «уметь» выполнять одни и те же команды. Новое семейство процессоров должно было иметь единую архитектуру, т.е новая модель процессора разрабатывается на основе какой-либо существующей архитектуры. Под термином архитектура процессора понимают совокупность и способ объединения компонентов процессора, а также его совмес- тимость с определенным набором команд. Знание этих двух моментов дает возможность грамотно органи- зовать интерфейс аппаратных и программных средств вычисли- тельной системы. Например, с точки зрения программиста, архи- тектура процессора — это способность процессора выполнять набор машинных кодов, а с точки зрения проектирования компьютерных составляющих архитектура процессора — это отражение основных принципов внутренней организации определенных типов процес- соров. Но даже процессоры с одинаковой архитектурой могут суще- ственно отличаться друг от друга. Эти различия обусловлены разно- образием процессорных ядер, которые обладают определенным на- бором характеристик. Наиболее частым отличием являются различ- ные частоты системной шины, а также размеры кэша второго уровня и технологические характеристики, по которым изготовлены про- цессоры Очень часто смена ядра в процессорах из одного и того же семейства требует также замены процессорного разъема, а это влечет за собой проблемы с совместимостью материнских плат. Но произ- водители постоянно совершенствуют ядра и вносят постоянные, но незначительные изменения в ядро. Такие нововведения называют ревизией ядер и, как правило, обозначаются цифро-буквенными комбинациями. Выделяют понятия микроархитектуры и макооархитектуры. Микроархитектура микропроцессора — это аппаратная органи- зация и логическая структура микропроцессора, регистры, управля- ющие схемы, арифметико-логические устройства, запоминающие устройства и связывающие их информационные магистрали. Макроархитектура — это система команд, типы обрабатываемых данных, режимы адресации и принципы работы микропроцессора.
Архитектура современных микропроцессоров представляет собой продукт нескольких независимых групп разработчиков, которые раз- вивают эту архитектуру более 15 лет, добавляя новые возможности к первоначальному набору команд. В настоящее время доминирующее положение на рынке цент- ральных процессоров занимает семейство процессоров фирмы «In- tel» с архитектурой х86, в котором декларируется программная со- вместимость моделей процессоров сверху вниз. Это значит, что код, написанный для 8086, должен работать и на 80386, и на Pentium 4. С другой стороны, программы, разработанные для более поздних процессоров, могут не работать на более ранних, если в них исполь- зуются какие-либо специфические особенности новой модели. Классификация и характеристики процессора Микропроцессоры можно классифицировать по следующим при- знакам. 1. Ло числу БИС в микропроцессорном комплекте'. • однокристальные МП; • много кристальные МП; • много кристальные секционные МП. В первую очередь на такое деление повлияли возможности БИС: ограниченное число элементов, выводов корпуса, в то время как МП — довольно сложное устройство, имеющее много логических элементов и требующее большое количество выводов корпуса БИС. Однокристальный МП получен при реализации всех аппаратных средств МП в виде одной БИС или СБИС. Основные характерис- тики таких МП зависят от технологии изготовления БИС. Многокристальные МП получены при разбиении его логической структуры на функционально законченные части и реализации их в виде БИС (рис. 1.7). Рис. 1.7. Логические структуры многокристального МП
ОП — операционный процессор, служит для обработки данных. УП — управляющий процессор, выполняет функции выборки, декодирования и вычисления адресов операндов, а также генерирует последовательность команд, формирует очередь команд. ИП — интерфейсный процессор, позволяет подключить память к МП. УП, ОП, ИП могут работать автономно (параллельно) и тем са- мым организовывать конвейер операций. Многокристальные секционные МП получаются, когда в виде БИС реализуются логические структуры МП при функциональном раз- биении ее вертикальными плоскостями (рис. 1.8). Рис. 1.8. Логические структуры многокристального секционного МП Пример. Если невозможно реализовать ОП 16 разрядов в одной БИС, ее делят на части, реализуемые каждая в своей БИС Они образуют микропроцессорные секции (например, 4-разрядная сек- ция). 2. По назначению'. • универсальные МП; • специальные МП. Универсальные МП могут быть применены для решения широкого круга задач. При этом их эффективная производительность мало зависит от проблемной специфики задачи. Как правило, это опреде- ляется достаточно широкой универсальной системой команд. Специальные МП — проблемно ориентированные МП, которые нацелены на ускоренное выполнение определенных функций, что увеличивает эффективную производительность при решении только определенной задачи: • математические процессоры; • микроконтроллеры; • параллельная обработка данных;
• цифровая обработка сигнала — цифровые фильтры и т.д. Пример. Сравнение входного сигнала одновременно с несколь- кими эталонами для выделения нужного сигнала. 3. По виду обрабатываемых входных сигналов'. • цифровые МП; • аналоговые МП. Требование к аналоговым МП: • большая разрядность; • высокая скорость арифметических операций. 4. По характеру временной организации работы: • одномагистралъные — все устройства имеют одинаковый интер- фейс и подключаются к единой информационной магистрали, по которой передаются коды данных, адресов и управляющих сигналов; • многомагистральные — устройства группами подключаются к своей информационной магистрали, это позволяет осуществить одновременную передачу информационных сигналов по несколь- ким магистралям. Производительность увеличивается. 6. По количеству выполняемых программ: • однопрограммные; • мультипрограммные. Мультипрограммные либо могут одновременно выполнять не- сколько программ, либо имеют средства для поддержки виртуальной мультипрограмности. Основные характеристики процессора Современные процессоры представляют собой сложные высо- котехнологичные устройства и описываются целым рядом показа- телей. Важнейшими характеристиками процессора являются следу- ющие. 1. Тактовая частота (clock rate) — это число элементарных опера- ций (тактов), производимых за 1 секунду. Измеряется в герцах (Hz, Гц) и их производных по системе СИ — килогерцах (kHz, кГц) мега- герцах (MHz, МГц), гигагерцах (GHz, ГГц). Тактовая частота центрального микропроцессора определяет про- изводительность как самого процессора, так и в целом всей компью- терной системы. Тем не менее с развитием современных технологий, таких как, например, суперскалярность, и созданием многоядерных процессоров нельзя установить прямо пропорциональную зависи- мость между тактовой частотой процессора и его производитель- ностью.
2. Разрядность — максимальное число одновременно обрабаты- ваемых двоичных разрядов. Разрядность МП обозначается т/п/к и зключает: • т — разрядность внутренних регистров, определяет принадлеж- ность к тому или иному классу процессоров; • п — разрядность шины данных, определяет скорость передачи информации; • к — разрядность шины адреса, определяет размер адресного про- странства. Например, МП 18088 характеризуется значениями т/п/к = 16/8/20. 3. Количество вычислительных ядер на одном процессорном крис- талле. Многоядерность как способ повышения производительности процессоров используется с относительно недавнего времени, но признана самым перспективным направлением их развития. Для домашних компьютеров уже существуют процессоры с восемью ядрами. Для серверов на рынке есть 12-ядерные предложения (Ор- teron 6100). Разработаны прототипы процессоров, содержащие около 100 ядер. Эффективность вычислительных ядер разных моделей про- цессоров отличается Но в любом случае чем ядер больше, тем про- цессор производительнее. 4 Количество потоков. Чем больше потоков, тем лучше. Количе- ство потоков не всегда совпадает с количеством ядер процессора. Так, благодаря технологии Hyper-Threading 4-ядерный процессор Intel Core i7—3820 работает в восемь потоков и во многом опережает 6-ядерных конкурентов 5. Размер кэш-памяти — 2 и 3 уровня, иногда и 4 уровня. Кэш — это очень быстрая внутренняя память процессора, которая исполь- зуется им как буфер для временного хранения информации, обраба- тываемой в конкретный момент времени. 6 Скорость шины процессора (FSB, HyperTransport или QPI). Че- рез эту шину центральный процессор взаимодействует с материн- ской платой. Ее скорость (частота) измеряется в мегагерцах, и чем она выше, тем лучше. 7. Технологический процесс. Чем выше степень интеграции (ко- личество транзисторов на кристалле), тем меньше потребляемая электроэнергия процессора. От техпроцесса во многом зависит еще одна важная характеристика процессора — TDP. 8. Termal Design Point (TDP) — показатель, отображающий энер- гопотребление процессора, а также количество тепла, выделяемого им в процессе работы. Единицы измерения — ватты (Вт). TDP за- висит от многих факторов, среди которых главными являются ко-
личество ядер, техпроцесс изготовления и частота работы процес- сора. Кроме прочих преимуществ, «холодные» процессоры (с TDP до 100 Вт) лучше поддаются разгону, когда пользователь изменяет некоторые настройки системы, вследствие чего увеличивается час- тота процессора. Разгон позволяет без дополнительных финансовых вложений увеличить производительность процессора на 15—25%, но это уже отдельная тема. В то же время проблему с высоким TDP всегда можно решить приобретением эффективной системы охлаж- дения. 9. Наличие и производительность видеоядра. Последние техниче- ские достижения позволили производителям помимо вычисли- тельных ядер включать в состав процессоров еще и ядра графиче- ские. Такие процессоры, кроме решения своих основных задач, мо- гут выполнять роль видеокарты. 10. Тип и макси чаль ная скорость поддерживаемой оперативной па- мяти. Эти характеристики процессора необходимо учитывать при выборе оперативной памяти, с которой он будет использоваться. Нет смысла переплачивать за быстрые модули ОЗУ, если процессор не сможет реализовать все их преимущества. Память вычислительных машин Память (устройство хранения информации, запоминающее устройство) — часть вычислительной машины, физическое устрой- ство или среда для хранения данных, используемая в вычислениях в течение определенного времени. Память вычислительной машины обеспечивает поддержку одной из функций современного компьютера — способность длительного хранения информации (принципа фон Неймана, заложенного в основу современных вычислительных машин). Память, как и центральный процессор, является неизменной частью вычислительной машины. В основе работы запоминающего устройства может лежать любой физический эффект, обеспечивающий приведение системы к двум или более устойчивым состояниям. Память вычислительной машины дискретна, состоит из набора последовательных ячеек памяти, каждая из которых имеет свой но- мер, называемый адресом. Ячейка памяти хранит состояние внешнего воздействия, запись информации. Эти ячейки могут фиксировать самые разнообразные физические воздействия. Они функционально аналогичны обычному электромеханическому переключателю, и ин-
формация в них записывается в виде двух четко различимых со- стояний — «1» и «О» («включено» и «выключено»). В современной компьютерной технике часто используются фи- зические свойства полупроводников, когда прохождение тока через полупроводник или его отсутствие трактуется как наличие логиче- ских сигналов 0 или 1. Устойчивые состояния, определяемые на- правлением намагниченности, позволяют использовать для хране- ния данных разнообразные магнитные материалы. Наличие или отсутствие заряда в конденсаторе также может быть положено в основу системы хранения. Отражение или рассеяние света от по- верхности CD-, DVD- или 5/д/-гау-диска также позволяет хранить информацию. Для записи объема запоминающих устройств в цифровой вычис- лительной технике и количества памяти, используемой компьютер- ной программой, применяют термин «количество информации». Единицы количества информации: 1 бит, обозначение — бит, значе- ние — 1 и байт, обозначение — Е, значение 1 Б = 8 бит (ГОСТ 8.417- 2002, табл. А1). В соответствии с международным стандартом МЭК 60027-2 еди- ницы бит и байт применяют с приставками СИ (ГОСТ 8.417-2002, табл. 8 и разд. 7). Исторически сложилась такая ситуация, что с на- именованием «байт» некорректно (вместо 1000 = 10 принято 1024 = 210) использовали (и используют) приставки СИ: 1 Кбайт = = 1024 байт, 1 Мбайт = 1024 Кбайт, 1 Гбайт = 1024 Мбайт и т.д. При этом обозначение Кбайт начинают с прописной буквы в отличие от строчной буквы «к» для обозначения множителя 10 . Специальные механизмы обеспечивают доступ (операцию записи и операцию чтения) к состоянию этих ячеек. Процесс доступа про- исходит под управлением контроллера памяти — отдельного специ- ализированного устройства, которое управляет потоком данных от оперативной памяти к процессору. Контроллер памяти может представлять собой отдельную микро- схему или быть интегрирован в микросхему северный мост или мик- ропроцессор. Также различают операцию стирания памяти — занесение (за- пись) в ячейки памяти одинаковых значений, обычно 0016 или FF16. Иерархия памяти Память в вычислительных устройствах имеет иерархическую структуру и обычно предполагает использование нескольких запо- минающих устройств, имеющих различные характеристики.
Иерархия памяти — концепция построения взаимосвязи классов разных уровней памяти вычислительных систем на основе иерархи- ческой структуры. Сущность необходимости построения иерархической памяти — необходимость обеспечения вычислительной системы (отдельного компьютера или кластера) достаточным объемом памяти, как опе- ративной, так и постоянной. Различные виды памяти образуют иерархию, на различных уров- нях которой расположены памяти с отличающимися временем до- ступа, сложностью, стоимостью и объемом. Возможность постро- ения иерархии памяти вызвана тем, что большинство алгоритмов обращаются в каждый промежуток времени к небольшому набору данных, который может быть помещен в более быструю, но доро- гую и поэтому небольшую память. Использование более быстрей памяти увеличивает производительность вычислительного ком- плекса В большинстве современных вычислительных систем использу- ется следующая иерархия памяти. 1. Процес сорная или регистровая память — это набор быстродей- ствующих регистров процессора, организованный в регистровый файл — наиболее быстрый доступ (порядка 1 такта), но размером лишь в несколько сотен или, редко, тысяч байт. 2. Кэш микропроцессора — кэш (сверхоперативная память), ис- пользуемый микропроцессором компьютера для уменьшения сред- него времени доступа к компьютерной памяти. Кэш использует небольшую, очень быструю память (обычно типа SRAM), которая хранит копии часто используемых данных из основ- ной памяти. Если большая часть запросов з память будет обрабаты- ваться кэшем, средняя задержка обращения к памяти будет прибли- жаться к задержкам работы кэша. Когда процессору нужно обратиться в память для чтения или за- писи данных, он сначала проверяет, доступна ли их копия в кэше. В случае успеха проверки процессор производит операцию, исполь- зуя кэш, что значительно быстрее использования более медленной основной памяти. Большинство современных микропроцессоров для компьютеров и серверов имеют как минимум три независимых кэша: кэш ин- струкций для ускорения загрузки машинного кода; кэш данных для ускорения чтения и записи данных и буфер ассоциативной трансля- ции (TLB) для ускорения трансляции виртуальных (логических) ад- ресов в физические как для инструкций, так и для данных.
Кэш центрального процессора разделен на несколько уровней. Максимальное количество кэшей — четыре. В универсальном про- цессоре в настоящее время число уровней может достигать трех. Кэш- память уровня N + 1, как правило, больше по размеру и медленнее по скорости доступа и передаче данных, чем кэш-память уровня N. Самым быстрым является кэш первого уровня — £ 1 cache (level 1 cache). По сути, он является неотъемлемой частью процессора, по- скольку расположен на одном с ним кристалле и входит в состав функциональных блоков. В современных процессорах обычно £1 разделен на два кэша — кэш команд (инструкций) и кэш данных (гарвардская архитектура). Большинство процессоров без £1 не мо- гут функционировать. £1 работает на частоте процессора, и в общем случае обращение к нему может производиться каждый такт За- частую является возможным выполнять несколько операций чтения/ записи одновременно. Вторым по быстродействию является кэш второго уровня — L2 cache, который обычно, как и £1, расположен на одном кристалле с процессором В ранних версиях процессоров £2 реализован в виде отдельного набора микросхем памяти на материнской плате. Объем £2 от 128 Кбайт до 1—12 Мбайт В современных многоядерных про- цессорах кэш второго уровня, находясь на том же кристалле, явля- ется памятью раздельного пользования — при общем объеме кэша в п Мбайт на каждое ядро приходится по п/с Мбайта, где с — коли- чество ядер процессора. Кэш третьего уровня наименее быстродействующий, но он может быть очень большим — более 24 Мбайт. £3 медленнее предыдущих кэшей, но все равно значительно быстрее, чем оперативная память. В многопроцессорных системах находится в общем пользовании и предназначен для синхронизации данных различных £2. Существует четвертый уровень кэша, применение которого оправ- дано только для многопроцессорных высокопроизводительных сер- веров и мейнфреймов. Обычно он реализован отдельной микросхе- мой. 3. Оперативная память (англ. Random Access Memory, RAM, па- мять с произвольным доступом; ОЗУ (оперативное запоминающее устройство) — энерго зависимая часть системы компьютерной па- мяти, в которой во время работы компьютера хранится выполня- емый машинный код (программы), а также входные, выходные и промежуточные данные, обрабатываемые процессором. Обмен данными между процессором и оперативной памятью про- изводится:
• непосредственно (рис. 1.9); • через сверхбыструю память нулевого уровня — регистры в АЛУ либо при наличии аппаратного кэша процессора — через кэш. Рис. 1.9. Простейшая схема взаимодействия оперативной памяти с микропроцессором Содержащиеся в современной полупроводниковой оперативной памяти данные доступны и сохраняются только тогда, когда на мо- дули памяти подается напряжение. Выключение питания оператив- ной памяти, даже кратковременное, приводит к искажению либо полному разрушению хранимой информации. В общем случае ОЗУ содержит программы и данные операцион- ной системы, запущенные прикладные программы пользователя и данные этих программ, поэтому от объема оперативной памяти зависит количество задач, которые одновременно может выполнять компьютер под управлением операционной системы. ОЗУ может изготавливаться как отдельный внешний модуль или располагаться на одном кристалле с процессором, например в одно- кристальных ЭВМ или однокристальных микроконтроллерах. 4. Память долговременного хранения (внешняя память) — это за- поминающие устройства, предназначенные для продолжительного (что не зависит от электропитания) хранения больших объемов ин- формации. Долговременное хранение в дорогой сверхоперативной и даже оперативной памяти, как правило, невыгодно, поэтому данные та- кого рода хранятся на накопителях: дисковых, ленточных, флэш и т.д. Наиболее известные запоминающие устройства долговременного хранения: жесткие диски (винчестеры), дискеты (гибкие магнитные диски), CD- или ЛкЛ-диски, устройства флэш-памяти. Для резервного хранения данных создаются библиотеки на съем- ных носителях, например виртуальная ленточная библиотека или
дисковый массив. Емкость съемных носителей большая, но доступ к этим данным занимает значительное время. Получение преимуществ от иерархии памяти требует совместных действий от программиста, аппаратуры и компиляторов (а также ба- зовой поддержки в операционной системе): • программисты отвечают за организацию передачи данных между дисками и памятью (ОЗУ), используя для этого файловый ввод/ вывод; современные ОС также реализуют это как подкачку стра- ниц; • аппаратное обеспечение отвечает за организацию передачи дан- ных между памятью и кэшами, • оптимизирующие компиляторы отвечают за генерацию кода, при исполнении которого аппаратура эффективно использует ре- гистры и кэш процессора. Контрольные вопросы и задания 1. Опишите общую логическую структуру микропроцессора. 2. Опишите схему взаимодействия оперативной памяти с микропроцес- сором. 3. В чем заключается отличие между компьютерами, вычислительной и информационной системами? 4. В чем отличие архитектуры вычислительной машины от ее структуры? 5. Каковы достоинства многоуровневой организации вычислительных систем? 6. Понятие семантического разрыва между уровнями. 7. Опишите структуру многоуровневой вычислительной машины. 8. Опишите принцип работы фон-неймановской вычислительной ма- шины. 9. Перечислите принципы фон Неймана, положенные в основу постро- ения современных вычислительных машин. 10. Перечислите технические и эксплуатационные характеристики вычис- лительных машин. 11. В чем заключается отличие микроархитсктуры процессора от макроар- хитектуры? 12. Перечислите основные характеристики процессора 13. Приведите примеры классификаций микропроцессора. 14. Иерархия памяти. Перечислите преимуществ от иерархии памяти.
Глава 2 АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ ОСНОВЫ ЭВМ 2.1. Арифметические основы цифровой техники В цифровых устройствах приходится иметь дело с различными видами информации. Это в чистом виде двоичная информация, та- кая как включен прибор или выключен, исправно устройство или нет. Информация может быть представлена в виде текстов, и тогда приходится буквы алфавита кодировать при помощи двоичных уров- ней сигнала. Достаточно часто информация может представлять со- бой числа. Числа могут быть представлены в различных системах счисления. Форма записи в них чисел существенно различается между собой, поэтому, прежде чем перейти к особенностям представ- ления чисел в цифровой технике, рассмотрим их запись в различных системах счисления. Системы счисления Система счисления — это совокупность приемов и правил для представления чисел с помощью цифровых знаков. Существует множество способов записи чисел цифровыми зна- ками, но любая применяемая система счисления должна обеспечи- вать: • диапазон представления любого числа; • единственность представления (каждой комбинации символов соответствует только одна величина). Все системы счисления делятся на позиционные и непозиционныс. В непозиционной системе счисления значимость цифры в любом месте числа одинакова, т.е. не зависит от позиции расположения. Например, унарная система с одним символом, равным единице. Такая система счисления предназначена для суммарного счета (узелки на «память», зарубки, черточки, счет на пальцах и пр.). Для изображения какого-то числа в этой системе нужно записать число единиц (палочек), равное данному числу. Эта система неэффективна, так как запись числа получается слишком длинной.
Другой пример «почти непозиционной» системы счисления — римская система счета. В римской системе счета используются сле- дующие символы: I — 1; V— 5; X — 10; L — 50; С — 100; D — 500; М - 1000. Правила перевода из римской системы счисления в арабскую сис- тему заключаются в следующем. Меньшая по величине цифра, сто- ящая справа от большей цифры, складывается с большей, а меньшая по величине цифра, стоящая слева от большей цифры, вычитается из большей. Пример перевода из римской системы в арабскую систему счис- ления: CCXWII = 100 + 100 + 10 + 5 + 5 + 1 + 1 = 222; XTXIV= 10+ (10-1) = 19. Как следует из правила перевода, римская система полностью не является непозиционной. Эта система применяется редко (ци- ферблат, архитектура, история и т.д.). Позиционные системы счисления — это системы счисления, в ко- торых значение цифры в записи числа N зависит от ее позиции (места). Например, в десятичной системе счисления число 05 обо- значает пять единиц, 50 обозначает пять десятков, 500 — пять сотен и т.д. Основание (базис) системы счисления (</) — это количество ис- пользуемых знаков или символов для изображения цифр в данной системе счисления. Возможно бесчисленное множество позиционных систем счис- ления, так как за основание можно принять любое число и образо- вать новую систему счисления. Примеры некоторых позиционных систем счисления и их при- менение приведены в табл. 2.1. В табл. 2.2 для удобства сопоставления приведены первые 23 числа натурального ряда чисел в различных системах счисления. Как видно из табл. 2.2, для записи одного и того же числа в раз- личных системах счисления требуется разное число позиций или разрядов. Например, 1410 = 11102 = 168 = £16. То есть в десятичной системе счисления число 14 занимает две позиции (два разряда), в двоичной системе счисления — четыре позиции, в шестнадцате- ричной системе счисления — одну позицию. Чем меньше основание системы счисления q, тем больше длина числа (длина разрядной сетки).
Примеры позиционных систем счисления Наименование системы счисления Основание системы счисления (9) Используемые цифры Применение Двоичная 2 0 и 1 В цифровой вычисли- тельной технике, дис- кретной математике, программировании и пр. Троичная 3 Любые три знака: (-, 0,+), (-1.0,+1), (А. В, Q, (X, Y, Z) или три цифры: (1,2,3) В цифровой электро- нике Восьмеричная 8 0,1, 2,..., 7 В цифровой вычисли- тельной технике, про- граммировании Десятичная 10 0, 1,2, ..., 9 Повсеместное Шестнадцате- ричная 16 0, 1,2, ...,9, А, В, С,..., F В цифровой вычисли- тельной технике, про- граммировании Шестидесяте- ричная 60 00, 01,02, ...,59 Как единицы измере- ния времени, измере- ния углов, координат, долготы и широты При заданной длине разрядной сетки ограничивается максималь- ное по абсолютному значению число, которое можно записать. Пусть длина разрядной сетки равна положительному числу N, максимальное число равно ^(g)max ~ Я ~ 1 • Например, при N= 8: A10)max= 108 _ 1 = 9999999(10); A2)max = 28- 1 = 256- 1 = 257(I0)= 1111111(2); 4i6)max= 168 - 1 = 4294967296 - 1 = 4294967295(10) = FFFFFFF(16}. Таким образом, при одинаковой длине разрядной сетки N= 8 мак- симальное по абсолютному значению 4(16)тах > Л(19)тах > 4(2)njax, т.е. чем больше q, тем больше Л((/)тах-
Натуральный ряд чисел в различных системах счисления Десятичная Двоичная Восьмеричная Шестнадцатеричная 0 0000 0 0 1 0001 1 1 2 0010 2 2 3 ООН 3 3 4 0100 4 4 5 0101 5 5 6 ОНО 6 6 7 0111 7 7 8 1000 10 8 9 1001 И 9 10 1010 12 А 11 1011 13 В 12 1100 14 С 13 1101 15 D 14 1110 16 Е 15 1111 17 F 16 10000 20 10 17 10001 21 И 18 10010 22 12 19 10011 23 13 20 10100 24 14 21 10101 25 15 22 юно 26 16 23 10111 27 17 Перевод в позиционных системах счисления Перевод в десятичную систему счисления. Любое число N в пози- ционной системе счисления можно представить в виде полинома \ = ' + ат-2Ч' ' + ••• + а\^ + + а-\с1 ' + + а + ... + в. с, где q — основание системы счисления; ц, — элемент числа Nq, при- нимающий значения 0, 1, 2, ..., {q - 1): т — номер разряда целой части, отсчитываемый от нулевого; к — число цифр в дробной части числа.
Для перевода в десятеричную систему вычисляем такую сумму. Например, число 253,2410 в обычной десятичной форме (q = 10) можно представить следующим образом: #10 = 253,24(10> = 2- 102 + 5 1С1 + 3 10° + 2 10-1 + 4 - 10“2. Пример 2.1. Двоичное число 1101,01(2) перевести в десятичную систему счисления. В двоичной системе счисления для представления чисел исполь- зуются две цифры 0 и 1 и двоичное число 1101,012 (q = 2) можно определить следующим образом: ^2=1101,012=1 -23 + 1 - 22 + 0 21 + 1 •2° + 0-2“1 + 1 -2“2 = = 8 + 4 + 0+1 + 0 +1/4= 14,2510. Если по правилам десятичной арифметики выполнить действия в правой части приведенного равенства, то получим десятичный эк- вивалент двоичного числа: 1101,012 = 8 + 4 + 0 + 1 + 0 + 1/4 = 14,2510. Пример 2.2. Восьмеричное число 53,28 (q = 8) перевести в десятич- ную систему счисления: N3 = 53,28 = 5 - 81 + 3 • 8° + 2 • 8"1 + 4 • 8“2 = 40 + 3 + 2/8 = 43,25,0. Пример 2.3. Шестнадцатеричное число Л/7,816 (q = 16) перевести в десятичную систему счисления: /У16 = ДЕ,816= 10 • 162 + 15 • 161 + 7 16% 8- 16“% = 2560 + 240 + 7 + 8/16 = 2807,2510. Перевод чисел из десятичной системы счисления в произвольную систему счисления с основанием ц. Правила перевода целой части де- сятичного числа заключается в следующем. Целую часть десятичного числа необходимо последовательно делить на q (основание произ- вольной системы счисления) до тех пор, пока десятичное число не станет равным нулю. Остатки, полученные при делении и запи- санные в последовательности, начиная с последнего остатка, явля- ются цифрами числа <?-ричной системы счисления. Правила перевода дробной части десятичного числа следующие. Дробную часть десятичного числа необходимо последовательно ум- ножать на q (основание произвольной системы) и отделять целую часть до тех пор, пока она не станет равной нулю или будет достиг- нута заданная точность перевода. Целые части результатов умножения в порядке, соответствующем их получению, составляют число в новой системе.
Пример 2.4. Число 26,62510 перевести в двоичную систему счис- ления. Переводим целую часть числа: 26 : 2 = 13, остаток равен 0; 13:2 = 6, остаток равен 1; 6:2 = 3, остаток равен 0; 3:2 = 1, остаток равен 1; 1 : 2 = 0, остаток равен 1. Десятичное число стало равно нулю, деление закончено. Пере- писываем все остатки снизу вверх и получаем двоичное число 110102. Переводим дробную часть числа: 0,625 • 2 = 1,250, целая часть 1; 0,250 • 2 = 0,506, целая часть 0; 0,500 • 2 = 1,000, целая часть 1; 0,000 • 2 = 0,000, целая часть 0. Целая часть стала равной нулю. Переписываем целые части ре- зультатов умножения сверху вниз и получаем двоичное число 0,10102. Пример 2.5. Число 70,05]0 перевести в восьмеричную систему счисления с точностью по 4-й разряд. Переводим целую часть числа: 70 : 8 = 8, остаток равен 6; 8:8 = 1, остаток равен 0; 1:8 = 0, остаток равен 1. Десятичное число стало равно нулю, деление закончено. Перепи- сываем все остатки снизу вверх и получаем восьмеричное число 1068. Переводим дробную часть числа: 0,05 • 8 = 0,40, целая часть 0; 0,40 • 8 = 3,20, целая часть 3; 0,30 • 8 = 2,40, целая часть 2; 0,40 • 8 = 3,20, целая часть 3. Целая часть не стала равной нулю, получается бесконечный ряд, процесс перевода заканчиваем, так как достигнута заданная точ- ность. Переписываем целые части результатов умножения сверху вниз и получаем восьмеричное число 0,03238. Пример 2.6. Число 76,05]0 перевести в шестнадцатеричную сис- тему счисления с точностью по 4-й разряд. Переводим целую часть числа: 76 : 16 = 4, остаток равен 12 —> С; 4:16 = 0, остаток равен 4.
Десятичное число стало равно нулю, деление закончено. Перепи- сываем все остатки снизу вверх и получаем шестнадцатеричное число 40,6. Переводим дробную часть числа: 0,05 • 16 = 0,80, целая часть 0; 0,80 • 16 = 12,80, целая часть 12 —>С; 0,80 • 16 = 12,80, целая часть 12 —> С; 0,80 • 16 = 12,80, целая часть 12 —> С Целая часть не стала равной нулю, получается бесконечный ряд, процесс перевода заканчиваем, так как достигнута заданная точ- ность. Переписываем целые части результатов умножения сверху вниз и получаем шестнадцатеричное число 0,0ССС16. Пример 2.7. Число 6610 перевести в произвольную систему счис- ления, например с основанием q = 5. Переводим целую часть числа: 66 : 5 = 13, остаток равен 1; 13:5 = 2, остаток равен 3; 2:5 = 0, остаток равен 2. Десятичное число стало равно нулю, деление закончено. Пере- писываем все остатки снизу вверх и получаем пятеричное число 23Ц. Перевод из двоичной системы в восьмеричную и шестнадцатерич- ную. Для этого типа операций существует упрощенный алгоритм. Перевод целой части. Число 2 возводится в ту степень, которая необходима для получения основания системы, в которую требуется перевести. Для восьмеричной системы (8 = 23) получаем число 3 (триада), для шестнадцатеричной системы (16 = 24) получаем число 4 (тетрада). Разбиваем переводимое число на количество цифр, равное 3 для восьмеричной системы и равное 4 для шестнадцатеричной системы счисления. Преобразуем триады по таблице триад восьмеричной системы и тетрады по таблице тетрад для шестнадцатеричной системы счис- ления (табл. 2.3). Пример 2.8, Двоичное число 1011102 перевести в восьмеричную и шестнадцатеричную системы счисления: • восьмеричная — 101 ПО —> 568; • шестнадцатеричная — 0010 1110—» 2Д6. Перевод дробной части. Алгоритм перевода дробной части из дво- ичной системы счисления в восьмеричную и шестнадцатеричную системы счисления аналогичен алгоритму целых частей числа,
Таблица триад и тетрад Триады 0 1 2 3 4 5 6 7 000 001 010 011 100 101 ПО 111 Тетрады 0 1 2 3 4 5 6 7 0000 0001 0010 ООН 0100 0101 оно 0111 8 9 А в с D Е F 1000 1001 1010 1011 1100 1101 1110 1111 но разбивка па триады и тетрады идет вправо от десятичной запятой, недостающие разряды дополняются нулями справа. Пример 2.9. Перевести 11101,010112 в восьмеричную и шестнад- цатеричную системы счисления: • восьмеричная — 011 101, 010 110—> 35,268; • шестнадцатеричная — 0001 1101, 0101 1000 -> 1 £>,5816. Перевод из восьмеричной и шестнадцатеричной систем в двоичную. Для этого типа операций существует упрощенный алгоритм-перевер- тыш. Для восьмеричной системы преобразуем по таблице в триплеты: 0 000 4- + 100; 1 —>001 5- + 101; 2—>010 6- + 110; 3^011 7- + 111. Для шестнадцатеричной — преобразуем по таблице в квартеты: 0 -+ 0000 4- + 0100 8—> 1000 С -+1100; 1 ->0001 5- + 0101 9—>1001 £>—>1101; 2—>0010 6- + 0110 А^ 1010 £->1110; 3->00Л 7- + 0111 5^1011 £—>1111. Пример 2.10. Перевести восьмеричное число 2438 и шестнадцате- ричное число7С16 в двоичную систему счисления: 243s —> 1101000112; 7С]6 —> 1111 11002. Двоичная арифметика Сложение. Таблица сложения двоичных чисел проста: 0 + 0 = 0; 0 + 1 = 1; 1 + 0=1; 1 + 1 = 10; 1 + 1 + 1 = 11.
При сложении двух единиц происходит переполнение разряда и производится перенос в старший разряд. Переполнение разряда наступает тогда, когда величина числа в нем становится равной или большей основания. Пример 2.11 Выполнить сложение в двоичной системе счис- ления. 1 1 1 Перенос в старший разряд + 1 1 0001 = 49 — первое слагаемое 1 1 01 1 =27 — второе слагаемое 1 001 1 0 0 = 76 — сумма Двоичное вычитание. Рассмотрим правила вычитания меньшего числа из большего. В простейшем случае для каждого разряда пра- вила двоичного вычитания имеют вид _ 0 _ i _ 1 ? ° 0 0 1 1 0 10 1 Когда производится вычитание (0 - 1), осуществляется заем из более старшего разряда. Знак вопроса означает, что разряд умень- шаемого изменяется в результате займа по правилу: при вычитании (0—1) в разряде разности получается единица, разряды уменьша- емого, начиная со следующего, изменяются на противоположные (инвертируются) до первой встречной единицы (включительно). После этого производится вычитание из измененных разрядов уменьшаемого. Рассмотрим пример вычитания многоразрядных чисел (из боль- шего числа вычитается меньшее). Пример 2.12. Вычитание в двоичной системе счисления: 0 111 Изменение уменьшаемого в результате займа 1 1 0 0 0 1 = 49 — уменьшаемое 1 1 0 1 1 = 27 — вычитаемое 1 0 1 1 0 = 22 — разность Умножение. Операция умножения выполняется с использованием таблицы умножения по обычной схеме (применяемой в десятичной системе счисления) с последовательным умножением множимого на очередную цифру множителя. Пример 2.13. Умножение в двоичной системе счисления:
*1011 101 1011 101. 110111 Деление. При делении столбиком приходится в качестве проме- жуточных результатов выполнять действия умножения и вычитания. Запись десятичных чисел (двоично-десятичный код) Иногда бывает удобно хранить числа в памяти процессора в де- сятичном виде (например, для вывода на экран дисплея) Для записи таких чисел используются двоично-десятичные коды Для записи одного десятичного разряда используется четыре двоичных бита (те- трады). При помощи четырех бит можно закодировать 16 цифр (24 =16). Лишние комбинации в двоично-десятичном коде являются запрещенными. Соответствие двоично-десятичного кода и десятич- ных цифр приведено в табл. 2.4. Таблица 2,4 Соответствие двоично-десятичного кода и десятичных цифр Двоично-десятичный код Десятичный код 0 0 0 0 0 0 0 0 1 1 0 0 1 0 2 0 0 1 1 3 0 1 0 0 4 0 1 0 1 5 0 1 1 0 6 0 1 1 1 7 1 0 0 0 8 1 0 0 1 9 Остальные комбинации двоичного кода в тетраде являются за- прещенными. Пример 2.14. Записать двоично-десятичный код числа 125810: 125810 = 0001 0010 0101 10С02. В первой тетраде записана цифра 1. во второй — 2, в третьей — 5, а в последней тетраде записана цифра 8. В данном примере для за-
писи числа 1258 потребовалось четыре тетрады. Количество ячеек памяти микропроцессора зависит от его разрядности. При 16-раз- рядном процессоре все число уместится в одну ячейку памяти. Пример 2.15. Записать двоично-десятичный код числа 58910: 58910 = 0000 0101 1000 10012. В данном примере для записи числа достаточно трех тетрад, но ячейка памяти 16-разрядная. Поэтому старшая тетрада заполня- ется нулями. Они не изменяют значение цифры. При записи десятичных чисел часто требуется записывать знак числа и десятичную запятую (в англоязычных странах — точку). Дво- ично-десятичный код часто применяется для набора телефонного номера или набора кодов телефонных служб. В этом случае кроме десятичных цифр часто применяются символы «*» или «#». Для за- писи этих символов в двоично-десятичном коде применяются запре- щенные комбинации (табл. 2.5). Таблица 2.5 Соответствие двоично-десятичною кода и дополнительных символов Двоично-десятичный код Дополнительный символ 1 0 1 0 * (звездочка) 1 0 1 1 # (решетка) 1 1 0 0 + (плюс) 1 1 0 1 — (минус) 1 1 1 0 , (десятичная запятая) 1 1 1 1 Символ гашения Достаточно часто в памяти процессора для хранения одной деся- тичной цифры выделяется одна ячейка памяти (8-, 16- или 32-раз- рядная). Это делается для повышения скорости работы программы. Для того чтобы отличить такой способ записи двоично-десятичного числа от стандартного, способ записи десятичного числа, как это показано в примере, называется упакованной формой двоично-де- сятичного числа Пример 2.16. Записать неупакованный двоично-десятичный код числа 125810 для 8-разрядного процессора: 1258 00000001 00000010 00000101 00001000
В первой строке записана цифра 1, во второй — 2, в третьей — 5, а в последней строке записана цифра 8. В данном примере для за- писи числа 1258 потребовалось четыре строки (ячейки памяти) Суммирование двоично-десятичных чисел. Суммирование дво- ично-десятичных чисел можно производить по правилам обычной двоичной арифметики, а затем производить двоично-десятичную коррекцию. Двоично-десятичная коррекция заключается в про- верке каждой тетрады на допустимые коды Если в какой-либо те- траде обнаруживается запрещенная комбинация, то это говорит о переполнении. В этом случае необходимо произвести двоично- десятичную коррекцию. Двоично-десятичная коррекция заключа- ется в дополнительном суммировании числа шесть (число запре- щенных комбинаций) с тетрадой, в которой произошло перепол- нение или произошел перенос в старшую тетраду. Приведем пример: 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 10 10 11 Во второй тетраде обнаружилась запрещенная комбинация. Про- водим двоично-десятичную коррекцию: суммируем число шесть со второй тетрадой: 0 0 10 10 11 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 Формы представления в ЭВМ числовых данных В математике используются две формы записи чисел: есте- ственная (число записывается в естественном натуральном виде) и нормальная (запись числа может быть различной в зависимости от ограничений, накладываемых на форму). Примеры естественной формы записи чисел: 15300 — целое число; 0,000564 — правильная дробь; 6,4540 — неправильная дробь. Пример нормальной Формы записи одного и того же числа 25 340 в зависимости от ограничений, накладываемых на нормальную форму: 25340 = 2,534- 104 = 0,2534 • 105 = 2 534 000 10"2ит.д.
В вычислительной технике при естественном представлении чи- сел устанавливается длина разрядной сетки, а также фиксированное распределение дробной и целой частей. Поэтому такой способ пред- ставления чисел называется с фиксированной запятой. Представление числа в нормальной форме называют представле- нием с плавающей запятой (положение запятой меняется). С числами, представленными в форме с плавающей запятой, ра- ботают в основном универсальные ЭВМ, а специализированные ЭВМ — с фиксированной запятой, но целый ряд машин работает с числами в этих двух форматах. Характер программирования зависит от способа представления чисел. Так, при написании программ для ЭВМ, работающих в системе с фиксированной запятой, необходимо отслеживание положения запятой, а для выполнения операций с плавающей запятой требу- ется большее число микроопераций, что снижает быстродействие ЭВМ Фиксированная запятая (точка) В современных ЭВМ способ представления чисел с фиксирован- ной запятой в вычислительной технике используется преимуще- ственно для представления целых чисел. Так как числа бывают положительными и отрицательными, то в разрядной сетке при их машинном представлении один или два разряда (для модифицированных кодов) отводятся под знак числа, а остальные разряды образуют поле числа. В знаковые разряды, кото- рые могут располагаться как в начале, так и в конце числа, записы- вается информация о знаке числа. Знак *+» кодируется нулем, знак «-» кодируется единицей. Для модифицированных кодов знак «+» кодируется двумя нулями, знак «-» кодируется двумя еди- ницами. Модифицированные коды введены для обнаружения непра- вильного результата вычислений, т.е. когда результат превышает максимальный размер разрядной сетки и необходим перенос из зна- чащего разряда. Например, в результате выполнения операций в знаковом разряде число 01 свидетельствует о положительном переполнении разрядной сетки, а число 10 — об отрицательном переполнении разрядной сетки. Поле числа имеет постоянное число разрядов — п. Диапазон представления целых чисел ограничивается значениями -(2" - 1) и+(2"-1).
Например, в двоичном коде, используя 6-разрядную сетку, чис- ло 7 в форме с фиксированной запятой можно представить в виде 0.001112, где цифра левее точки — это знак числа, а цифры правее точки — мантисса числа в прямом коде. Здесь подразумевается, что запятая фиксирована правее младшего разряда, а точка в изображении числа в данном случае просто разделяет знаковый бит от мантиссы числа. В дальнейшем часто будет использоваться в примерах такой вид представления числа в машинной форме. Можно использовать и другую форму представления числа в машинной форме: [0]001112, где знаковый разряд выделяется квадратными скобками. Количество разрядов в разрядной сетке, отведенное для изобра- жения мантиссы числа, определяет диапазон и точность представле- ния числа с фиксированной запятой. Максимальное по абсолютной величине двоичное число изображается единицами во всех разрядах, исключая знаковый, т.е. для целого числа |/1|тах = (2(и - 1) - 1), где п — полная длина разрядной сетки. В случае 16-разрядной сетки |Л|тах= (2(16 - 1) - 1) = 3276710, т.е. диапазон представления целых чисел в этом случае будет от 4-3 276 710 до -3276710. Для случая, когда запятая фиксируется правее младшего разряда мантиссы, т.е. для целых чисел, числа, у которых модуль больше чем (2(л - 1) - 1) и меньше единицы, не представляются в форме с фик- сированной запятой. Числа, по абсолютной величине меньшие еди- ницы младшего разряда разрядной сетки, называются в этом случае машинным нулем. Отрицательный ноль запрещен. В некоторых случаях, когда можно оперировать только модулями чисел, вся разрядная сетка, включая самый старший разряд, отво- дится для представления числа, что позволяет расширить диапазон изображения чисел.
Представление отрицательных чисел в формате с фиксированной запятой В компьютерах в целях упрощения выполнения арифметических операций применяются специальные двоичные коды для представ- ления отрицательных чисел: обратный и дополнительный. При по- мощи этих кодов упрощается определение знака результата операции при алгебраическом сложении. Операция вычитания (или алгебра- ического сложения) сводится к арифметическому сложению операн- дов, облегчается выработка признаков переполнения разрядной сетки. В результате упрощаются устройства компьютера, выполня- ющие арифметические операции. Известно, что одним из способов выполнения операции вычита- ния является замена знака вычитаемого на противоположный и при- бавление его к уменьшаемому: А-В = А + (-В). Этим операцию арифметического вычитания заменяют опера- цией алгебраического сложения, которую можно выполнить при помощи двоичных сумматоров Для машинного представления отрицательных чисел используют коды: прямой, дополнительный, обратный. Упрощенное опреде- ление этих кодов может быть дано следующим образом. Если число А в обычном двоичном коде (прямом двоичном коде) изобразить как Mlup~ ' ф;-1 Ф)’ тогда число —А в этом же коде представляется как [—Д]Пр — 1'ОП ^и-1 а в обратном (инверсном) коде это число будет иметь вид [-Л]об=1.я„ ап_х a„_2....aiao, где а, = 1, если а, = О, а,-0, если а,= 1, а, — цифра /-го разряда двоичного числа. Следовательно, при пере- ходе от прямого кода к обратному все цифры разрядов матиссы числа инвертируются. Тогда число -А в дополнительном коде изображается в виде Н4]доп= [-Л|об+ 1.
Таким образом, для получения дополнительного кода отрицатель- ных чисел нужно сначала инвертировать цифровую часть исходного числа, в результате чего получается его обратный код, а затем доба- вить единицу в младший разряд цифровой части числа. Дополнительный код некоторого числа получается его заменой на новое число, дополняющее его до числа, равного весу разряда, следующего за самым старшим разрядом разрядной сетки, исполь- зуемой для представления мантиссы числа в формате с фиксирован- ной запятой. Поэтому такой код числа называется дополнительным. Представим, что мы имеем только два разряда для представления чисел в десятичной системе счисления. Тогда максимальное число, которое можно изобразить, будет 99, а вес третьего, несуществу- ющего старшего разряда будет 102, т.е. 100. В таком случае для числа 20 дополнительным будет число 80, которое дополняет 20 до 100 (100 - 20 = 80). Следовательно, по определению вычитание 50-20 = 30 можно заменить на сложение: 50 + 80= 1 30. Здесь старшая единица выходит за пределы выделенной разряд- ной сетки, в которой остается только число 30, т.с. результат вычи- тания из 50 числа 20. А теперь рассмотрим похожий пример для чисел, представленных 4-разрядным двоичным кодом. Найдем дополнительное число для 00102 = 210. Надо из [1J0000 вычесть [0]0010, получим [0] 1110, которое и является дополнительным кодом 2. Разряд, изображенный в квад- ратных скобках, на самом деле не существует. Но так как у нас 4-раз- рядная сетка, то выполнить такое вычитание в принципе невоз- можно, а тем более мы стараемся избавиться от вычитания. Поэтому дополнительный код числа получают способом, описанным ранее, т.е. сначала получают обратный код числа, а затем прибавляют к нему единицу: Проделав все это с нашим числом (2), нетрудно убе- диться. что получится аналогичный ответ. Подчеркнем, что дополнительный и обратный коды используются только для представления отрицательных двоичных чисел в форме с фиксированной запятой. Положительные числа в этих кодах не ме- няют своего изображения и представляются, как в прямом коде. Таким образом, цифровые разряды отрицательного числа в пря- мом коде остаются неизменными, а в знаковой части записывается единица.
Рассмотрим простые примеры. Семерка в прямом коде представляется так: [7]пр = 0.0001112. Число -7 в прямом коде [-7]пр= 1.0001112, а в обратном коде будет иметь вид [-7]об= 1,1110002, т.е. единицы заменяются нулями, а нули — единицами. То же число в дополнительном коде будет [-7]деп=1.1П0012. Рассмотрим еще раз, как процедура вычитания при помощи пред- ставления вычитаемого в дополнительном коде сводится к процедуре сложения Вычтем из 10 число 7: 10 - 7 - 3. Если оба операнда пред- ставлены в прямом коде, то процедура вычитания выполняется так: 0.001010 -J .0001 Н 0.000011 = 310. А если вычитаемое, т.е. -7, представить в дополнительном коде, то процедура вычитания сводится к процедуре сложения: 0.001010 + 1 ИРАН 1 0.000011 = 310. В настоящее время в компьютерах для представления отрицатель- ных чисел в формате с фиксированной запятой обычно используется дополнительный код. Вещественные числа Числовые величины, которые могут принимать любые значения (целые и дробные), называются вещественными числами. Вещественные числа в памяти компьютера представляются в форме с плавающей точкой. Форма с плавающей точкой использует представление вещественного числа R в виде произведения ман- тиссы т на основание системы счисления р в некоторой целой сте- пени п, которую называют порядком'. R — mp".
Например, число 25,324 можно записать в таком виде: 0.25324 102. Здесь т = 0.25324 — мантисса; п = 2 — порядок. Порядок указы- вает, на какое количество позиций и в каком направлении должна «переплыть», т.е. сместиться, десятичная точка в мантиссе. Отсюда название «плавающая точка». Однако справедливы и следующие равенства: 25,324 = 2,5324 • 101 = 0,0025324 104 = 2532,4 • 10“2 и т.п. Получается, что представление числа в форме с плавающей точ- кой неоднозначно? Чтобы не было неоднозначности, в ЭВМ исполь- зуют нормализованное представление числа в форме с плавающей точ- кой. Мантисса в нормализованном представлении должна удовле- творять условию 0,lp<w< Иначе говоря, мантисса меньше единицы и первая значащая цифра — не ноль. Значит, для рассмотренного числа нормализован- ным представлением будет 0.25324 • 102 В разных типах ЭВМ при- меняются различные варианты представления чисел в форме с пла- вающей точкой. Для примера рассмотрим один из возможных. Пусть в памяти компьютера вещественное число представляется в форме с плавающей точкой в двоичной системе счисления (р - 2) и зани- мает ячейку размером 4 байта. В ячейке должна содержаться следу- ющая информация о числе: знак числа, порядок и значащие цифры мантиссы. Вот как эта информация располагается в ячейке: ± машинный порядок МАНТИССА 1-й байт 2-й байт 3-й байт 4-й байт В старшем бите 1-го байта хранится знак числа. В этом разряде нуль обозначает плюс, единица — минус. Оставшиеся 7 бит первого байта содержат машинный порядок. В следующих трех байтах хра- нятся значащие цифры мантиссы. В семи двоичных разрядах помешаются двоичные числа в диапа- зоне от 0000000 до 1111111. В десятичной системе это соответствует диапазону от 0 до 127 — всего 128 значений. Знак порядка в ячейке не хранится. Но порядок, очевидно, может быть как положительным так и отрицательным. Разумно эти 128 значений разделить поровну между положительными и отрицательными значениями порядка.
В таком случае между машинным порядком и истинным (назовем его математическим) устанавливается следующее соответствие: Машинный порядок 0 1 2 3 64 65 125 126 127 Математический порядок -64 -63 -62 -61 0 1 61 62 63 Если обозначить машинный порядок Мр, а математический — р, то связь между ними выразится формулой Мр =р + 64. Итак, машинный порядок смещен относительно математического на 64 единицы и имеет только положительные значения. При выпол- нении вычислений с плавающей точкой процессор это смещение учитывает. Полученная формула записана в десятичной системе. Поскольку 64|0 = 4016 (проверьте!), то в шестнадцатеричной системе формула примет вид ^Р\ь~Р\б + 40]6. И наконец, в двоичной системе Мр2 =р2 + юо 00002. Теперь мы можем записать внутреннее представление числа 25,324 в форме с плавающей точкой. 1. Переведем его в двоичную систему счисления с 24 значащими цифрами: 25,32410 = 11001,01010010111100011012. 2. Запишем в форме нормализованного двоичного числа с пла- вающей точкой: 0,110010101001011110001101 • Ю101. Здесь мантисса, основание системы счисления (210 = 102) и поря- док (5]о = 1012) записаны в двоичной системе. 3. Вычислим машинный порядок: Мр2 = 101 + 100 0000 = 100 0101. 4. Запишем представление числа в ячейке памяти: I 01000101 | 11001010 | 10010111 | 10001101~| Это и есть искомый результат. Его можно переписать в более ком- пактной шестнадцатеричной форме:
| 45 | G4 | 97 | 8Д | Для того чтобы получить внутреннее представление отрицатель- ного числа -25,324, достаточно в полученном выше коде заменить в разряде знака числа 0 на 1 Получим: I 11000101 | 11001010 | 10010111 | 10001101 ' А в шестнадцатеричной форме: | С5 | С4 | 97 | 8£>~| Никакого инвертирования, как для отрицательных чисел с фик- сированной точкой, здесь не происходит. Рассмотрим, наконец, вопрос о диапазоне чисел, представимых в форме с плавающей точкой. Очевидно, положительные и отрица- тельные числа расположены симметрично относительно нуля. Сле- довательно, максимальное и минимальное числа равны между собой по модулю: Атах = |/?т1П|. Наименьшее по абсолютной величине число равно нулю. Чему же равно Атах? Это число с самой большой ман- тиссой и самым большим порядком: одпипппшшшпп ю’111111. Если перевести в десятичную систему, то получится 2?тах = (1 - 2 24) 264= 1019. Очевидно, что диапазон вещественных чисел значительно шире диапазона целых чисел. Если в результате вычислений получается число, по модулю большее чем Rmax, то происходит прерывание ра- боты процессора. Такая ситуация называется переполнением при вычислениях с плавающей точкой. Наименьшее по модулю ненуле- вое значение равно (1/2)-2“64 = 2“66. Любые значения, меньшие данного по абсолютной величине, воспринимаются процессором как нулевые. Как известно из математики, множество действительных чисел бесконечно и непрерывно. Множество же вещественных чисел, представимых в памяти ЭВМ в форме с плавающей точкой, является ограниченным и дискретным. Каждое следующее значение получа- ется прибавлением к мантиссе предыдущего единицы в последнем
(24-м) разряде. Количество вещественных чисел, точно представи- мых в памяти машины, вычисляется по формуле A=2r- (U-L+ 1) + 1. Здесь t — количество двоичных разрядов мантиссы; U — макси- мальное значение математического порядка; L — минимальное зна- чение порядка. Для рассмотренного нами варианта (Z = 24, U = 63, L = -64) получается N= 2146 683 548. Все же остальные числа, нс попадающие в это множество, но на- ходящиеся в диапазоне допустимых значений, представляются в па- мяти приближенно (мантисса обрезается на 24-м разряде). А по- скольку числа имеют погрешности, то и результаты вычислений с этими числами также будут содержать погрешности. Из сказанного следует вывод: вычисления с вещественными числами в компьютере выполняются приближенно. Единицы измерения информации Бит (англ, binary digit, также игра слов: англ, bit — немного) (один двоичный разряд в двоичной системе счисления) — одна из самых известных единиц измерения количества информации. Ниббл (англ, nibble, nybble), или полубайт, — единица измерения информации, равная четырем двоичным разрядам (битам); удобна тем, что представима одной шестнадцатеричной цифрой, т.е. явля- ется одним шестнадцатеричным разрядом. Байт (англ, byte, представляет собой сокращение словосочетания BmarY ТЕпп — «двоичный терм») — единица хранения и обработки цифровой информации. В современных вычислительных системах байт считается равным восьми битам, в этом случае он может при- нимать одно из 2’’ - 256 различных значений (состояний, кодов). Од- нако в истории компьютеров известны решения с другим размером байта, например 6 битов, 36 битов в PDP-10. Поэтому иногда в ком- пьютерных стандартах и официальных документах для однозначного обозначения 8-битного слова используется термин «октет» (лат. oc- tet) В большинстве вычислительных архитектур байт — это мини- мальный независимо адресуемый набор данных. Машинное слово — машиннозависимая и платформозависимая величина, измеряемая в битах или байтах (тритах или трайтах), рав- ная разрядности регистров процессора и/или разрядности шипы данных (обычно некоторая степень двойки). На ранних компьютерах
размер слова совпадал также с минимальным размером адресуемой информации (разрядностью данных, расположенных по одному ад- ресу); на современных компьютерах минимальным адресуемым бло- ком информации обычно является байт, а слово состоит из несколь- ких байтов. Машинное слово определяет следующие характеристики аппаратной платформы: • разрядность данных, обрабатываемых процессором; • разрядность адресуемых данных (разрядность шины данных); • максимальное значение беззнакового целого типа, напрямую под- держиваемого процессором: если результат арифметической опе- рации превосходит это значение, то происходит переполнение; • максимальный объем оперативной памяти, напрямую адресуемой процессором. Десятичные и двоичные кратные приставки Двоичные приставки — приставки перед единицами измерения, обозначающие их умножение на 210 = 1024. Благодаря близости чисел 1024 и 1000 двоичные приставки построены по аналогии со стандарт- ными десятичными приставками СИ. Каждая двоичная приставка получается заменой последнего слога соответствующей десятичной приставки на би (от лат. binarius — двоичный). Двоичные приставки используются для образования единиц измерения информации, кратных битам и байтам. Приставки были введены Международной электротехнической комиссией (МЭК) в марте 1999 г. Выглядят они следующим образом (табл. 2.6). Представление текстовой информации в ЭВМ. Кодировки ASCII и Unicode Для представления текстовой информации в ЭВМ графическому отображению каждого символа сопоставляется некий код. Набор символов/кодировка (англ, character set) — таблица, задающая коди- ровку конечного множества символов алфавита (обычно элементов текста: букв, цифр, знаков препинания). Такая таблица сопоставляет каждому символу последовательность длиной в один или несколько символов другого алфавита, например нулей и единиц (битов). ASCII (англ. American Standard Code for Information Inter- change) — американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодов (коды с 0x00 по 0x1 F). ASCII представляет собой кодировку для представления десятич- ных цифр, латинского и национального алфавитов, знаков препи-
Таблица 2.6 Двоичные приставки для обра зовалия единиц измерения информации Двоичная приставка Аналогичная десятичная приставка Сокращения по МЭК для битов, байтов Значение, на которое умножается исходная величина киби/kibi (210) кило (103) Кибит, КиЬ/KiB 210= 1024 меби/mebi (220) мега (106) Мибит, МиБ/MiB 220 = 1 048 576 гиби/gibi (230) гига (109) Гибит, ГиБ/GiB 230= 1073741 824 теби/tebi (240) тера (1012) Тибит, ТиБ/Т)В 240= 1099511 627776 пеби/pebi (250) пета (1015) Пибит, ПиБ/PiB 250 = 1 125899906842624 эксби/exbi (260) экса (1018) Эибит, ЭиБ/EiB 260= 1 152921504606846976 зеби/zebi (2 °) зетта (1021) Зибит, ЗиБ/71В 2™= 1 180591620717411303424 йоби/yobi (280) йотта (1024) Йибит, ЙиБ/YiB 280= 1208 925 81961^629 174706 176
нания и управляющих символов. Изначально разработанная (в 1963 г.) как 7-битная, после широкого распространением 8-бит - ного байта ASCII стала восприниматься как половина 8-битной. В компьютерах обычно используют расширения ASCII с задейство- ванным 8-м битом и второй половиной другой кодовой таблицы (на- пример, КОИ 8). Юникод или Уникод (англ. Unicode) — стандарт кодирования сим- волов, позволяющий представить знаки практически всех письмен- ных языков. Стандарт предложен в 1991 г. некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium, Unicode Inc.). Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей: в документах Unicode мо- гут соседствовать китайские иероглифы, математические символы, буквы греческого алфавита, латиницы и кириллицы; при этом ста- новится ненужным переключение кодовых страниц. Стандарт состоит из двух основных разделов: универсального на- бора символов (англ. UCS, universal character set) и семейства коди- ровок (англ. UTF, Unicode transformation format). Универсальный набор символов задает однозначное соответствие символов кодам, пред- ставляющим неотрицательные целые числа. Семейство кодировок определяет машинное представление кодов UCS. Для определения формата представления Юникода в начало тек- стового файла записывается сигнатура — код FEFF (символ с таким кодом в Unicode отсутствует), также именуемый меткой порядка бай- тов (англ, byte order mark, BOM). Также этот способ иногда применя- ется для обозначения формата UTF&, хотя к этому формату и непри- менимо понятие порядка байтов. Основные Umcode-кодировки: • UTF-8 (EF ВВ BF); • UTF-16BE (FE FF); • UTF-16LE (FF FE); • UTF-32BE (0000 FE FF); • UTF-32LE (FF FE0000). 2.2. Логические основы цифровой техники Основные сведения из алгебры логики Математический аппарат, на основе которого осуществляется описание цифровых схем, — это алгебра логики, или, как ее еще на- зывают по имени автора — английского математика Джорджа Буля
(1815—1864), булева алгебра. В практических целях первым применил ее американский ученый Клод Шеннон в 1938 г. при исследовании электрических цепей с контактными выключателями. Логика — наука, изучающая методы доказательств и опроверже- ний, т.е. методы установления истинности или ложности одних вы- сказываний (утверждений, суждений) на основе истинности или ложности других высказываний. Алгебра логики также называется исчислением высказываний. Высказывание — это некое предложение, относительно которого можно утверждать, что оно или истинно, или ложно, и других воз- можностей нет («принцип двузначности — исключенного третьего»). Высказывания отличаются от других языковых образований тем, что им можно присвоить только два значения: значение «истина», если они истинны; значение «ложь», если они ложны. Если логика имеет дело со смыслом высказываний, то в алгебре логики работают с формулами. Любое элементарное высказывание обозначается буквой латинского алфавита. Примеры простых высказываний А—<2 плюс 2 будет 4> — это истинное высказывание; 5-<Кишинев — столица Румынии> — это ложное высказывание. Из простых высказываний можно строить более сложные, при- меняя так называемые связи. Поскольку высказывание может принимать одно из двух значе- ний, то говорят о «переменных высказываниях». Замещение пере- менной конкретным высказыванием означает предоставление од- ного из значений — «истина» или «ложь». Из элементарных высказываний с помощью логических связок «и», «или», «не», «если: то» и др. (логических операций) строятся сложные высказывания — формулы (или функции) алгебры логики. Логические связи — это функция алгебры логики (ФАЛ), аргумен- тами которой являются простые высказывания. Примеры сложных высказываний Возьмем простое высказывание: Л=<один плюс один — три>, тогда сложное высказывание НЕЛ означает: неверно, что Л, т.е. не- верно, что <один плюс один — три>. Данное высказывание реализу- ется схемой «НЕ» (инвертором). Возьмем два простых высказывания: Л-<Москва — столица РФ>; 5-<дважды два — четыре>. Тогда сложное высказывание А&В будет истинным, так как истинны оба этих высказывания Поскольку таблица истинности для
конъюнкции совпадает с таблицей умножения, то истинному выска- зыванию присваивается значение «1», а ложному — «О», поэтому сложное высказывание называется произведением. Способы построения новых высказываний из заданных с по- мощью логических связок, их преобразования и установления ис- тинности изучаются в логике высказываний с помощью алгебраиче- ских методов. Базовыми элементами, которыми оперирует алгебра логики, яв- ляются высказывания. Высказывания строятся над множеством В, состоящим всего из двух элементов: В - {Ложь, Истина}. Над элементами данного множества определены три операции: • отрицание (унарная операция); • конъюнкция (бинарная), дизъюнкция (бинарная); • логический ноль и логическая единица — константы. Алгебра логики рассматривает логические выражения как алгеб- раические, которые можно преобразовать по определенным прави- лам. Б выражениях алгебры логики переменные являются логиче- скими (0 и 1). Знаки операций обозначают логические операции (логические связки). Законы алгебры логики Связи, существующие между логическими операциями, отражают законы булевой алгебры. Сформулируем основные из них. Аксиомы. 1) х + 0 = х; х • 0 = 0; 2) х + 1 = 1; х • 1 = х; 3) х + х = х; х • х = х; 4) х + х = 1; х • х = 0; 5) х = х. Законы'. 6. Коммутативный закон: х + у = у + х; х у = у • X. 7. Ассоциативный закон: (х + у) + z = х + (у + г); (х • у) • Z = X • (у Z). 8. Дистрибутивный закон: х (у + z) = х у + х z', х + (у • z) = (х + у) • (х + г).
9. Правила де Моргана X + у = X + У', X у - X • у. 10. Закон поглощения: х + х у - х; х (х + у) = х. 11. Закон свертки: х + х • у - х + у; X (х 4- у) - X у. 12. Закон склеивания: х у + х у - х; (х + у)(х + у) = X. Справедливость данных аксиом и законов можно доказать мето- дом подстановки. Правило старшинства логических операций устанавливает очеред- ность выполнения логических операций в логических функциях, т.е. логические операции обладают приоритетом и выполняются в следующей очередности: • одиночное отрицание; • конъюнкция; • дизъюнкция, сложение по модулю 2 и т.д.; • общее отрицание. Всякое отклонение от этого порядка должно быть обозначено скобками. Функции алгебры логики Логической функцией называется функция F(X}, Х2, Х3, ..., Xt, ..., А„), которая, так же как и ее аргументы, может принимать только два значения (0 и 1). Рассмотрим некоторый набор аргументов {ХъХ2,Х3,...,Хь...,Хп} и будем считать, что каждый из аргументов принимает только одно из двух возможных значений: 0 или 1. Число различных наборов равно 2". Так как функция на каждом наборе может принять значение 0 или 1, а число различных наборов 2", то общее число различных функций п аргументов есть 2 Зависимость количества различных переключательных функций от числа аргументов представлена в табл. 2.7.
Зависимость количества функций от числа аргументов Число аргументов 1 2 3 4 5 Количество переключательных функций 4 16 256 65 536 4294967296 Элементарная логическая функция реализуется с помощью логи- ческого элемента компьютера (часть электронной логической схемы). С помощью элементарных схем можно реализовать любую сложную логическую функцию, описывающую работу устройств компьютера. Работу логических элементов описывают с помощью таблиц ис- тинности. Таблица истинности — это табличное представление ФАЛ, в кото- ром перечислены все возможные сочетания значений истинности входных сигналов (операндов) вместе со значением истинности вы- ходного сигнала (результата операции) для каждого из этих сочета- ний. Чтобы задать ФАЛ, нужно задать ее значения на всех наборах ар- гументов. Эти функции реализуются на четырех элементах, каждый из которых имеет максимум один вход. ФАЛ от одного аргумента представлены в табл. 2.8, от двух переменных — в табл. 2 9. Таблица 2.8 ФАЛ от одного аргумента Аргумент X Значение Наименование функции Обозначение функции 0 1 /0(Т) 0 0 Константа «Ноль» F(X) = 0 Л(Т) 0 1 Переменная X F(X)=X т 1 0 Инверсия X (отрицание X) Ь S Il II ^1 fl{X) 1 1 Константа «Единица» F(X)=1 Логика высказываний послужила основным математическим ин- струментом при создании компьютеров. Она легко преобразуется в битовую логику: истинность высказывания обозначается одним битом (0 - ЛОЖЬ, 1 - ИСТИНА). Впоследствии булева алгебра была отделена от логики высказыва- ний путем введения характерных для логики высказываний аксиом. Это позволило рассматривать, например, логику кубитов, трой- ственную логику (когда есть три варианта истинности высказывания: «истина», «ложь» и «не определено»), комплексную логику и др.
ФАЛ от двух аргументов Номер функции Значение функции на набо- рах логических переменных Наименование функции Обозначение функции л 0 0 1 1 Х2 0 1 0 1 /0(Л1,Л2) 0 0 0 0 Константа «Ноль» /Щ,Л2) = 0 /1(^1, А2) 0 0 0 1 Конъюнкция, произведение f(Xl,X2)=Xl &Х2 f(Xl,X2) = Xl ЛХ2 f(Xl,X2) = Xl XI f(Xl,X2)=Xl Х2 /2(%1,А2) 0 0 1 0 Запрет по Х2 XI ХХ2 ft(X\,Xl) 0 0 1 1 Переменная Л f(Xl,X2)=Xl /4(Л,А2) 0 1 0 0 Запрет по XI Х2АХ1 /5(Л,А2) 0 1 0 1 Переменная XI f(Xl,X2)=X2 /Б(Л,Л2) 0 1 1 0 Сложение по mod2 (нерав- нозначность) f(Xl,X2) = X\ ®X2 fl(X\, Х2) 0 1 1 1 Дизъюнкция f(X\,X2)=X\ vX2 j\X\,X2)=X\X X2 /8(%1,А2) 1 0 0 0 Стрелка Пирса f{X\,Xl)=X\ 1X2 /9(%1, Х2) 1 0 0 1 Равнозначность f(Xl,X2)=Xl =X2 f(Xl,X2)=Xl ~ X2 П0(Х1,Х2) 1 0 1 0 Инверсия XI f(X\, X2)=X2 f(X\,X2) = A 2 Л 1Ш, XI) 1 0 1 1 Импликация отАЗкЛЛ f(X\,X2.)=X2^X\ f!2(Xl,X2) 1 1 0 0 Инверсия XI f(X\,X2)=X\ f(X\,X2) = xi fl3(Xl,X2) 1 1 0 1 Импликация от АЛ кА2 f(Xl,X2)=Xl ->X2 /14(Х1,Х2) 1 1 1 0 Штрих Шеффера f(Xl,X2)=Xl 1X2 f!5(Xl,X2) 1 1 1 1 Константа «Единица» f(Xl,X2)=l
Математический аппарат алгебры логики используется для кон- струирования электронных устройств, так как основной системой счисления в компьютере является двоичная система. Особенностью алгебры логики является применимость для опи- сания работы дискретных устройств вычислительной техники. Одни и те же устройства компьютера могут применяться для обработки и хранения как числовой информации, представленной в двоичной системе счисления, так и логических переменных. Данные и команды представляются в виде двоичных последова- тельностей различной структуры и длины. В соответствии с логическим соглашением (приложение 1, ГОСТ 2.743-91) двоичная логика имеет дело с переменными, которые могут принимать два логических состояния — состояния «логическая еди- ница» (далее — LOG1) и состояния «логический ноль» (далее — LOGO). Символы логических функций, определенные ГОСТ 2.743-91, представляют собой связь между входами и выходами элементов в терминах логических состояний, не связанных с физической реа- лизацией. При конкретной физической реализации элементов логические состояния представляются физическими величинами (электриче- ский потенциал, давление, световой поток и др.). В логике не требу- ется знание абсолютного значения величины, поэтому физическая величина идентифицируется просто как более положительная — Н и менее положительная — L (рис. 2.1). Эти два значения называются логическими уровнями. Рис. 2.1. Логические уровни физической величины Соответствия между данными понятиями устанавливаются согла- шениями положительной и отрицательной логики. Соглашение положительной логики — более положительное значе- ние физической величины (логический уровень Н) соответствует LOG1, менее положительное значение физической величины (логи- ческий уровень L) соответствует LOGO. Соглашение отрицательной логики — менее положительное значе- ние физической величины (логический уровень L) соответствует
L0G1, более положительное значение физической величины (логи- ческий уровень Н) соответствует LOG6. Логические элементы Логические элементы — устройства, предназначенные для выпол- нения логических функций (операций) над входными сигналами (операндами, данными), представленными в цифровой форме. Логические элементы выполняют логические операции «И», «ИЛИ», «НЕ» и комбинации этих операций. Указанные логические операции можно реализовать с помощью контактно-релейных и электронных схем. В настоящее время в подавляющем большин- стве применяются электронные логические элементы, причем элект- ронные логические элементы входят в состав микросхем. Имея в рас- поряжении логические элементы «И», «ИЛИ», «НЕ», можно скон- струировать цифровое электронное устройство любой сложности. Электронная часть любого компьютера состоит из логических эле- ментов. Рассмотрим логические элементы с одним входом — элемент «НЕ» и «Повторитель» (буфер). Логический элемент «НЕ» (инвертор) Элемент, выполняющий функцию инверсии «НЕ», имеет один вход и один выход. Он меняет уровень сигнала на противоположный. Низкий потенциал на входе дает высокий потенциал на выходе, и на- оборот. Вход X Выход Y 0 1 1 0 Мнемоническое правило для отрицания звучит так: на выходе будет: • «1» тогда и только тогда, когда на входе «О»; • «О» тогда и только тогда, когда на входе «1». В качестве инвертора можно использовать обычный транзистор- ный усилитель с транзистором, включенным по схеме с общим эмит- тером или истоком. Схема инвертора, выполненная на биполярном л-/?-л-транзисторе, приведена на рис 2.2. Схемы инверторов могут обладать различным временем распро- странения сигнала и могут работать на различные виды нагрузки. Опи могут быть выполнены на одном или на нескольких транзисто-
Рис. 2.2. Схема простейшего логического инвертора рах, но независимо от схемы этого элемента и ее параметров они осуществляют одну и ту же функцию. Для того чтобы особенности включения транзисторов не затеняли выполняемую функцию, были введены специальные обозначения для цифровых микросхем — условно-графические обозначения. Условно-графическое обозначение инвертора на принципиаль- ных схемах в отечественной документации- В зарубежной документации инвертор (сокращенно его называют NOT) изображают следующим образом: Инверторы присутствуют практически во всех сериях цифровых микросхем В отечественных микросхемах инверторы обозначаются буквами ЛН. Например, в микросхеме 1533ЛН1 содержится шесть инверторов. Иностранные микросхемы для обозначения типа мик- росхемы используют цифровое обозначение. В качестве примера микросхемы, содержащей инверторы, можно назвать 74ALS04 В на- звании микросхемы отражается, что она совместима с ТТЛ-микро- схемами (74), произведена по технологии улучшеной малопотрсбля- ющей шоттки (ALS), содержит инверторы (04). В настоящее время чаще применяются микросхемы поверхностного монтажа, в которых содержится по одному логическому элементу7 — инвертору. В каче- стве примера можно назвать микросхему SN74LVC1G04. Микро- схема произведена фирмой «Texas Instruments» (SN), совместима
с ТТЛ-микросхемами (74), произведена по низковольтовой КМОП- технологии (LVC), содержит только один логический элемент (1G), им является инвертор (04). Для исследования инвертирующего логического элемента можно использовать широкодоступные элементы. Так, в качестве генера- тора входных сигналов можно использовать обычные переключатели или тумблеры. Для исследования таблицы истинности можно даже применить обычный провод, который будем поочередно подключать к источнику питания или общему проводу. В качестве логического пробника могут быть использованы низковольтовая лампочка или светодиод, соединенный последовательно с токоограничивающим резистором. Схема исследования инвертора приведена на рис. 2.3. Рис. 2.3. Схема исследования инвертора Схема, приведенная на рис. 2.3, позволяет наглядно получить данные для таблицы истинности. Логический элемент «Повторение» Элемент, выполняющий функцию «Повторение», имеет один вход и один выход. Он не меняет уровень сигнала на противополож- ный. Низкий потенциал на входе дает низкий потенциал на выходе, высокий потенциал на входе дает высокий потенциал на выходе На принципиальных схемах логический элемент «Повторение» обозначают так:
В зарубежной документации элемент «Повторение» изображают следующим образом: Преобразование информации требует выполнения операций с группами знаков, простейшей из которых является группа из двух знаков. Оперирование с большими группами всегда можно разбить на последовательные операции с двумя знаками. Рассмотрим основные логические элементы из 2<2 J1 = 24 = 16 возможных бинарных логических операций с двумя знаками с унар- ным выходом. Логический элемент «И» На рисунке представлена таблица истинности элемента «И» с двумя входами. Хорошо видно, что логическая единица появляется на выходе элемента только при наличии единицы на первом и вто- ром входах. В грех остальных случаях на выходе будут нули. Вход XI Вход JV2 Выход Y 0 0 0 1 0 0 0 1 0 1 1 1 Логический элемент, реализующий функцию конъюнкции, на- зывается схемой совпадения. Мнемоническое правило для конъ- юнкции с любым количеством входов звучит так: на выходе будет: • «1» тогда и только тогда, когда на всех входах действуют «1»; • «О» тогда и только тогда, когда хотя бы на одном входе действует «О». На принципиальных схемах логический элемент «И» обозначают так: U7 Х2 На зарубежных схемах обозначение элемента «И» имеет другое начертание. Его кратко называют AND'.
Проще всего понять, как работает логический элемент «И», при помощи схемы, построенной на идеализированных ключах с элек- тронным управлением, как это показано на рис. 2 4. В этой схеме ток будет протекать только тогда, когда оба ключа будут замкнуты, а зна- чит, единичный уровень на выходе схемы появится только при двух логических единицах на входе. Рис. 2.4. Принципиальная схема логического элемента «2И» Логический элемент «ИЛИ» Элемент «ИЛИ» с двумя входами работает несколько по-другому. Достаточно логической единицы на первом или на втором входе, как на выходе будет логическая единица. Две единицы также дадут еди- ницу на выходе. Вход Х\ Вход Л2 Выход Y 0 0 0 1 0 1 0 1 1 1 1 1 Мнемоническое правило для дизъюнкции с любым количеством входов звучит так: на выходе будет: • «1» тогда и только тогда, когда хотя бы на одном входе действует «1»; • «О» тогда и только тогда, когда на всех входах действуют «О». На схемах элемент «ИЛИ» изображают так: XI Х2 На зарубежных схемах его изображают чуть по-другому и назы- вают элементом OR
Как и в случае, рассмотренном для схемы логического умноже- ния, воспользуемся для реализации схемы «2ИЛИ» ключами. На этот раз соединим ключи параллельно. Схема, реализующая таблицу ис- тинности элемента «ИЛИ», приведена на рис. 2.5. Как видно из при- веденной схемы, уровень логической единицы появится на ее вы- ходе, как только будет замкнут любой из ключей, т.е. схема реализует таблицу истинности элемента «ИЛИ». Рис. 2.5. Принципиальная схема логического элемента «2ИЛИ» Наиболее простой логический элемент получается при помощи диодов. Схема базового логического элемента диодной логики при- ведена на рис. 2.6. Рис. 2.6. Принципиальная схема базового логического элемента «2И», выполненного на диодах В схеме базового логического элемента на диодах при подаче ну- левого потенциала на любой из входов (или на оба сразу) через ре-
зистор будет протекать ток и на его сопротивлении возникнет паде- ние напряжения. В результате на выходе схемы базового логического элемента будет присутствовать единичный потенциал, только если подать единичный потенциал сразу на оба входа микросхемы. То есть приведенная схема базового логического элемента реализует функ- цию «2И». Количество входов логического элемента «И» зависит от количе- ства диодов Если использовать два диода, то получится логический элемент «2И», если три диода, то логический элемент «ЗИ», если четыре диода, то логический элемент «4И» и т.д. В микросхемах сред- ней интеграции выпускается максимальный логический эле- мент «8И». Приведенная схема логического элемента «И» обладает таким недостатком, как смещение логических уровней на ее выходе. На- пряжение нуля и напряжение единицы на выходе схемы выше вход- ных уровней на 0,7 В. Это вызвано падением напряжения на входных диодах. Скомпенсировать это смещение уровней можно диодом, включенным на выходе схемы диодного логического элемента, как это показано на рис. 2.7. Рис. 2.7. Принципиальная схема усовершенствованного логического элемента «2И», выполненного на диодах В этой схеме логического элемента логические уровни на входе и выходе схемы одинаковы. Более того, схема логического элемента, приведенная на рис. 2.7, будет нечувствительна не только к входным напряжениям, большим напряжения питания схемы, но и к отрица- тельным входным напряжениям. Диоды выдерживают напряжение до сотен вольт. Поэтому такая схема до сих пор используется для за- щиты цифровых устройств от перегрузок по напряжению, возника-
ющих, например, в цепях, выходящих за пределы устройства. Есте- ственно, что для защиты одного входа достаточно одного диода на входе элемента. В пезультате получается только схема защиты без логической функции «И». Логический элемент «2И-НЕ» (штрих Шеффера) В логическом элементе «2И-НЕ» цифра всегда обозначает число входов логического элемента. В данном случае это двухвходовой эле- мент «И», выходной сигнал которого инвертируется, т.е. «О» превра- щается в «1», а «1» превращается в «О». Обратим внимание на кружо- чек на выходах — это символ инверсии. На принципиальных схемах логический элемент «2И-НЕ» обо- значают так: Зарубежное обозначение элемента «И-НЕ» (в данном случае «2И- НЕ») называется NAND: По сути, это упрощенное изображение двух объединенных эле- ментов: элемента «2И» и элемента «НЕ» на выходе. Таблица истинности для элемента «2И-НЕ»: Вход XI Вход Х2 Выход Y 0 0 1 1 0 1 0 1 1 1 1 0 В таблице истинности элемента «2И-НЕ» мы видим, что благо- даря инвертору получается картина, противоположная элементу «И». В отличие от трех нулей и одной единицы мы имеем три единицы и ноль. Элемент «И-НЕ» часто называют элементом Шеффера. Мнемоническое правило для «И-НЕ» с любым количеством вхо- дов звучит так: на выходе будет: • «1» тогда и только тогда, когда на всех входах действуют «О»; • «О» тогда и только тогда, когда хотя бы на одном входе дей- ствует «1».
Логический элемент «2ИЛИ-НЕ» (стрелка Пирса) Логический элемент «2ИЛИ-НЕ» — это двухвходовой элемент «ИЛИ», выходной сигнал которого инвертируется, На выходе только один высокий потенциал при условии, что на оба входа одновре- менно действует низкий потенциал. Здесь, как и на любых других принципиальных схемах, кружочек на выходе подразумевает инвер- тирование сигнала. Таблица истинности также отличается от схемы «ИЛИ» примене- нием инвертирования выходного сигнала. Таблица истинности для логического элемента «2ИЛ И-НЕ»: Вход XI Вход Л2 Выход Y 0 0 1 1 0 0 0 1 0 1 1 0 Изображение на схеме: На зарубежный лад изображается так и называется NOR: Схема логического элемента «2ИЛИ-НЕ» приведена на рис. 2.8. Рис. 2.8. Принципиальная схема логическою элемента «2ИЛИ-НЕ» ДТЛ-микросхемы
Схема «ИЛИ-HE» в этих сериях микросхем имеет обозначение ЛЕ. Например, схема К555ЛЕ1 содержит в одном корпусе четыре элемента «2ИЛИ-НЕ». Логический элемент «Исключающее ИЛИ» (неравнозначность) К числу базовых логических элементов принято относить эле- мент, реализующий функцию «Исключающее ИЛИ». Иначе эта функция называется «Неравнозначность». Высокий потенциал на выходе возникает только в том случае, если входные сигналы не равны, т.е. на одном из входов должна быть единица, а на другом — ноль. Таблица истинности: Вход XI Вход А2 Выход Y 0 0 0 1 0 1 0 1 1 1 1 0 Эти логические элементы находят свое применение в сумматорах. «Исключающее ИЛИ» изображается на схемах знаком равенства пе- ред единицей «=1»: На зарубежный манер «Исключающее ИЛИ» называют XOR и на схемах изображают так: Мнемоническое правило для суммы по модулю 2 с любым коли- чеством входов звучит так: на выходе будет: • «1» тогда и только тогда, когда на входе действует нечетное коли- чество; • «О» тогда и только тогда, когда на входе действует четное количе- ство. Словесное описание: «истина на выходе — только при истине на входе 1, либо только при истине на входе 2».
Логический элемент «Исключающее ИЛИ-НЕ» (равнозначность) К числу базовых логических элементов принято относить эле- мент, реализующий функцию «Исключающее ИЛИ-HE». Иначе эта функция называется «Равнозначность». Если на выходе логического элемента «Исключающее ИЛИ-НЕ» имеется инвертор, то функция выполняется противоположная — «Равнозначность». Высокий потенциал на выходе возникает только в том случае, если входные сигналы равны. Таблица истинности: Вход jn Вход Т2 Выход Y 0 0 1 1 0 0 0 1 0 1 1 1 Эти логические элементы находят свое применение в сумматорах. «Исключающее ИЛИ-НЕ» изображается на схемах следующим обра- зом: На зарубежный манер «Исключающее ИЛИ-НЕ» называют XNOR и на схемах изображают так: Мнемоническое правило эквивалентности с любым количеством входов звучит так: на выходе будет: • «1» тогда и только т огда, когда на входе действует четное количе- ство; • «О» тогда и только тогда, когда на входе действует нечетное коли- чество. Словесная запись: «истина на выходе при истине на входе 1 и входе 2 или при лжи на входе 1 и входе 2». Рассмотрим несколько реальных логических элементов на при- мере серии транзисторно-транзисторной логики (ТТЛ) КР1533 с ма- лой степенью интеграции. На рис 2.9 приведена микросхема КР1533ЛАЗ, которая содержит четыре независимых элемента «2И- НЕ». Аналог - SN74ALS00A.
Dm 2 14 4“ 18 -2- 1Y -4-24 — - 2B ~T- —!— GND 7400 vcc-^- 13 48 4т- ЗВ Zfl -f- 3Y —-— Рис. 2.9. Четыре логических элемента «2И-НЕ»: а — микросхема КР1533ЛАЗ; б — аналог SN74ALS00A В той же серии существуют элементы «ЗИ-HE», «4И-НЕ», «БИ- НЕ», что означает элементы «И» с различным числом входов. На- пример, микросхема КР1533ЛА4 (аналог — SN74ALS10) содержит три логических элемента «ЗИ-HE», микросхема КР1533ЛА1 (ана- лог — SN74ALS20) содержит два логических элемента «4И-НЕ», а микросхема КР1533ЛА2 (аналог — SN74AES30) содержит один ло- гический элемент «8И-НЕ». Логический элемент «2ИЛИ-НЕ» представлен микросхемой КР1533ЛЕ1 (рис. 2.10). Она содержит в одном корпусе четыре неза- висимых элемента. Аналог — SN74AES02. -Ь24 2А ~т~28 GND 7402 ice -И- 4Y Л|- 48 3Y 36 Нг 34 Рис. 2.10. Четыре логических элемента «2ИЛИ-НЕ»: а — микросхема КР1533ЛЕ1, б — аналог SN74ALS02
Количество логических элементов «2ИЛИ-НЕ» в одном корпусе может достигать шести — микросхемы К155ЛН1 и К561ЛН2. Часто используются элементы, объединенные в различных соче- таниях. Например, микросхема К555ЛР4 (аналог — SN74LS55) на- зывается «2-4И-2ИЛИ-НЕ» (рис. 2.11). а) б) Рис. 2.11. Логические элементы «2-4И-2ИЛИ-НЕ»: а — микросхема К555ЛР4; б — аналог SN74LS55 Построение логических схем с произвольной таблицей истинности Любая логическая схема без памяти полностью описывается таб- лицей истинности. При построении сложных логических схем с про- извольной таблицей истинности используется сочетание простейших схем «И», «ИЛИ», «НЕ». При построении схемы, реализующей произвольную таблицу ис- тинности, каждый выход анализируется (и строится схема) отдельно. Для реализации таблицы истинности при помощи логических эле- ментов «И» достаточно рассмотреть только тс строки таблицы ис- тинности, которые содержат логическую единицу в выходном сиг- нале. Строки, содержащие в выходном сигнале логический ноль, в построении схемы не участвуют. Каждая строка, содержащая в вы- ходном сигнале логическую единицу, реализуется схемой логиче- ского «И» с количеством входов, совпадающим с количеством вход- ных сигналов в таблице истинности. Входные сигналы, описанные в таблице истинности логической единицей, подаются на вход этой схемы непосредственно, а входные сигналы, описанные в таблице истинности логическим нулем, подаются на вход через инверторы.
Объединение сигналов с выходов схем, реализующих отдельные строки таблицы истинности, производится при помощи схемы ло- гического «ИЛИ». Количество входов в этой схеме определяется ко- личеством строк в таблице истинности, в которых в выходном сиг- нале присутствует логическая единица. Рассмотрим конкретный пример, приведенный в [16] (ч. 1, гл. 6, с. 84). Необходимо реализовать следующую таблицу истинности (табл. 2.10). Таблица 2.10 Пример таблицы истинности Входы хО х1 х2 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 Выходы хЗ F0 Л 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 Для построения схемы, реализующей сигнал Л), достаточно рас- смотреть строки, в которых сигнал /0 = 1. В рассматриваемой таблице истинности имеются всего три строки, содержащие единицу в выходном сигнале /0 (шрифт этих строк — полужирный), поэтому в формуле СДНФ будет содержаться три произведения входных сигналов: F0 = хО • х1 • х2 хЗ + хО • х1 • х2 хЗ + хО • х1 • х2 хЗ. Эти строки реализуются микросхемой D2 на рис. 2.12. Каждая строка реализуется своей схемой «И», затем выходы этих схем объ- единяются схемой «ИЛИ».
Рис. 2.12. Принципиальная схема, реализующая таблицу истинности (см. табл. 2.10) Для построения схемы, реализующей сигнал Я, достаточно рас- смотреть строки, в которых сигнал Fl = 1 (в таблице истинности строки выделены полужирным курсивом). Эти строки реализуются микросхемой D3. Принцип построения этой схемы не отличается от примера, рассмотренного выше. В таблице истинности присут- ствуют всего три строки, содержащие единицу в выходном сиг- нале F1, поэтому в формуле СДНФ выхода Я будет содержаться три произведения входных сигналов: F1 = хО•х!•х2•хЗ + хО•х!•х2•хЗ + хО•х! • х2хЗ. Канонические формы представления логических функций Существуют различные формы представления логических функций, но наиболее широкое практическое применение получили канонические (стандартные) формы. К ним относятся: • совершенная дизъюнктивная нормальная форма (СДНФ); • совершенная конъюнктивная нормальная форма (СКНФ). Следует отметить, что любая логическая функция может быть представлена только одной СДНФ (кроме константы нуля) либо только одной СКНФ (кроме константы единицы).
СДНФ логической функции представляет собой дизъюнкцию элементарных конъюнкций, например: /сДНфС^Р ^2> ^з) = ' %2 ' V -^1 ' %2 ^3- Нормальной эта форма функции называется потому, что состоит из элементарных конъюнкций. Элементарными называются конъюнкции, сомножителями в ко- торых являются одиночные аргументы либо отрицания одиночных аргументов. Например, конъюнкция Х1 Х2 Х3 является элементар- ной, а Xj • X2 Х3 — нет. В последнем случае логическая функция не может относиться к СДНФ. Совершенной эта форма функции называется потому, что элемен- тарные конъюнкции имеют высший ранг, т.е. являются конституен- тами единицы. Количество сомножителей в элементарной конъюнкции называ- ется qq рангом. Элементарная конъюнкция высшего ранга называется конституентои единицы. Для п аргументов можно составить 2" кон- ституент единицы, причем для заданных значений истинности аргу- ментов только одна конституента будет равна единице, а осталь- ные — нулю. Например, конституента Х3 • Х2 • Х3 принимает значе- ние, равное единице, для набора аргументов 100 (Х} = 1, Х2 = 0, Х3 = 0), а остальные семь конституент для этого набора аргументов будут равны нулю. Дизъюнктивной эта форма логической функции называется по- тому, что отдельные конституенты единицы объединяются в одну функцию знаком дизъюнкции. Правило. Чтобы получить в СДН Ф аналитическое выражение ло- гической функции, заданной таблично, необходимо составить дизъ- юнкцию конституент единицы для тех наборов аргументов, для ко- торых значение функции равно единице, причем символ любого аргумента в конституенте единицы берется со знаком отрицания, если конкретное значение аргумента в рассматриваемом наборе равно нулю. Например, запишем в СДНФ аналитическое выражение логиче- ской функции, заданной в таблице истинности для логических функций грех аргументов (табл. 2.11). Рассмотрим второй, третий, пятый и седьмой наборы аргументов: /сДНфС^П ^2’ -^з) = -^1 %2 ' V ^2 ' -^3 V vXj X2-X3vX1-X2- Х3.
Таблица 2.11 Таблица истинности для логических функций трех аргументов Номер набора 0 1 2 3 4 5 6 7 0 0 0 0 1 1 1 1 ^2 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 f(X„X2,X3) 0 0 1 1 0 1 0 1 Приведем форму представления логической функции, не явля- ющуюся СДНФ. Например, функция /(%,, Х2, Х3) = %, v Х} Х2 Х3 v Х\ Х2 Х3 представлена не в СДНФ. а в ДНФ. так как первый член функции имеет первый ранг (для СДНФ каждый член функции должен быть высшего ранга, в данном случае — третьего). Для перехода от ДНФ к СДНФ необходимо в каждый из членов, в которых представлены не все аргументы, ввести выражение вида х, v х( где xt — отсутствующий в члене аргумент. Так как v xi = 1, такая операция не может изменить значения функции. СКНФ логической функции представляет собой конъюнкцию элементарных дизъюнкций, например: /скиф = (*п хз) = (*i v х2 V Х3) • (X, V Х2 V %3) х х (X, v Х2 v Х3). Нормальной эта форма логической функции называется потому, что состоит из элементарных дизъюнкций. Элементарными называются дизъюнкции, слагаемыми в которых являются оценочные аргументы либо отрицания одиночных аргу- ментов. Например, дизъюнкция (Х{ Х2 V Х3) является элементар- ной, а (X v Х2 v Х3) — нет. Во втором случае логическая функция не может относиться к СКНФ. Совершенной эта форма функции называется потому, что эле- ментарные дизъюнкции имеют высший ранг, т.е. являются консти- туснтами нуля. Количество слагаемых в элементарной дизъюнкции называется ее рангом. Элементарная дизъюнкция высшего ранга называется констатуентой нуля. Для п аргументов можно соста- вить 2я конституент нуля, причем для заданных значений истин- ности аргументов только одна конституента будет равна нулю, а остальные — единице. Например, конституента (Х\ v Х2 v Х3) принимает значение нуль для набора аргументов 011 (Х} - 0, Х2 - I,
Х3 = 1), а остальные семь конституент для этого набора аргументов будут равны единице. Конъюнктивной эта форма логической функции называется по- тому, что отдельные конституенты нуля объединяются в одну функ- цию знаком конъюнкции. Правило. Чтобы получить в СКНФ аналитическое выражение ло- гической функции, заданной таблично, необходимо составить конъ- юнкцию конституент нуля для тех наборов аргументов, для которых значение функции равно нулю, причем символ любого аргумента в конституенте нуля берется со знаком отрицания, если конкретное значение аргумента в рассматриваемом наборе равно единице. Например, запишем в СКНФ аналитическое выражение логиче- ской функции, заданной в табл 2.11, для этого рассмотрим нулевой, первый, четвертый и шестой наборы аргументов: /скнф(^ь Х2, *з) = (Л/ V Х3)• (JLv Х2 V Х3) х х (X] V Х2 V Х3) (X] V Х2 V Х3). Приведем форму представления логической функции, не явля- ющуюся СКНФ. Например, функция /(Х1; Х2, Х3) = (Xt V Х2) (X, V Х2 V Х3) (Х3 V Х2 V Х3) представлена не в СКНФ, а в КНФ, так как первый член функции имеет второй ранг. Для перехода от КНФ к СКНФ необходимо в каждый из членов, в которых представлены не все аргументы, ввести выражение вида xt х,, где х, — аргумент, не представленный в члене, Так как xixl =0, то такая операция не может повлиять на значение функции. Минимизация логических функций и техническая реализация Стоимость схемы, реализующей логическую функцию, пропор- циональна числу вхождений переменных или их отрицаний и числу логических операций Поэтому логические функции необходимо минимизировать (упрощать). Полная система — это система логических функпий, при помощи которых может быть выражена любая логическая функция в виде суперпозиций функций этой системы. Максимальная система — полный набор всех элементарных функ- пий.
При минимизации логических функций учитывается, каким ме- тодом эффективнее будет реализовать ее минимальную форму при помощи электронных схем. Для логических схем «И», «ИЛИ», «НЕ» существуют типовые тех- нические схемы. В настоящее время применяются интегральные микросхемы, у которых с целью большей унификации в качестве базовой логической схемы используется всего одна из схем: «И-НЕ», «ИЛИ-НЕ», «И-ИЛИ-НЕ». Минимальная полная система — это система, удаление из которой хотя бы одной функции превращает ее в неполную. Можно выделить четыре минимальные полные системы: 1) «И», «НЕ»; 2) «ИЛИ», «НЕ»; 3) «И-НЕ»; 4) «ИЛИ-НЕ». Для минимизации используют специальные алгоритмические методы, такие как метод Квайна, метод карт Карно, метод испыта- ния импликант, метод импликантных матриц, метод Клайна—Мак- Класки и др. Если число переменных невелико (меньше или равно шести), то представление функций удобно с помощью карт Карно Карта Карно представляет собой таблицу, которая содержит 2" клеток, где п — число переменных (п = 1, 2, 3, ..., п). В каждой клетке таблицы содержится логическое произведение переменных или их инверсий. Одни переменные располагаются по горизонтали, другие — по вер- тикали. Пример. Функция алгебры логики состоит из четырех переменных Xj, х2, xj, х4. Карта Карно будет содержать 16 клеток (24 = 16): у - XxX2XiX4 + Х|Х2х3х4 + ^)^2Х3Х4 + ^1^2Х3Х4 + -ДМ-М-М' Составим карту Карно:
Если переменная без инверсии, то в карте Карно ставится еди- ница, если с инверсией — ноль Во второй сверху слева ячейке стоит единица, и этой единице соответствует первое слагаемое в формуле. Единица стоит именно там, поскольку в этой ячейке перекрываются все переменные. Стоит уйти на ячейку влево, вправо, вверх, вниз, и одна из переменных уже перекрывать ее не будет. Если одна из пе- ременных с инверсией, что характерно для второго слагаемого, еди- ница ставится с учетом неперекрытия ячейки этой переменной, т.е. для второго слагаемого х} с инверсией единица стоит в третьей (сверху) строке третьего столбца. Для четвертого слагаемого с инвер- сией переменные х2 и х4. Поэтому единица стоит в последней строке (второй столбец). Так проставляются все единицы. В пустых ячейках по идее стоят нули (не показаны для наглядности). После простав- ления всех единиц начинается объединение ячеек, в которых стоят эти самые единицы. Объединяются клетки по следующим правилам: число объединяемых клеток 2, 4, 8, 16, 32 и т.д., т.е. 2"; объединять надо как можно больше клеток, а самих объединений должно быть как можно меньше На рисунке ниже показано, как это делается: Следует иметь в виду, что не объединяются единицы в количестве три, пять, шесть, семь, девять, десять и т п. Нс объединяются также единицы, которые стоят буквой Т или Г. После объединения ячеек составляется уравнение функции. Объ- единенные клетки условно считаются за одну. Как видно из рисунка, четырем объединенным единицам соответствует выражение х3х4, т.е. область объединения попадает в зону видимости всех перемен- ных. Во втором объединении не участвует х2, поэтому эта переменная будет с инверсией. Таким образом, после преобразования с помошью карты Карно получаем следующую функцию: у = Х3Х4 + XjX2^3- Таким образом, из пяти слагаемых получили два. Такая форма записи функции называется совершенной дизъюнктивной нормаль- ной формой (СДНФ).
Техническая реализация логических функций При реализации цифровых устройств на интегральных микро- схемах широко используются базисы «И-НЕ» или «ИЛ И-НЕ». Для этого минимизированные логические функции путем преобразо- ваний приводятся к соответствующему виду Пусть минимальная ДНФ функции F(A, В, Q = АВ v ВС v АС. Применим к этому выражению двойное отрицание и теорему де Моргана: F = Р -- АВ v ВС v АС = (АВ) (ВС) (АС). Как видно, функция F включает только операции «И-НЕ» и ее реализация в базисе «И-НЕ» имеет вид (рис 2.13). Аналогичным образом от КНФ функции можно перейти к ее форме, удобной для реализации в базисе «ИЛИ-НЕ». Контрольные вопросы и задания 1. Переведите число DCCXIX из римской системы счета в арабскую. 2. Составьте таблицу натурального ряда чисел от 0 до 25 в десятеричной и семеричной системах счисления. 3. Составьте алгоритм перевода целых и дробных чисел из десятичной системы счисления в шестнадцатиричную систему счисления. 4. Составьте алгоритм перевода из двоичной в восьмиричную и шестнад- цатиричную системы. 5. Переведите числа из десятичной системы счисления в 8-ричную сис- тему счисления: 23,1310—> А8; 54,3910 —> %8.
6. Переведите числа из двоичной системы счисления в шестнадцат ирич- ную систему счисления: 11101101,10112 —> JT16; 1000100101,1010012^Jf16. 7. Переведите числа из восьмеричной системы счисления в шестнадца- тиричную систему счисления: 25,5S А10; 36,318^Х10. 8. Переведите числа из десятичной системы счисления в шестнадцати- ричную систему счисления: 51,231О —> Х16; 97.2910 ^ А'|6. 9. Получите 1 грямой, обратный и дополш ггельный коды следующих чисел: Лю = 31; «ю = -23 и выполните сложение этих чисел. 10. Выполните арифметические операции в восьмеричной системе счис- ления: Л8 = 750; /?8 = 236. Найти А8 + в8, Ag - S8. 11. Приведите примеры iщостых и сложных высказываний. 12. Напишите формулы СКНФ и СДНФ для переменных2В, TL, XI. 13. Напишите формулу зависимости количества различных переключа- тельных функций от числа аргументов. 14. С помощью таблицы истинности проверьте правило де Моргана. 15. Постройте таблицу истинности и условное обозначение логических схем «НЕ», «И», «ИЛИ», «И-НЕ», «ИЛИ-НЕ». 16. Постройте таблицу истинности, логическую схему и, используя законы алгебры, минимизируйте следующую функцию алгебры логики: F = (~А + 8) + АВ + В. 17. Задана функция алгебры логики F = АВ v С. Постройте логическую схему в базисе «И», «НЕ»; «ИЛИ», «НЕ»; «И-НЕ»; «ИЛИ-НЕ». 18. Запишите функцию алгебры логики и постройте таблицу истинности для приведенной ниже логической схемы:
19. Какие системы счисления вы знаете? 20. Чем отличаются непозиционная система счисления от позиционной системы счисления? 21. Изменяется ли длина разрядной сетки при записи одного и того же числа в разных системах счисления? 22. Чему равно максимальное по абсолютному значению число, которое можно записать при заданной длине разрядной сетки N= 4 для восьме- ричной системы счисления? 23. Что такое количество информации? 24. Какие способы представления чисел применяются в вычислительной технике? 25. Чему равна максимальная относительная ошибка при представлении чисел с фиксированной запятой? 26. Чему равна минимальная относительная ошибка при представлении чисел с фиксированной запятой? 27. Можно ли выходить при выполнении операции за диапазон представ- ляемых в данной разрядной сетке чисел, записанных с фиксированной запятой? 28. Для чего нужен дополнительный код? Как кодируются положительные и отрицательные числа в дополнительном коде? 29. Для чего нужен обратный код? Как кодируются положительные и от- рицательные числа в обратном коде? 30. Что такое «положительный» и «отрицательный» ноль в обратном коде? 31. Применяется ли алгебра логики в современных ЭВМ? 32. Можно ли записать сложное и длинное высказывание простым выска- зыванием без нарушения истинности исходного высказывания? 33. Как зависит количество различных переключательных функций от числа аргументов? 34. Какие физические способы кодирования двоичной информации вы знаете? 35. Какие логические элементы вы знаете? Область применения.
Глава 3 ОСНОВНЫЕ ЦИФРОВЫЕ ЛОГИЧЕСКИЕ УСТРОЙСТВА 3.1. Общие сведения об элементной базе цифровой техники Цифровые устройства — это электронные функциональные узлы, которые обрабатывают цифровые сигналы. Логическое цифровое устройство может быть представлено в виде многополюсника, выполняющего определенную логическую функцию между входными (Хо, Хг, ..., Хп_Л и выходными (Уо, Y1; ..., Ут-1) сигналами (рис. 3.1). хо Логическое устройство *1 . г, . V, Рис. 3.1. Обобщенная схема логического устройства Элементами цифровой техники называются наименьшие функцио- нальные части, на которые можно разбить устройство при логиче- ском проектировании (синтезе) и технической реализации. Эле- менты цифровой техники выполняют хранение, преобразование и передачу логических переменных, а также ряд вспомогательных функций, например задержку сигнала во времени, формирование сигнала с определенными физическими параметрами и т.п. Элементную базу цифровой техники составляют цифровые ин- тегральные схемы (ИС). Характеристикой сложности ИС является уровень интеграции, оцениваемый числом базовых логических эле- ментов либо числом транзисторов, которые могут быть реализованы на кристалле. В зависимости от сложности цифровые ИС делятся на малые, средние, большие и сверхбольшие. Малые ИС реализуют простейшие логические преобразования и обладают универсальностью, так как с помощью только одного
типа логических элементов, например «И-НЕ», можно построить цифровое устройство любой сложности. В виде средних ИС выпускаются в готовом виде такие типовые узлы цифровой техники, как малоразрядные регистры, счетчики, дешифраторы, сумматоры и т.п. Номенклатура средних ИС должна быть более широкой, так как их универсальность снижается С появлением больших и сверхбольших ИС (БИС/СБИС) схемы с тысячами и даже миллионами логических элементов стали разме- щаться на одном кристалле. При этом универсальность цифровых ИС с жесткой структурой резко снижается. Выход из возникшего противоречия между уровнем интеграции и универсальностью был найден на пути переноса специализации ИС в область программи- рования. Появились микропроцессоры (МП) и БИС/СБИС с про- граммируемой структурой. МП позволяет решать различные задачи, меняя программу, и представляет собой универсальную БИС. Это позволяет наладить массовый выпуск МП и, следовательно, снизить его стоимость. В виде БИС/СБИС с программируемой структурой потребителю предлагается кристалл, содержащий множество логических блоков, соединения между которыми определяет сам потребитель, програм- мируя структуру ИС для решения конкретной задачи. Таким образом, МП реализует последовательную обработку ин- формации, поочередно выполняя команды программы, что может не обеспечить требуемого быстродействия. В БИС/СБИС с програм- мируемой структурой обработка информации происходит одновре- менно во многих узлах устройства, что обеспечивает более высокое быстродействие. Следовательно, БИС/СБИС с программируемой структурой могут быстрее решать задачи, сложность которых огра- ничена уровнем интеграции ИС, а МП-средства могут решать задачи любой сложности, но с меньшим быстродействием. С ростом уровня интеграции цифровых ИС задачей разработки становится составление блоков из субблоков стандартного вида пу- тем правильного их соединения. В настоящее время основная работа в части логических преобра- зований информации стала выполняться БИС/СБИС. Однако вы- пуск и использование ИС малой и средней степени интеграции не прекратились, поскольку ограничиться только БИС и СБИС при построении устройств не удается. Практически всегда возникает не- обходимость в реализации одиночных логических функций или бу- феризации линий интерфейса и т.д.
Классификация цифровых интегральных схем По технологии изготовления и связанной с ней схемотехнической элементной базе различают: • цифровые ИС схемотехники типа ТТЛ III (транзисторно-транзи- сторная логика с диодами Шоттки); • КМОП (на комплементарных металл-окисел-иолуироводниковых транзисторах); • Би-КМОП (комбинированной биполярной-полевой) и др. Наибольшее распространение получили цифровые ИС схемотех- ники КМОП и Би-КМОП. Наилучшим сочетанием всех параметров обладают цифровые ИС схемотехники Би-КМОП. По виду обрабатываемых сигналов цифровые интегральные схемы делятся. • на потенциальные; • импульсные; • импульсно-потенциальные. Длительность потенциального сигнала не ограничена сверху, как правило, кратна длительности тактового периода Ти определяется частотой смены информации. Длительность импульсного сигнала tw имеет постоянное стандартное значение tH < Т и не зависит от час- тоты смены информации. Типы сигналов определяют три способа физического представления (кодирования) информации: потенци- альный, импульсный и динамический. При потенциальном способе логическим нулю и единице ставится в соответствие уровень напряжения или потенциала. Если логиче- скому нулю соответствует низкий уровень напряжения, а логической единице — высокий, то логическое соглашение или просто логика называется положительной. При обратном соответствии логика на- зывается отрицательной. Один и тот же логический элемент в зависимости от принятого логического соглашения выполняет различные логические опера- ции. Переход от положительной логики к отрицательной произво- дится инвертированием входных и выходных переменных. В даль- нейшем, если не оговорено иное, будем пользоваться соглашением положительной логики (рис. 3.2, а). При импульсном способе логической единице соответствует нали- чие импульса в строго определенный или тактовый момент, а логи- ческому нулю — его отсутствие (рис. 3.2, б). При динамическом способе логической единице соответствует на- личие последовательности прямоугольных импульсов в течение так- тового периода, а логическому нулю — ее отсутствие (рис. 3.2, в).
(такты, время) Рис. 3.2. Временные диаграммы физического представления кодового слова 10110 потенциальным способом (а), импульсным (б) и динамическим (в) Наиболее широкое применение получил потенциальный способ. По функциональному назначению цифровые ИС делятся на специ- альные и логические. Специальные элементы предназначены для преобразования сиг- налов (усиление, формирование, генерирование и т.д.). Классификация логических устройств может бытв по различным признакам. По способу ввода-вывода переменных (информации) они подраз- деляются: • на последовательные; • параллельные; • последовательно-параллельные (смешанные). Последовательные устройства — это устройства, в которых вход- ные переменные подаются на вход, а выходные переменные снима- ются с выхода не одновременно, а последовательно, разряд за разря- дом. Параллельные устройства — в которых все разряды входных пере- менных подаются на вход, а все разряды выходных переменных сни- маются с выхода одновременно. В последовательно-параллельных устройствах входные и выходные переменные представлены в различных формах: либо на вход пере- менные подаются последовательно символ за символом, а с выхода они снимаются одновременно, либо наоборот. По принципу действия все логические устройства делятся на два класса:
• комбинационные; • последовательностные. Комбинационными устройствами или автоматами без памяти на- зывают логические устройства, выходные сигналы которых одно- значно определяются только действующей в настоящий момент на входе комбинацией переменных и не зависят от значений пере- менных, действовавших на входе ранее. Последовательностными устройствами или автоматами с памятью называют логические устройства, выходные сигналы которых опре- деляются не только действующей в настоящий момент на входе ком- бинацией переменных, но и всей последовательностью входных пе- ременных, действовавших в предыдущие моменты времени. Этот тип устройств часто называют цифровыми автоматами. Структура последовательностного и комбинационного устройства приведена на рис. 3.3. импульсы 6) Рис. 3.3. Структура цифрового устройства: а — комбинационного; б — последовательностного В комбинационных устройствах взаимосвязь между входными и выходными переменными задается таблицей истинности, а алгеб- раическая форма этих связей описывается системой уравнений: у^уДх,,^, ...,х„); В последовательностных устройствах выходные переменные у( зависят не только от входных сигналов хт, но и от сигналов элемен-
тов памяти, поступающих за этот же такт. Цифровые устройства с па- мятью называют конечными автоматами, так как запоминающее устройство может хранить информацию только в течение ограничен- ного числа тактов. Для описания работы последовательностных устройств используются таблицы переходов состояний. Цифровые устройства можно разделить на асинхронные и син- хронные. В асинхронных изменение входных сигналов сразу же вы- зывает изменение выходных сигналов. В синхронных изменение вы- ходных сигналов, соответствующее новому сочетанию входных, происходит только после подачи синхронизирующих (тактовых) импульсов, управляющих работой автомата. Период синхроимпуль- сов является, таким образом, минимальным временем между выпол- нением автоматом двух последовательных микроопераций, т.е. слу- жит единицей машинного времени, называемой тактом. В зависи- мости от структуры автомата за один такт может выполняться одна или несколько микроопераций, если они совмещены во времени. В асинхронных устройствах отсутствуют синхронизирующие сиг- налы, поэтому в их структуры обычно включаются специальные схемы, которые после окончания каждой микрооперации вырабаты- вают сигнал готовности к выполнению следующей микрооперации. Синхронные устройства, в принципе, имеют меньшее быстродей- ствие, чем асинхронные, однако в них легко устраняются опасные состязания. Обозначения цифровых интегральных схем Обозначения цифровых ИС по ГОСТ 17021-88 ЕСКД должно со- стоять из четырех элементов. Первый элемент — цифра 1, 5 или 7, обозначающая группу ИС по конструктивно-технологическому ис- полнению. Второй элемент — две или три цифры (от 00 до 99 или от ООО до 999), указывающие порядковый номер разработки се- рии ИС. Третий элемент — две буквы, обозначающие подгруппу и вид ИС внутри подгруппы, определяющие функциональное назна- чение ИС. Четвертый элемент — число, определяющее номер разра- ботки ИС по функциональному признаку. Два первых элемента обозначают серию ИС. Под серией понимают совокупность ИС, выполняющих различные функции, имеющих единое конструк- тивно-технологическое исполнение и предназначенных для совмест- ного применения. Например, расшифруем обозначение ИС 1533JIA3 (рис. 3 4). В табл. 3.1 приведено разделение цифровых ИС для основных логических элементов на подгруппы и виды.
Серия Порядковый номер разработки ИС 1 533 Л 3 в данной серии по функциональному Г > поизнаку Вид (по функциональному назначению) Подгруппа логических элементов Порядковый номер разработки серии Группа (го конструктивно-технологическому исполнению) Рис. 3.4. Условное обозначение микросхемы 1533ЛАЗ Таблица 3.1 Обозначение цифровых ИС для подгруппы логических элементов Подгруппа и вид ИС Обозначение Логические элементы: «И-НЕ» ЛА «И-НЕ»/«ИЛИ-НЕ» ЛБ Расширители: яд «ИЛИ-НЕ» ЛЕ «И» ЛИ «И-ИЛИ-НЕ»/«И-ИЛИ» ЛК «ИЛИ» лл «ИЛИ-НЕ»/«ИЛИ» лм «НЕ» лн Прочие лп «И-ИЛИ-НЕ» ЛР «И-ИЛИ» лс На рис. 3.5 приведен пример УГО некоторых логических элемен- тов по ГОСТ 2.743-91 ЕСКД. Символ «£» означает расширительный выход (вход). Основные статические и динамические параметры логических элементов Статические характеристики и параметры характеризуют логиче- ские элементы в устойчивом состоянии, а динамические — при пе- реключении из одного состояния в другое. В качестве важнейших статических параметров приводятся пять значений напряжений и пять значений токов. Для нормальной работы элемента требуется, чтобы входное на- пряжение, отображающее логическую единицу, было достаточно
a) 6) Рис. 3.5. Условное графическое обозначение расширителя (а), логического элемента «2И-2ИЛИ-НЕ»/«2И-2ИЛИ» с возможностью расширения по ИЛИ (б) и логического элемента «ЗИЛИ-НЕ»/«ЗИЛИ» (в) высоким, а напряжение, отображающее логический ноль, достаточно низким. Эти требования задаются параметрами £/вхт1П и U®xmax. Вход- ные напряжения данного логического элемента есть выходные на- пряжения предыдущего (источника сигналов). Напряжения, гаран- тируемые на выходе логического элемента при допустимой нагрузке, задаются параметрами и Пв°ыхтах. Для токов в первую очередь указывается i ок потребления /пот, который нужен и для определения потребляемой элементом мощ- ности, рассчитываемой как произведение напряжения питания на потребляемый им ток. Следующие четыре значения токов среди важнейших статических параметров — входные и выходные токи в обоих логических состоя- ниях: /°х, /вх, /вых, /вых. При высоком уровне выходного напряжения из элемента-источника ток вытекает, а цепи нагрузки ток поглощают (рис. 3.6, а). Рис. 3.6. Направление выходных и входных токов при высоком уровне выходного напряжения (а) и низком уровне (б) При низком уровне выходного напряжения элемента-источника ток нагрузки втекает в этот элемент, а из входных цепей элементов- приемников токи вытекают (рис 3.6, б). Следовательно, входные
и выходные токи в различных логических состояниях протекают в разных направлениях. Кроме того, к статическим параметрам относятся: 1) коэффициент разветвления по выходу -Кразв — характеризует нагрузочную способность логического элемента и определяет число входов однотипных элементов, которое может быть подключено к выходу данного элемента. Чем выше нагрузочная способность эле- ментов, тем меньшее число элементов может потребоваться при по- строении цифрового устройства. Из рис. 3.5 следует, что коэффици- ент разветвления по выходу может быть определен по формуле ^раз — А1ых/ А<х‘ По формуле можно определить допустимое значение выходного тока /вых; 2) коэффициент объединения по входу Ко — определяет число входов логического элемента, предназначенных для подачи логиче- ских аргументов. Элементы с большим коэффициентом объединения по входу имеют более широкие функциональные возможности; 3) помехоустойчивость — определяется максимальным значе- нием помехи (7ПОМ, не вызывающим нарушения работы элемента. Для количественной оценки помехоустойчивости можно использовать передаточную характеристику логического элемента, которая пред- ставляет собой зависимость выходного напряжения от входного (рис. 3.7). Рис. 3.7. Типовая передаточная характеристика инвертора
При увеличении входного напряжения от нуля до порогового (/в°хпор в области значений, соответствующих уровню логическою нуля, напряжение на выходе уменьшается от стандартного уровня логической единицы С/ВЬ1Х до минимально допустимого уровня логи- ческой единицы (7ВЬ1хт1П (см. рис. 3.7). Дальнейшее увеличение входного напряжения приводит к рез- кому снижению выходного напряжения (область переключения ло- гического элемента). При больших значениях входного напряжения, превышающих пороговый уровень логической единицы (/вхпор, на выходе устанавливается стандартный уровень логического нуля (7В°ЫХ. Таким образом, при работе логическою элемента в статическом (установившемся) режиме недопустимы входные напряжения (7вхпор < ^вх < ^вх пор- Допустимыми считаются такие помехи, кото- рые, наложившись на входное напряжение, не выведут его в область недопустимых значений (см. рис. 3.7). Важнейшим динамическим параметром является быстродействие логических элементов. Оно оценивается задержкой распространения сигнала от входа к выходу логического элемента при включении и выключении (логический элемент включен, если на ею выходе уровень логического нуля, и наоборот). Временные диаграммы пе- реключения инвертирующего логического элемента показаны на рис. 3.8. Рис. 3.8. Временные диаграммы входного и выходного напряжений при переключении инвертирующего логического элемента
Время задержки измеряется на выходе по отношению ко входу на уровнях 0,5 от установившихся значений напряжений (см. рис. 3.8). Часто используется средняя задержка распространения сиг- нала: А, ср = 0,5(/зд'р + г'д°р) [нс]. Чем меньше этот параметр, тем выше быстродействие логического элемента. Этот параметр исполь- зуется при расчете задержки распространения сигналов в сложных логических схемах. На быстродействие цифровых устройств влияют также емкости нагрузки и паразитные монтажные емкости, на перезаряд которых требуются затраты времени. В справочных данных приводятся вход- ные и выходные емкости логических элементов, что позволяет под- считать емкости нагрузки в узлах схемы. Предельно допустимая ем- кость указывает границу, при которой гарантируется работоспособ- ность логического элемента. Мощности, потребляемые логическими элементами, делят на ста- тические и динамические. Статическая мощность потребляется эле- ментом, который не переключается, это средняя потребляемая мощ- ность Рпот ср, определяемая по формуле Рпотср = 0,5(Ри + Р') [мВт], где Р'' — мощность потребляемая от источника питания при низком уровне выходного напряжения, а Р' — при высоком уровне. При переключении потребляется дополнительно динамическая мощность, которая пропорциональна частоте переключения. Таким образом, полная потребляемая мощность Рпот = Рпот ср + Рдин зависит от частоты переключения элемента. Следовательно, быстродействие логического элемента и полная потребляемая мощность взаимосвя- заны при увеличении быстродействия возрастает потребляемая мощность. Энергия переключения Е логического элемента из одного логи- ческого состояния в другое определяется по формуле F — р t 1 пот зд.рср* Этот параметр используется для сравнения различных типов ло- гических элементов. Лучше тот логический элемент, у которого этот параметр меньше. Сравнительная оценка логических элементов различных схемотех- нических типов. Промышленность выпускает логические элементы ТТЛШ повышенного быстродействия при относительно большой мощности потребления (серия 1531) и маломощные, но с меньшим
быстродействием (серия 1533). Эти логические элементы обладают высокой помехоустойчивостью и большой нагрузочной способ- ностью. Логические элементы схемотехники КМОП отличаются исклю- чительно малым потреблением энергии, высокой помехоустойчиво- стью и нагрузочной способностью. Наряду с этим, логические эле- менты схемотехники КМОП имеют ограниченный коэффициент объединения по входу. По быстродействию логические элементы современных серий схемотехники КМОП, например серии 1554, не уступают микросхемам схемотехники ТТЛШ Наилучшим сочетанием всех параметров обладают логические элементы схемотехники Би-КМОП. Типы выходных каскадов цифровых элементов Цифровые элементы (логические, запоминающие, буферные) могут иметь выходы следующих типов. • логические; • с третьим или Z-состоянием; • с открытым коллектором (стоком); • с открытым эмиттером (истоком). Наличие четырех типов выходов объясняется различными усло- виями работы элементов в логических цепях, магистрально-модуль- ных системах и т.д. Выход с открытым эмиттером (истоком) харак- терен для элементов ЭСЛ (эмиттерно-связанная логика), которые применялись для реализации цифровых устройств сверхвысокого быстродействия. Их основным недостатком является большая энер- гия переключения, поэтому в настоящее время элементы ЭСЛ при- меняются редко, поскольку современные элементы схемотехники Би-КМОП обладают лучшим сочетанием параметров. Исходя из вы- шесказанного, рассмотрим более подробно первые три типа выходов. Логический выход Логический выход формирует два уровня выходного напряжения (17° и (У1). Выходное сопротивление логического выхода стремятся сделать малым для увеличения выходных токов с целью увеличения скорости перезаряда емкостных нагрузок, т.е. для получения высо- кого быстродействия элемента. Такой тип выхода имеют большин- ство логических элементов, используемых в КЦУ. Схемы логических выходов элементов схемотехники ТТЛШ, КМОП и Би-КМОП подобны двухтактным каскадам усилителей:
в них оба фронта выходного напряжения формируются с участием активных транзисторов, работающих противофазно, что обеспечи- вает малые выходные сопротивления при любом направлении пере- ключения выхода (рис. 3.9). Рис. 3.9. Схемы логических выходов цифровых элементов схемотехники ТТЛШ (а) и КМОП (б) В схеме на рис. 3.9, а использованы транзисторы Шоттки. За счет этого уменьшается энергия переключения. Схема выхода элементов схемотехники Би-КМОП отличается от схемы на рис. 3.9, а тем, что используются обычные биполярные транзисторы. Первая особенность таких выходов состоит в том, что их нельзя соединять параллельно по двум причинам. Во-первых, это создает логическую неопределенность, так как в точке соединения выхода, формирующего логическую единицу и выхода, формирующего ло- гический ноль, не будет стандартного уровня. Во-вторых, при соеди- нении выходов, находящихся в различных логических состояниях, возникает их «противоборство». Вследствие малых выходных сопро- тивлений возникает уравнительный ток большой величины, чго мо- жет вывести из строя элементы выходных цепей. Вторая особенность логического выхода двухтактного типа свя- зана с протеканием через оба транзистора коротких импульсов тока при переключении из одного логического состояния в другое. Эти токи протекают от источника питания на корпус и называются сквозными. В статических состояниях таких токов нет, так как один из транзисторов всегда заперт. При переходных процессах возникает кратковременная ситуация, в которой оба транзистора одновременно открыты, что и порождает короткий импульс сквозного тока значи-
тельной величины (рис. 3.10) и приводит к увеличению потребля- емой мощности. Рис. 3.10. Временная диаграмма тока, потребляемого цифровым элементом при переключении из одного логического состояния в другое Следует отметить, что импульсные токи возникают в цепях пита- ния цифровых элементов не только из-за сквозных токов, но и вслед- ствие перезаряда емкостей. Поэтому в цепях питания цифровых эле- ментов возникают импульсные токовые помехи. Для борьбы с ними требуется «хорошая земля» и фильтрация напряжения питания. Выход с тремя состояниями Цифровые элементы с тремя состояниями выхода, кроме логиче- ских состояний нуля и единицы, имеют третье состояние — «отклю- чено» или Z-состояние, в котором ток выходной цепи крайне мал, что соответствует отключению выхода элемента от внешней на- грузки. В третье состояние элемент переводится специальным управ- ляющим сигналом O£(Output Enable), обеспечивающим запертое состояние обоих транзисторов выходного каскада (рис. 3.11). При наличии разрешения (ОЕ = 0) элемент работает, как обычно, выпол- няя свою логическую операцию, а при отсутствии разрешения {ОЕ = 1) переходит в третье состояние. На рис. 3.11 показан выходной каскад с третьим состоянием, ис- пользуемый в схемотехнике КМОП. Низкий уровень сигнала ОЕ (ОЕ = 0) открывает транзисторы 173 и 1'74 и позволяет нормально работать инвертору на транзисторах VT1 и VT2, через который данные передаются на выход. При высо- ком уровне сигнала ОЕ (ОЕ = 1) транзисторы VT3 и 174 заперты и выход /находится в состоянии «отключено». В цифровых устройствах широко используются буферные эле- менты с тремя состояниями выхода для управляемой передачи дан-
a) Рис. 3.11. Инвертор схемотехники К МОП с тремя состояниями выхода: принципиальная схема (а) и условное графическое обозначение (б) ных по различным линиям. Буферы могут быть инвертирующими или неинвертирующими, а сигналы ОБ — прямыми или инверс- ными. Выходы с тремя состояниями обозначают на УГО элементов значком треугольника (рис. 3.11, б). Выходы с тремя состояниями можно соединять параллельно при условии, что в любой момент активным может быть только один из них. В этом случае отключенные выходы не мешают активному элементу формировать сигналы в точке соединения выходов. Это по- зволяет использовать элементы с тремя состояниями выхода в маги- стрально-модульных микропроцессорных и иных системах для по- очередной передачи информации от нескольких источников к при- емнику по одной линии связи (шине). Следует отметить, что эту задачу в настоящее время часто решают с помощью мультиплексоров. Выход с открытым коллектором (стоком) Элементы с открытым коллектором (стоком) имеют выходную цепь, заканчивающуюся одиночным транзистором, коллектор (сток) которого не соединен с какими-либо цепями внутри ИС, т.е. верхний выходной транзистор VT\ отсутствует (рис. 3.12). Следовательно, нижний транзистор К72 имеет свободный или открытый коллектор (сток), который является выходом элемента (см. рис. 3.12). Этот транзистор управляется от предыдущей части схемы эле- мента так, что может находиться в насыщенном (для МОП-транзи-
Рис. 3.12. Схемы выходов цифровых элементов с открытым коллектором (стоком) схемотехники ТТИШ (а) и схемотехники КМОП (б) стора — просто открытом) или запертом состоянии. Насыщенное ( открытое) состояние трактуется как отображение логического нуля, закрытое — единицы. Насыщение транзистора в схеме с открытым коллектором обес- печивает на выходе элемента напряжение U0 (малое напряжение насыщения «коллектор—эмиттер* UK3ii). Запирание транзистора ка- кого-либо уровня напряжения на выходе элемента не задаст, выход при этом имеет неизвестный «плавающий» потенциал, так как не подключен к каким-либо цепям. Поэтому для формирования вы- сокого уровня напряжения при запирании транзистора на выходе элементов с открытым коллектором (стоком) требуется подключать внешние резисторы (или другие нагрузки), соединенные с источни- ком питания (см. рис. 3.12). Выходы элементов с открытым коллектором (стоком) можно со- единять параллельно, подключая их к общему резистору (рис. 3.13, а). При этом можно получить режим поочередной работы элементов на общую линию, как и для элементов с тремя состояниями выхода, если активным будет лишь один элемент, а выходные транзисторы всех остальных элементов будут заперты. Если же разрешить актив- ную работу всех элементов, выходы которых соединены, то можно получить дополнительную логическую операцию монтажной логики (монтажное «И») над выходными сигналами логических элементов (см. рис. 3.13, а). При реализации монтажной логики высокий уровень и' на об- щем выходе Y возникает только при запирании выходных транзис- торов всех логических элементов, так как насыщение хотя бы одного из них снижает выходное напряжение до уровня £7° = £/кэн. По- скольку каждый элемент выполняет операцию «И-НЕ» над своими входными аргументами, общий результат окажется следующим;
Рис. 3.13. Схема реализации монтажной логики (а), индикации уровня логической единицы (б) и уровня логического нуля (в) с помощью логических элементов с открытым коллектором (стоком) Таким образом, над входными аргументами выполняется логиче- ская операция «И-ИЛИ-НЕ». В условно-графическом обозначении (УГО) элементов с откры- тым коллектором (стоком) ставится ромб с черточкой снизу (см. рис. 3.13). На рис. 3.13, б и в показана схема индикации уровня логической единицы и нуля соответственно с помощью светодиодного индика- тора HG1. Роль ключевого элемента выполняет инвертор с открытым коллектором (стоком). В первой схеме замыкается цепь для прямого тока светодиода и диод зажигается, если выходной транзистор ин- вертора открыт (на входе схемы уровень логической единицы), а во второй — наоборот, если выходной транзистор закрыт (на входе схемы уровень логического нуля). В схеме на рис. 3.13, б через светодиод будет протекать ток ипп ~ипт ~и° 1а - —------—------; следовательно, для его задания требуется вы- R иип-и п -и° полнение условия R = —------—------. В этом случае требуется А управляющий элемент с достаточно большим выходным током в ну- левом состоянии1V > Выл д
В схеме на рис. 3.13, в через светодиод протекает ток К =--------^2-, откуда следует R = —---Выходной ток Л /д управляющего элемента должен удовлетворять условию ,о >ии,а-^ 1 вых — r Достоинством элементов с открытым коллектором (стоком) при работе в магистрально-модульных системах является их защищен- ность от повреждений из-за ошибок управления, приводящих к од- новременной выдаче на общую шину нескольких слов, а также воз- можность реализации дополнительных логических операций мон- тажной логики. Недостатком таких элементов является большая задержка пере- ключения из состояния логического нуля в состояние логической единицы из-за медленного заряда выходной емкости малым током резистора R. Во многих современных ИС используются выходные каскады с возможностью их программирования на работу в одном из двух вариантов: либо как каскада с открытым коллектором (стоком), либо как каскада с третьим состоянием. Построение узлов цифровых устройств на стандартных микросхемах Разработанная схема цифрового устройства может содержать логи- ческие элементы с разным числом входов. Иногда необходимо исполь- зовать в схеме логические элементы, число входов которых больше или меньше выпускаемых промышленностью Рассмотрим возникающие в этих случаях особенности построения цифровых устройств. Избыточный вход мог бы быть оставлен свободным, т.е не под- ключенным к каким-либо цепям. Однако для уменьшения влияния наводимых на этот вход помех нежелательно неиспользуемый вход оставлять свободным. Для элементов схемотехники КМОП это стро- гая рекомендация При этом возможны следующие способы его включения. Неиспользуемый вход может быть подключен к любому из используемых входов Недостатком такого способа является уве- личение нагрузки на источник сигнала, что увеличивает задержку распространения сигнала, т.е. снижает быстродействие элемента. Поэтому наиболее удачным следует считать способ, при котором на неиспользуемый вход подается константа нуля или единицы, не изменяющая работу элемента для используемых входов. Причем
на свободные входы элементов «ИЛИ» и «ИЛИ-HE» подается уро- вень логического нуля (вход соединяется с корпусом устройства), а для элементов «И» и «И-НЕ» — уровень логической единицы (вход соединяется с источником питания через резистор сопротивлением несколько килоом). Логические элементы «ИЛИ-HE» и «И-НЕ», в которых исполь- зуется лишь один вход, а остальные соединены способом, описан- ным выше, выполняют операцию «НЕ». Наращивание числа входов для логических элементов «И» и «ИЛИ» не представляет трудностей, так как для получения нуж- ного числа входов берется несколько элементов, выходы которых объединяются далее элементом того же типа (рис. 3.14). Рис. 3.14. Схема наращивания числа входов для логических элементов «И» (а) и «ИЛИ» (б) Наращивание числа входов для логических элементов «И-НЕ», «ИЛИ-HE» производится аналогичным способом, но в схеме появ- ляются дополнительные инверторы (см. рис. 313). Очевидным недостатком рассмотренного метода наращивания числа входов является снижение быстродействия, что особенно про- является в схеме на рис. 3.15. Режимы неиспользуемых элементов. Если не все элементы, име- ющиеся в корпусе ИС, использованы, то следует помнить, что неис- пользованные элементы также подключены к источнику питания, который является общим для всего корпуса. Если же мощности, по- требляемые элементами в состояниях нуля и единицы, не равны, то неиспользуемый элемент следует поставить в состояние мини- мальной мощности, подав на какой-либо из его входов соответству- ющую константу.
Рис. 3.15. Схема наращивания числа входов для логических элементов «И-НЕ» (а) и «ИЛИ-НЕ» (б) Снижение нагрузок на выходах логических элементов может по- надобиться, если нагрузки превышают допустимые значения, а также для повышения быстродействия схем, на которое нагрузки элемен- тов оказывают самое непосредственное влияние. Чем больше у эле- мента — источника сигнала число нагрузок, тем большее время тра- тится на достижение выходным сигналом порогового уровня при переключении. Для предотвращения потерь быстродействия из-за нагрузок на выходах сильно нагруженных элементов применяют бу- феризацию или разделение нагрузки (рис. 3.16). Рис. 3.16. Схема снижения нагрузки на выходах логических элементов с помощью буферных элементов (а) и путем разделения нагрузки {б) Введение буферных каскадов ускоряет работу источника сигнала, но вносит собственную задержку в тракт передачи Будет ли в конеч- ном счете эффект ускорения, определяется конкретным расчетом. При разделении нагрузки новые задержки в тракт передачи сиг- нала не вводятся, но увеличивается нагрузка на тот источник сиг- нала, который питает рассматриваемую схему, поэтому и здесь эф- фективность должна оцениваться конкретным расчетом.
Схемотехника входных цепей элементов КМОП и режимы временно разомкнутых входов В цифровых устройствах на логических элементах схемотехники КМОП возможна ситуация, когда входы, которые в данное время не используются, не могут быть постоянно подключены к напряже- нию питания или общей точке схемы, поскольку это исключило бы возможность их последующего перевода в активный режим, т.е. по- дачу на них информационных сигналов. Оставлять разомкнутыми высокоомные входы также нельзя, так как на них могут наводиться произвольные потенциалы, что чревато опасными последствиями. Поэтому принято фиксировать потенциалы временно разомкнутых входов слабыми сигналами, определяющими потенциалы входов в отсутствие информационных сигналов и не играющими заметной роли при их присутствии. Для исключения паразитных потенциалов к точкам, в которых они могут возникать, подключают специальные резисторы, соеди- ненные с источником питания или с общей точкой схемы. В первом случае это «подтягивающие» резисторы, а во втором — «заземля- ющие». Цепи с такими резисторами показаны на рис. 3.17, где Ra — выходное сопротивление источника сигнала. Рис. 3.17. Схема входной цепи элемента схемотехники КМОП с подтягивающим (а) и заземляющим (б) резисторами Если подтягивающие и заземляющие резисторы имеют большое сопротивление, то сигналы, формируемые с их участием, относятся к слабым. Когда к «подтянутым» или «заземленным» точкам подклю- чаются сильные информационные сигналы (ключ К на рис. 3.17 замкнут), они преодолевают слабые сигналы, так что практически не влияют на функционирование схем.
В БИС/СБИС-программируемой логике нередко к одним и тем же выводам подключают одновременно и подтягивающие, и заземляющие резисторы, последовательно с которыми включены ключевые транзисторы. При программировании выбирается вариант фиксации потенциала вывода и согласно этому выбору замыкается один из ключевых транзисторов. 3,2. Функциональные пифровые узлы комбинационного типа Интегральные логические элементы являются основой для по- строения цифровых устройств, которые выполняют уже более слож- ные операции и относятся к классу комбинационных устройств. Основные из них: двоичные сумматоры; дешифраторы и шифра- торы; мультиплексоры и демультиплексоры; цифровые компара- торы; преобразователи кодов и др. Сумматоры Построение двоичных сумматоров обычно начинается с сумма- тора по модулю 2. Ниже приведена таблица истинности этого сум- матора. X Y Out ООО О 1 1 1 0 1 1 1 О В соответствии с принципами построения произвольной таблицы истинности получим схему сумматора по модулю 2. Эта схема при- ведена на рис. 3.18. Рис. 3.18. Принципиальная схема, реализующая таблицу истинности сумматора по модулю 2
Сумматор по модулю 2 (схема исключающего «ИЛИ») изобража- ется на схемах следующим образом: — =1 Сумматор по модулю 2 выполняет суммирование без учета пере- носа. В обычном двоичном сумматоре требуется учитывать перенос, поэтому требуются схемы, позволяющие формировать перенос в сле- дующий двоичный разряд. Таблица истинности такой схемы, назы- ваемой полусумматором, приведена ниже. А В S РО 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 В соответствии с принципами построения произвольной таблицы истинности получим схему полусумматора. Эта схема приведена на рис. 3.19. Рис. 3.19. Принципиальная схема, реализующая таблицу истинности полусумматора Условно-графическое изображение полусумматора на схемах при- ведено на рис. 3.20 А в HS S РО Рис. 3.20. Условно-графическое изображение полусумматора
Схема полусумматора формирует перенос в следующий разряд, но не может учитывать перенос из предыдущего разряда, поэтому она и называется полусумматором. Таблица истинности полного дво- ичного одноразрядного сумматора приведена ниже Р1 А в S PG 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 В соответствии с принципами построения схемы по произволь- ной таблице истинности получим схему полного двоичного однораз- рядного сумматора. Эта схема приведена на рис. 3.21. Рис. 3.21. Принципиальная схема, реализующая таблицу истинности полного двоичного одноразрядного сумматора
Полный двоичный одноразрядный сумматор изображается на схемах, как показано на рис 3.22. PI д в SM 5 РО Рис. 3.22. Условно-графическое изображение полного двоичного одноразрядного сумматора Для того чтобы получить многоразрядный сумматор, необходимо соединить входы и выходы переносов соответствуюших двоичных разрядов Схема соединения приведена на рис. 3.23. Рис. 3.23. Принципиальная схема многоразрядного двоичного сумматора Полный двоичный многоразрядный сумматор изображается на схемах, как показано на рис. 3.24. Естественно, в этой схеме рассматриваются только принципы работы двоичных сумматоров. В реальных схемах для увеличения скорости работы применяется отдельная схема формирования пере- носов для каждого двоичного разряда. Таблицу истинности для такой схемы легко получить из принципов суммирования двоичных чисел, а затем применить хорошо известные нам принципы построения схемы по произвольной таблице истинности.
PI SM АО Д1 50 А2 51 АЗ 52 53 ВО В1 В2 ВЗ РО Рис, 3.24. Изображение полного двоичного многоразрядного сумматора Цифровые компараторы Компаратор — устройство сравнения кодов чисел. В общем случае компаратор параллельных кодов двух w-разрядных двоичных чисел представляет собой комбинационную схему с 2т входами и тремя выходами («равно», «больше», «меньше»). При поступлении на входы кодов двух сравниваемых чисел сигнал логической единицы появляется только на одном из выходов В некоторых случаях ком- паратор может иметь менее трех выходов. Одноразрядный компаратор имеет два входа, на которые одно- временно поступают одноразрядные двоичные числа Х| и х2, и три у = х{х2 + Xj х2; у> = *i*2; у< = Х]Х2. Реализация такого компаратора в базисе «И-НЕ» приводит к сле- дующей схеме (рис 3.25). Многоразрядные компараторы обычно выполняют на базе одно- разрядных. При этом используется принцип последовательного срав- нения разрядов многоразрядных чисел, начиная с их старших разря-
Рис. 3.25. Одноразрядный компаратор двоичных чисел дев, так как уже на этом этапе, если х1т Ф х1т, задача может быть ре- шена однозначно и сравнения следующих за старшими разрядов не потребуется. Мультиплексоры и демультиплексоры Мультиплексорами называются устройства, которые позволяют подключать несколько входов к одному выходу. Демультиплексорами называются устройства, которые позволяют подключать один вход к нескольким выходам. В простейшем случае такую коммутацию можно осуществить при помощи ключей (рис. 3.26). Рис. 3.26. Коммутатор (мультиплексор), собранный на ключах В цифровых схемах требуется управлять ключами при помощи логических уровней. То есть нужно подобрать устройство, которое могло бы выполнять функции электронного ключа с электронным управлением цифровым сигналом. Рассмотрим таблицу истинности логического элемента «И-НЕ»:
Y X Out 0 0 1 0 1 1 1 0 1 1 1 0 Теперь один из входов элемента будем рассматривать как инфор- мационный вход электронного ключа, а другой вход — как управля- ющий. По таблице истинности отчетливо видно, что, пока на управ- ляющий вход Yподан логический ноль, сигнал со входа Xна выход Out не проходит. При подаче на управляющий вход Y логической единицы сигнал, поступающий на вход X, поступает на выход Out. То есть логический элемент «И» можно использовать в качестве электронного ключа При этом неважно, какой из входов эле- мента «И» будет использоваться в качестве управляющего входа, а какой — в качестве информационного. Остается только объединить выходы элеметов «И» на один выход. Это делается при помощи эле- мента «ИЛИ». Такая схема коммутатора приведена на рис. 3.27. Рис. 3.27. Схема мультиплексора на логических элементах В этой схеме можно одновременно включать несколько входов на один выход. Однако обычно это приводит к непредсказуемым последствиям. Кроме того, для управления требуется много входов, поэтому в состав мультиплексора включают дешифратор. Это позво- ляет управлять переключением входов микросхемы на выход при помощи двоичных кодов (рис. 3 .28). Мультиплексор изображается на принципиальных схемах, как показано на рис. 3.29. Задача передачи сигнала с одного входа микросхемы на один из нескольких выходов называется демультиплексированием. Демуль- типлексор можно построить на основе точно таких же схем логиче-
д с Адресные входы Информационные I „ входы | Рис. 3.28. Принципиальная схема мультиплексора, управляемого двоичным кодом - ХО - XI -Хл -АЗ -АО - А1 MS Рис. 3.29. Условно-графическое обозначение мультиплексора ского «И», существенным отличием от мультиплексора является возможность объединения нескольких входов в один без дополни- тельных схем. Для выбора конкретного выхода демультиплексора, как и в мультиплексоре, используется двоичный дешифратор. Схема демультиплексора приведена на рис. 3.30. Рис. 3.30. Принципиальная схема демультиплексора, управляемого двоичным кодом
Декодеры Декодеры (дешифраторы) позволяют преобразовывать одни виды двоичных кодов в другие. Преобразование производится по прави- лам, описанным в таблицах истинности, поэтому построение де- шифраторов не представляет трудностей. Для построения дешифра- тора можно воспользоваться правилами построения схемы для про- извольной таблицы истинности. Рассмотрим пример построения декодера из двоичного кода в де- сятичный. Таблица истинности такого декодера имеет следующий вид. Входы Выходы 8 4 2 1 0 1 2 3 4 5 6 7 8 9 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 В соответствии с принципами построения произвольной таблицы истинности получим схему декодера. Эта схема приведена на рис. 3.31. Точно так же можно получить схему для любого другого декодера или дешифратора. Шинные формирователи Мультиплексоры предназначены для объединения нескольких выходов в тех случаях, когда заранее известно, сколько выходов нужно объединять. Однако часто это неизвестно. Более того, часто количество объединяемых микросхем изменяется в процессе экс- плуатации устройств. Наиболее яркий пример — компьютеры, в ко- торых в процессе эксплуатации изменяется объем оперативной па- мяти, количество портов ввода-вывода, количество дисководов. В таких случаях невозможно для объединения нескольких выходов воспользоваться логическим элементом «ИЛИ».
Рис. 3,31. Принципиальная схема двоично-десятичного декодера Для объединения нескольких выходов на один вход в случае, когда заранее не известно, сколько микросхем нужно объединять, используется два способа: • монтажное «ИЛИ»; • шинные формирователи. Исторически первой схемой объединения выходов были схемы с открытым коллектором (монтажное «ИЛИ»). Схема монтажного «ИЛИ» приведена на рис. 3.32. Такое объединение микросхем называется шиной и позволяет объ- единять до 10 микросхем на один провод. Естественно, для того чтобы микросхемы не мешали друг другу, только одна из микросхем должна выдавать информацию на общий провод Остальные микро- схемы в этот момент времени должны быть отключены от шины (т.е. выходной транзистор должен быть закрыт). Это обеспечивается внешней микросхемой управления, не показанной на данном ри- сунке.
-+L/ +0 Рис, 3.32. Схема монтажного «ИЛИ» На принципиальных схемах такие элементы обозначаются, как показано на рис. 3.33 Гис. 3.33. Условно-графическое обозначение микросхемы с открытым коллектором на выходе Недостатком приведенной схемы объединения нескольких мик- росхем на один провод является низкая скорость передачи инфор- мации, обусловленная затягиванием переднего фронта. Это явление связано с различным сопротивлением заряда и разряда паразитной емкости шины. Заряд паразитной емкости происходит через сопро- тивления /?1 и R2, которые много больше сопротивления открытого транзистора. Величину этого сопротивления невозможно сделать менее некоторого предела, определяемого напряжением низкого уровня, который определяется, в свою очередь, допустимым током потребления всей схемы в целом. Временная диаграмма напряжения на шине с общим коллектором приведена на рис. 3 34 Рис. 3.34. Временные диаграммы напряжения на входе и выходе микросхемы с открытым коллектором
Естественным решением этой проблемы было бы включение транзистора в верхнее плечо схемы, но при этом возникает проблема сквозных токов, из-за которой невозможно соединять выходы циф- ровых микросхем непосредственно. Причина возникновения сквоз- ных токов поясняется на рис. 3.35. Рис. 3.35. Путь протекания сквозного тока при непосредственном соединении выходов цифровых микросхем Эта проблема исчезает, если появляется возможность закрывать транзисторы как в верхнем, так и в нижнем плече выходного каскада. Если в микросхеме закрыты оба транзистора, то такое состояние вы- хода микросхемы называется третьим состоянием или Z-состоянием выхода микросхемы. Такая возможность появляется в специализи- рованных микросхемах с третьим состоянием на выходе микро- схемы. Принципиальная схема выходного каскада микросхемы с тремя состояниями на выходе микросхемы приведена на рис. 3.36. На принципиальных схемах такие элементы обозначаются, как показано на рис. 3.37. Рис. 3.36. Принципиальная схема выходного каскада микросхемы с тремя состояниями на выходе
л1 & Рис. 3.37. Условно-графическое обозначение микросхемы с тремя состояниями на выходе Часто в микросхеме, содержащей элементы с тремя состояниями выходного каскада, объединяют управляющие сигналы всех элемен- тов в один провод. Такие микросхемы называют шинными формиро- вателями и изображают на схемах, как показано на рис. 3.38. о 1 2 3 2 3 Рис. 3.38. Условно-графическое обозначение шинного формирователя 3.3. Последовательностные устройства Триггеры Простейшая схема, позволяющая запоминать двоичную инфор- мацию, строится на основе простейших логических элементов «ИЛИ» или «И». Такая схема, построенная на элементах «И», приве- дена на рис. 3.39. Вход S (Set) позволяет устанавливать выход триг- гера Q в единичное состояние при подаче на его вход логического нуля. Вход R (Reset) позволяет сбрасывать выход триггера О в нулевое состояние при подаче на его вход логического нуля. Рис. 3.39. Схема простейшего триггера на схемах «И» Входы R и 5 инверсные (активный уровень ноль). Точно так же можно построить A.S'-триггср и на логических эле- ментах «ИЛИ». Схема RS-триггера, построенного на логических эле- ментах «ИЛИ», приведена на рис. 3 40. Единственное отличие будет
Рис. 3.40. Схема простейшего триггера на схемах «ИЛИ». Входы R м S прямые (активный уровень единица) заключаться в том, что сброс и установка триггера будут произво- диться единичными логическими уровнями. Так как триггер при построении его на различных элементах ра- ботает одинаково, то его изображение на принципиальных схемах тоже одинаково. Условно-графическое обозначение асинхронного /?5-триггера с инверсными входами на принципиальных схемах при- ведено на рис. 3.41. DD1 K555TP2 Рис. 3.41. Условно-графическое обозначение асинхронного RS-триггера с инверсными входами Схема триггера позволяет запоминать состояние логической схемы, но так как в начальный момент времени может возникать переходный процесс (в цифровых схемах этот процесс называется опасные гонки), то запоминать состояния логической схемы нужно только в определенные моменты времени, когда все переходные про- цессы закончены, т.е. цифровые схемы требуют синхросигнала Все переходные процессы должны закончиться за время периода син- хросигнала. Для таких цифровых схем требуются синхронные триг- геры. Схема синхронного триггера приведена на рис. 3.42, а обозна- чение на принципиальных схемах — на рис. 3 43. В приведенной схеме для записи логического нуля и логической единицы требуются разные входы, что не всегда удобно. Поэтому для запоминания дискретной информации применяются D-триггеры. D-триггер (от англ, delay — задержка) запоминает состояние входа и выдает его на выход. D-триггеры имеют как минимум два
Рис. 3.42. Схема синхронного триггера на схемах «И» S с R Т Рис. 3 43. Условно-графическое обозначение синхронного триггера входа: информационный D и синхронизации С. Вход синхрони- зации С может быть статическим (потенциальным) и динамическим. У триггеров со статическим входом С информация записывается в течение времени, при котором уровень сигнала С = 1 В триггерах с динамическим входом С информация записывается только в тече- ние перепада напряжения на входе С. Динамический вход изобра- жают на схемах треугольником. Если вершина треугольника обра- щена в сторону микросхемы (прямой динамический вход), то триг- гер срабатывает по фронту входного импульса, если от нее (инверсный динамический вход) — по срезу импульса. В таком триггере информация на выходе может быть задержана на один такт по отношению к входной информации.Так как информация на вы- ходе остается неизменной до прихода очередного импульса синхро- низации, D-триггер называют также триггером с запоминанием информации или триггером-защелкой. Рассуждая чисто теорети- чески, парафазный (двухфазный) D-триггер можно образовать из любых RS- или ТХ-триггеров, если на их входы одновременно подавать взаимно-инверсные сигналы. D-триггер в основном используется для реализации защелки. Так, например, для снятия 32 бит информации с параллельной шины бе- рут 32 D-триггера и объединяют их входы синхронизации для управ- ления записью информации в защелку а 32 D-выхода подсоединяют к шине. В одноступенчатых D-триггсрах во время прозрачности все изме- нения информации на входе D передаются на выход Q. Там, где это
нежелательно, нужно применять двухступенчатые (двухтактные, Master-Slave, MS) D-триггеры. Пример условного графического обозначения (УГО) D-триггера со статическим входом синхронизации С приведен на рис. 3.44, с ди- намическим синхронным входом С и с дополнительными асинхрон- ными инверсными входами Sи У? — на рис. 3.45. Рис. 3.44. Условно-графическое обозначение D-триггера со статическим входом синхронизации С г>т К555ТМ2 Рис. 3.45. Условно-графического обозначения D-триггера с динамическим синхронным входом С и с дополнительными асинхронными инверсными входами У и R Вс всех приведенных схемах синхросигнал работает по уровню, поэтому триггеры называются триггерами-защелками. Легче всего объяснить появление этого названия по временной диаграмме, при- веденной на рис. 3.46. По этой временной диаграмме видно, что триггер-защелка хранит данные на выходе только при нулевом уровне на входе синхрони- зации. Если же на вход синхронизации подать активный высокий уровень, то напряжение на выходе триггера будет повторять напря- жение, подаваемое на его вход. Входное напряжение запоминается только в момент изменения уровня напряжения на входе синхрони- зации С с высокого уровня на низкий. Входные данные как бы «за- щелкиваются» в этот момент, отсюда и название — триггер-защелка. Принципиально в этой схеме входной переходной процесс может беспрепятственно проходить на выход триггера. Поэтому там, где это важно, необходимо сокращать длительность импульса синхрони- зации до минимума. Чтобы преодолеть такое ограничение, были разработаны триггеры, работающие по фронту. Схема такого триг-
Рис, 3.46. Временная диаграмма D-триггера (защелки) Рис. 3.48. Условно-графическое обозначение универсального D-триггера Счетчики Счетчик числа импульсов — устройство, на выходах которого по- лучается двоичный (двоично-десятичный) код, определяемый числом поступивших импульсов. Счетчики могут строиться на двух- ступенчатых D-триггерах, Г-триггсрах и JК-триггерах. Основной параметр счетчика — модуль счета — максимальное число единичных сигналов, которое может быть сосчитано счетчи- ком. Счетчики обозначают через СТ (от англ, counter). Таблица истинности двоичного счетчика — последовательность двоичных чисел от нуля до 2Л - 1, где п — разрядность счетчика. На-
блюдение за разрядами чисел, составляющих таблицу, приводит к по- ниманию структурной схемы двоичного счетчика. Состояние млад- шего разряда при его просмотре по соответствующему столбцу таб- лицы показывает чередование нулей и единиц вида 01010101..., что естественно, так как младший разряд принимает входной сигнал и переключается от каждого входного воздействия. В следующем разряде наблюдается последовательность пар нулей и единиц вида 00110011.... В третьем разряде образуется последовательность из чет- верок нулей и единиц 00001111... и т.д. Из этого наблюдения видно, что следующий по старшинству разряд переключается с частотой, в два раза меньшей чем данный. Так как счетный триггер делит частоту входных импульсов на два, то, сопоставив этот факт с указанной выше закономерностью, ви- дим, что счетчик может быть построен в виде цепочки последова- тельно включенных счетных триггеров. Заметим, кстати, что со- гласно ГОСТу входы элементов изображаются слева, а выходы — справа. Соблюдение этого правила ведет к тому, что в числе, содержащемся в счетчике, младшие разряды расположены левее старших. Пример асинхронного трехразрядного двоичного суммирующего счетчика приведен на рис. 3 .49, а его условно-графическое обозна- чение — на рис. 3.50. Для построения этого счетчика использованы /К-триггеры с динамической синхронизацией по спаду синхросиг- нала. Каждый ТА'-триггер в счетчике включен в режим инвертирова- ния своего состояния при переключении синхросигнала с высокого Рис. 3.50. Условно-графическое обозначение трехразрядного суммирующего счетчика
Рис. 3.51. Временная диаграмма работы счетчика уровня на низкий. Идеализированная временная диаграмма работы этого счетчика показана на рис. 3.51. Быстродействие асинхронного счетчика определяется максималь- ной задержкой от изменения сигнала на его счетном входе до пол- ного установления состояния всех его выходов. Проведем оценку быстродействия на примере переключения выходов счетчика после поступления восьмого синхросигнала на его вход (рис. 3.52), так как именно в этом такте время переключения выходов счетчика будет максимальным. По фронту 1—0 сигнала С(8) с задержкой сигнала, равной /т, па триггере Qo происходит изменение сигнала на выходе Qu. Это из- менение, в свою очередь, приведет к переключению сигнала О-. с со- ответствующей задержкой относительно переключения Qo. Вслед за этим с задержкой сигнала на следующем триггере переключится сигнал Q2. То есть общее время задержки переключения сигналов на выходе трсхразрядного счетчика составит 31т. Очевидно, что для «-разрядного счетчика время задержки составит
fCT = n • ZT. Таким образом, с увеличением разрядности асинхронного счет- чика увеличивается его задержка и, следовательно, уменьшается быстродействие. Этот недостаток устраняется в счетчиках, работа- ющих по синхронной схеме. В них за счет дополнительных управля- ющих комбинационных схем обеспечивается одновременное пере- ключение всех разрядов при поступлении сигнала на счетный вход (с задержкой, равной задержке одного триггера, вне зависимости от разрядности счетчика). Обычно счетчик имеет вход установки в нулевое состояние (асин- хронный сброс составляющих его триггеров в ноль). Некоторые счет- чики имеют цепи установки в произвольное начальное состояние, с которого уже будет начинаться операция счета. Регистры Регистр хранения. Регистр — внутреннее запоминающее устрой- ство процессора или внешнего устройства, предназначенное для временного хранения обрабатываемой или управляющей информа- ции. Регистры представляют собой совокупность триггеров, количе- ство которых равняется разрядности регистра, и вспомогательных схем, обеспечивающих выполнение некоторых элементарных опе- раций. Набор этих операций в зависимости от функционального назначения регистра может включать в себя одновременную уста- новку всех разрядов регистра в ноль, параллельную или последова- тельную загрузку регистра, сдвиг содержимого регистра влево или вправо на требуемое число разрядов, управляемую выдачу информа- ции из регистра (обычно используется при работе нескольких схем на обшую шину данных) и т.д. Регистры хранения используются .для приема, хранения и выдачи многоразрядного кода Они представляют собой совокупность одно- ступенчатых триггеров (как правило, D-типа) с общим входом син- хронизации Иногда в регистре имеется также и общий вход асин- хронной установки всех триггеров в ноль. Схема четырехразрядного регистра хранения приведена на рис. 3.53, а его условно-графическое обозначение — на рис. 3 54. Регистр сдвига. Регистр сдвига — регистр, обеспечивающий по- мимо хранения информации сдвиг влево или вправо всех разрядов одновременно на одинаковое число позиций. При этом выдвигаемые за пределы регистра разряды теряются, а в освобождающиеся раз- ряды заносится информация, поступающая по отдельному внешнему
Рис. 3.53. Структура четырехразрядного регистра хранения с асинхронным входом установки в ноль Рис. 3.54. Условно-графическое обозначение четырехразрядного регистра хранения с асинхронным входом установки в ноль входу регистра сдвига. Обычно эти регистры обеспечивают сдвиг кода на одну позицию влево или вправо. Но существуют и универ- сальные регистры сдвига, которые выполняют сдвиг как влево, так и вправо в зависимости от значения сигнала на специальном управ- ляющем входе или при подаче синхросигналов на разные входы ре- гистра. Регистр сдвига может быть спроектирован и таким образом,
чтобы выполнять сдвиг одновременно не на одну, а на несколько позиций. Регистры сдвига строятся на двухступенчатых триггерах. Схема че- тырехразрядного регистра, выполняющего сдвиг на один разряд от разряда 0 кразряду 3, показана на рис. 3.55, а его условно-графиче- ское обозначение — на рис. 3 56. Ввод информации в данный ре- гистр — последовательный через внешний вход DO. Регистр имеет вход асинхронной установки всех разрядов в ноль. Для наглядности каж- дый двухступечатый регистр представлен двумя одноступенчатыми Рис. 3.56. Условно-графическое обозначение четырехразрядного регистра сдвига с асинхронным входом установки в ноль
с соответствующей организацией синхронизации первой и второй ступеней. Пунктиром обозначен реальный двухступенчатый триггер. Идеализированная временная диаграмма работы регистра сдвига, структура которого представлена на рис. 3.55, показана на рис. 3.57 С R DO ОС Q0 ОТ С1 02' 02 Q3' 03 Рис. 3.57. Временная диаграмма работы регистра сдвига Предполагаем, что начальное состояние регистра следующее: 00 = 0; Q1 = 1; 02=1; 03 = 0. Работа регистра сдвига в каждом периоде сигнала синхронизации разбивается на две фазы: при высоком и при низком значении син- хросигнала. При высоком уровне синхросигнала проводится запись значения выхода (/ - 1)-го разряда регистра в первую ступень z-ro разряда. Вто- рая ступень каждого разряда сохраняет свое прежнее значение. В этой фазе состояние первой ступени z-ro триггера повторяет со- стояние второй ступени (z - 1)-го триггера. Вторые ступени каждого
триггера, а следовательно, и выходы регистра в целом остаются не- изменными. При низком уровне синхросигнала значение, записанное в пер- вой ступени каждого триггера, перезаписывается в его вторую сту- пень. Запись в первую ступень триггера запрещена. В этой фазе со- стояния первой и второй ступеней каждого триггера становятся оди- наковыми. Поступление сигнала R - 0 вне зависимости от значения сигнала на входе синхронизации С и сигнала на входе ОО устанавливает все разряды регистра в нулевое состояние. 3.4. Запоминающие устройства Постоянные запоминающие устройства (ПЗУ) Очень часто в различных применениях требуется хранение ин- формации, которая не изменяется в процессе эксплуатации устрой- ства. Это такая информация, как программы в микроконгроллерах, начальные загрузчики и BIOS в компьютерах, таблицы коэффици- ентов цифровых фильтров в сигнальных процессорах. Практически всегда эта информация не требуется одновременно, поэтому про- стейшие устройства для запоминания постоянной информации можно построить на мультиплексорах. Схема такого постоянного запоминающего устройства приведена на рис. 3.58. Рис. 3.58. Схема ПЗУ, построенная на мультиплексоре В этой схеме построено постоянное запоминающее устройство на восемь одноразрядных ячеек. Запоминание конкретного бита
в одноразрядную ячейку производится запайкой провода к источ- нику питания (запись единицы) или запайкой провода к корпусу (запись нуля). На принципиальных схемах такое устройство обозна- чается, как показано на рис. 3.59. АО А1 А2 РО CS ROM Y Рис. 3.59. Условно-графическое обозначение ПЗУ Для того чтобы увеличить разрядность ячейки памяти ПЗУ, эти микросхемы можно соединять параллельно (выходы и записанная информация, естественно, остаются независимыми). Схема парал- лельного соединения одноразрядных ПЗУ приведена на рис. 3.60. Рис. 3.60. Схема многоразрядного ПЗУ
В реальных ПЗУ запись информации производится при помощи последней операции производства микросхемы — металлизации. Металлизация производится при помощи маски, поэтому такие ПЗУ получили название масочных ПЗУ Еще одно отличие реальных мик- росхем от упрощенной модели, приведенной выше, — это использо- вание кроме мультиплексора еще и демультиплексора. Такое реше- ние позволяет превратить одномерную запоминающую структуру в многомерную и тем самым существенно сократить объем схемы дешифратора, необходимого для работы схемы ПЗУ. Эта ситуация иллюстрируется рис. 3.61. Адрес строки Рис. 3.61. Схема масочного постоянного запоминающего устройства Масочные ПЗУ изображаются на принципиальных схемах, как показано на рис. 3.62. Адреса ячеек памяти в этой микросхеме пода- ются на выводы ЯО—А9. Микросхема выбирается сигналом CS. При помощи этого сигнала можно наращивать объем ПЗУ (пример ис- пользования сигнала CS приведен при обсуждении ОЗУ). Чтение микросхемы производится сигналом RD. Программирование масочного ПЗУ производится на заводе-из- готовителе, что очень неудобно для мелких и средних серий произ-
Рис. 3.62. Условно-графическое обозначение масочного ПЗУ водства, не говоря уже о стадии разработки устройства. Естественно, что для крупносерийного производства масочные ПЗУ являются самым дешевым видом ПЗУ и поэтому широко применяются в на- стоящее время. Для мелких и средних серий производства радиоап- паратуры были разработаны микросхемы, которые можно програм- мировать в специальных устройствах — программаторах. В этих мик- росхемах постоянное соединение проводников в запоминающей матрице заменяется плавкими перемычками, изготовленными из по- ликристаллического кремния. При производстве микросхемы изго- тавливаются все перемычки, что эквивалентно записи во все ячейки памяти логических единиц. В процессе программирования на вы- воды питания и выходы микросхемы подается повышенное питание. При этом если на выход микросхемы подается напряжение питания (логическая единица), то через перемычку ток протекать не будет и перемычка останется неповрежденной. Если же на выход микро- схемы подать низкий уровень напряжения (присоединить к корпусу), то через перемычку будет протекать гок, который испарит эту пере- мычку и при последующем считывании информации из этой ячейки будет считываться логический ноль. Такие микросхемы называются программируемыми ПЗУ (ППЗУ) и изображаются на принципиальных схемах, как показано на рис. 3.63. В качестве примера можно назвать микросхемы 155РЕЗ, 556РТ4, 556РТ8идр. Программируемые ПЗУ оказались очень удобны при мелкосерий- ном и среднесерийном производстве. Однако при разработке радио- электронных устройств часто приходится менять записываемую в ПЗУ программу. ППЗУ при этом невозможно использовать по- вторно, поэтому раз записанное ПЗУ при ошибочной или промежу- точной программе приходится выкидывать, что, естественно, повы-
АО А1 А2 АЗ А4 А5 Аб А7 А8 А& PROM 0 0 1 2 3 4 5 б 7 >RD г5 Рис. 3.63. Условно-графическое обозначение программируемого ПЗУ на принципиальных схемах шает стоимость разработки аппаратуры. Для устранения этого недо- статка был разработан еще один вид ПЗУ, который может стираться и программироваться заново. Структурная схема постоянного запоминающего устройства не отличается от описанного ранее масочного ПЗУ. В репрограмми- руемых ПЗУ стирание ранее записанной информации осуществля- ется ультрафиолетовым излучением. Для того чтобы этот свет мог беспрепятственно проходить к полупроводниковому кристаллу, в корпус микросхемы встраивается окошко из кварцевого стекла. В качестве примера таких микросхем можно назвать микросхемы 573 серии российского производства, микросхемы серий 27сХХХ зарубежного производства. В этих микросхемах чаще всего хранятся программы BIOS универсальных компьютеров. Репрограммируемые ПЗУ изображаются на принципиальных схемах, как показано на рис. 3.64. — АО — Г — А2 — АЗ — А4 — 45 — Аб — А7 — 48 — А9 ЕРЛОМ * О — 1 — 2 — 3 — 4 — 5 — 6 — 7 — WR RD CS Рис. 3.64, Условно-графическое обозначение репрограммируемого ПЗУ Дороговизна корпусов с кварцевым окошком, а также малое ко- личество циклов записи-стирания привели к поиску способов сти-
рания информации из ППЗУ электрическим способом. На этом пути встретилось много трудностей, которые к настоящему времени прак- тически решены. Сейчас достаточно широко распространены мик- росхемы с электрическим стиранием информации. В качестве запо- минающей ячейки в них используются такие же ячейки, как и в РПЗУ, но они стираются электрическим потенциалом, поэтому количество циклов записи-стирания для этих микросхем достигает 1000000 раз Время стирания ячейки памяти в таких микросхемах уменьшается до 10 мс. Схема управления для таких микросхем полу- чилась сложная, поэтому наметилось два направления развития этих микросхем: • ЭСППЗУ; • ИуШЛПЗУ. Электрически стираемые ППЗУ дороже и меньше по объему, но зато позволяют перезаписывать каждую ячейку памяти отдельно. В результате эти микросхемы обладают максимальным количеством циклов записи-стирания. Область применения электрически стира- емых ПЗУ — хранение данных, которые не должны стираться при выключении питания. К таким микросхемам относятся отече- ственные микросхемы 573PP3, 558РР и зарубежные микросхемы серии 28сХХ. Электрически стираемые ПЗУ обозначаются на схемах, как показано на рис. 3.65. — до — д1 — 42 — ДЗ — А4 — 45 — Дб — .47 — да — 49 WR RD с$ EEPROM $ О — 1 — 2 — 3 — 4 — - - 6 — 7— Рис. 3.65. Условно-графическое обозначение электрически стираемого ПЗУ В последнее время наметилась тенденция уменьшения габаритов ЭСППЗУ за счет уменьшения количества внешних ножек микро- схем. Для этого адрес и данные передаются в микросхему и из мик- росхемы через последовательный порт. При этом используются два вида последовательных портов — 577-порт и 12С-порт (микросхемы 93сХХ и 24сХХ серий соответственно). Зарубежной серии 24сХХ со- ответствует отечественная серия микросхем 558РРХ.
/ZASZT-ПЗУ (рис. 3.66) отличаются от ЭСППЗУ тем, что стирание производится не каждой ячейки отдельно, а всей микросхемы в це- лом или блока запоминающей матрицы этой микросхемы, как это делалось в РПЗУ Рис. .3.66. Обозначение ТЯЗЗЯ-памяти на принципиальных схемах При обращении к постоянному запоминающему устройству сна- чала необходимо выставить адрес ячейки памяти на шине адреса, а затем произвести операцию чтения из микросхемы. Эта временная диаграмма приведена на рис. 3.67. Рис. 3.67. Временная диаграмма чтения информации из ПЗУ На рис. 3.67 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке RD — это сигнал чтения; А — сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое со- стояние); D — выходная информация, считанная из выбранной ячейки ПЗУ.
Статические оперативные запоминающие устройства (ОЗУ) В радиоаппаратуре часто требуется хранение временной инфор- мации, значение которой неважно при включении устройства. Такую память можно было бы построить на микросхемах EEPROM или FLASH-памяти, но, к сожалению, эти микросхемы дороги, обладают малым количеством перезаписей и чрезвычайно низким быстродей- ствием при считывании и, особенно, записи информации. Для хра- нения временной информации можно воспользоваться параллель- ными регистрами. Так как запоминаемые слова не нужны одновре- менно, то можно воспользоваться механизмом адресации, который применяется в ПЗУ. Схема, в которой в качестве запоминающей ячейки используется параллельный регистр, называется статическим ОЗУ, так как инфор- мация в ней сохраняется все время, пока к микросхеме подключено питание. В отличие от статического ОЗУ в микросхемах динамиче- ского ОЗУ постоянно требуется регенерировать их содержимое, иначе информация будет испорчена. В микросхемах ОЗУ присутствуют две операции: операция за- писи и операция чтения. Для записи и чтения информации можно использовать различные шины данных (как это делается в сигналь- ных процессорах), но чаще используется одна и та же шина данных. Это позволяет экономить выводы микросхем, подключаемых к этой шине, и легко осуществлять коммутацию сигналов между различ- ными устройствами. Схема статического ОЗУ приведена на рис. 3.68. Вход и выход в этой схеме объединены при помощи шинного формирователя. Ес- тественно, что схемы реальных ОЗУ будут отличаться от приведен- ной на этом рисунке. Тем не менее приведенная схема позволяет понять, как работает реальное ОЗУ. Условно-графическое обозна- чение ОЗУ на принципиальных схемах приведено на рис. 3.69. Сигнал записи ИЗ? позволяет записать логические уровни, при- сутствующие на информационных входах, во внутреннюю ячейку ОЗУ. Сигнал чтения RD позволяет выдать содержимое внутренней ячейки памяти на информационные выходы микросхемы. В приве- денной на рис. 3.68 схеме невозможно одновременно производить операцию записи и чтения, но обычно это и не нужно. Конкретная ячейка микросхемы выбирается при помощи двоич- ного кода — адреса ячейки. Объем памяти микросхемы зависит от количества ячеек, содержащихся в ней, или, что то же самое,
Рис. 3.68. Структурная схема ОЗУ — АО — Д1 — А2 — ДЗ — А4 — А5 — Аб — Д7 — Д8 — А9 RAM О — 1 — 2 — 3 — 4 — 5 — б — 7 — WR RD CS Рис. 3.69. Условно-графическое обозначение ОЗУ на принципиальных схемах от количества адресных проводов Количество ячеек в микросхеме можно определить по количеству адресных проводов, возводя 2 в сте- пень, равную количеству адресных выводов в микросхеме: М=2". Вывод выбора кристалла CS позволяет объединять несколько микросхем для увеличения объема памяти ОЗУ. Закая схема приве- дена на рис. 3.70. Статические ОЗУ требуют для своего построения большой пло- щади кристалла, поэтому их емкость относительно невелика. Стати- ческие ОЗУ применяются для построения микроконтроллерных схем из-за простоты построения принципиальной схемы и возможности
Рис. 3.70. Схема ОЗУ, построенного на нескольких микросхемах памяти
работать на сколь угодно низких частотах, вплоть до постоянного тока. Кроме того, статические ОЗУ применяются для построения кэш-памяти в универсальных компьютерах из-за высокого быстро- действия статического ОЗУ. Временные диаграммы чтения из статического ОЗУ совпадают с временными диаграммами чтения из ПЗУ Временные диаграммы записи в статическое ОЗУ и чтения из него приведены на рис. 3.71. Рис. 3.71. Временная диаграмма обращения к ОЗУ, принятая для схем, совместимых со стандартом фирмы «Intel» На рис. 3.7J стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке RD — это сигнал чтения; A'R — сигнал записи; А — сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут прини- мать разные значения, то показаны пути перехода как в единичное, так и в нулевое состояние); DI — входная информация, предназна- ченная для записи в ячейку ОЗУ, расположенную по адресу A J; DO — выходная информация, считанная из ячейки ОЗУ, расположенной по адресу А 2. На рис. 3.72 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке R/W— это сигнал выбора операции записи или чтения; DS — сигнал стробирования данных; А — сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое со-
Рис. 3.72. Временная диаграмма обращения к ОЗУ, принятая для схем, совместимых со стандартом фирмы «Motorola» стояние); DI — входная информация, предназначенная для записи в ячейку ОЗУ. расположенную по адресу А\; 00 — выходная инфор- мация, считанная из ячейки ОЗУ, расположенной по адресу А2. 3.5. Арифметике логическое устройство Ранее мы рассмотрели схемы сумматора двоичных кодов. Также было показано, что при использовании дополнительных кодов опе- рацию вычитания двух положительных чисел можно заменить опе- рацией суммирования положительного и отрицательного чисел. Для получения кода отрицательного числа необходимо ироинвертировать его и к полученному результату прибавить число 1. Принципиальная схема вычитателя числа Л из числа В приведена на рис. 3.73, а, а схема вычитателя числа В из числа Л — на рис. 3.73, б. В этих схемах прибавлеление единицы к проинвертированному числу осуществляются подачей уровня логической единицы на вход переноса Р/схемы сумматора. Основным элементом этих двух схем является арифметический сумматор Различаются они лишь местом включения инверторов. Если в схему ввести коммутатор, который будет изменять ее внут- реннюю структуру в зависимости от выполняемой арифметической операции, то получим арифметическое устройство (рис. 3.74). В приведенной на рис. 3.74 схеме используются четырехвходовые мультиплексоры, для управления каждым из которых достаточно двух бит. То есть для управления всей схемой в целом достаточно
+U. /10— । Д1 —2 Д2— 2 ДЗ—Т во 31 32 ВЗ PI SM 50 51 52 S3 АО Д1 Д2 ДЗ ВО 81 В2 ВЗ РО а) 50 51 52 S3 6) Рис. 3.73. Принципиальная схема вычитателя: а — числа А из числа В; б — числа В из числа А КО К1 К2 КЗ PI М Рис. 3.74. Структурная схема арифметического устройства четырех проводов управления. Попытаемся построить таблицу опе- раций, которые будет выполнять арифметико-логическое устройство (АЛУ), схема которого приведена на рис. 3.74. На результат операции будет влиять вход переноса сумматора PI, поэтому этот вход тоже включим в состав кода, управляющего схемой АЛУ. Операции, ко- торые выполняются арифметической схемой в зависимости от по- данного на управляющие линии кода, приведены в табл. 3.1.
Таблица 3.1 Коды математических операций арифметического устройства Номер строки Управляющий код Выполняемая операция КО К1 К2 КЗ PI 0 0 0 0 0 0 S=A + B 1 0 0 0 0 1 S=A + В+\ 2 0 0 0 1 0 S=B-A-\ 3 0 0 0 1 1 S=B-A 4 0 0 1 0 0 S=B— 1 5 0 0 1 0 1 S=B 6 0 0 1 1 0 S=B 7 0 0 1 1 1 S=B+\ 8 0 1 0 0 0 S=A-B-1 9 0 1 0 0 1 S=A-B 10 0 1 0 1 0 S=-A-B-2 11 0 1 0 1 1 S-—A-B- 1 12 0 1 1 0 0 S=-B-2 13 0 1 1 0 1 S=—B — 1 14 0 1 1 1 0 S=—B —1 15 0 1 1 1 1 S= -B 16 1 0 0 0 0 S = A-\ 17 1 0 0 0 1 S=A 18 1 0 0 1 0 S=-A-2 19 1 0 0 1 1 S=-A- 1 20 1 0 1 0 0 S=-2 21 1 0 1 0 1 S=-\ 22 1 0 1 1 0 S=-\ 23 1 0 1 1 1 5=0 24 1 1 0 0 0 S=A 25 1 1 0 0 1 S=A + 1 26 1 1 0 1 0 S=-A- 1 27 1 1 0 1 1 S=—A 28 1 1 1 0 0 S=-l 29 1 1 1 0 1 5=0 30 1 1 1 1 0 5=0 31 1 1 1 1 1 5=+l
Проанализируем эту таблицу. Если на все управляющие входы подать низкий потенциал (управляющий код равен 0000), то к входу сумматора будут подключены коды Л и В без инверсии. В этом случае будет производиться операция суммирования. Эта ситуация отобра- жена первыми двумя строками таблицы выполняемых операций. Операция вычитания осуществляется второй, третьей, восьмой и де- вятой строками. В этом случае один из операндов поступает на вход сумматора через блок инверторов. Правда, для получения дополни- тельного кода не хватает единицы, но ее можно подать на вход пере- носа сумматора PI. Еше одной часто используемой операцией явля- ется увеличение числа на единицу или уменьшение числа на еди- ницу. Эти операции позволяют легко организовывать циклы в программе и переходить от предыдущего операнда к следующему. Такие операции могут быть выполнены при помощи кодов, записан- ных в строках четыре, семь, шестнадцать и двадцать пять. Кроме того, схема арифметического устройства может просто передавать на выход любой из входных кодов без изменения, что позволяет осу- ществлять копирование данных (суммирование с константой ноль) через это устройство без дополнительных схем коммутации. При небольшом изменении схемы такое устройство может быть преобразовано в схему, которая позволяет осуществлять не только арифметические, но и логические операции. Для этого нужно ввести дополнительный коммутатор, который будет разрывать цепи пере- носа между разрядами. Эта управляющая цепь обычно называется М. Подобная схема реализована в микросхеме АЛУ К155ИПЗ (ино- странный аналог 74181). Условно-графическое обозначение ариф- метико-логического устройства приведено на рис. 3.75. Внутреннюю схему данного АЛУ можно посмотреть в [16]. Таким образом, арифметико-логические устройства позволяют выбирать вид выполняемой операции при помощи кода, подава- емого на специальные выводы микросхемы. Это позволяет програм- мировать одно и то же устройство для выполнения различных функций. Разработка такого устройства позволила обменивать боль- шую скорость выполнения отдельных операций на сложность реа- лизуемого алгоритма, что в конце концов привело к разработке мик- ропроцессорных систем.
L AIU Р G 64 К до во F0 41 S1 51 42 32 F2 АЗ ВЗ F3 50 51 52 53 М Рис. 3.75. Условно-графическое обозначение арифметико-логического устройства ИМС К155ИПЗ Контрольные вопросы и задания 1. Исследуйте работу асинхронного Л5'-триггера. 2. Исследуйте работу полусумматора двоичных чисел. 3. Исследуйте работу одноразрядного компаратора двоичных чисел. 4. Согласно прведенной ниже таблице истинности постройте схему муль- типлексора. А1 ЛО Y 0 0 D0 0 1 D\ 1 0 D2 1 1 D3 5. Постройте и исследуйте принципиальную схему демультиплексора, управляемого д воичным кодом. 6. Постройте схему и исследуйте принцип работы двоично-десятичного декодера. 7. 11 встройте и исследуйте структуру восьмиразрядного регистра хранения с асинхронным входом установки в ноль. 8. Опишите принцип работы АЛУ. 9. Постройте принципиальную схему вычитателя числа А из числа В и схему вычитателя числа В из числа А. 10. Опишите принцип работы схемы масочного постоянного запомина- ющего устройства. 11. Исследуйте схему ОЗУ, построенного на четырех микросхемах памяти, и опишите процедуру обращения к постоянному запоминающему устройству на примере операции чтения из микросхемы.
12. Для чего нужен триггер? Где применяются триггеры? 13. Имеет ли принципиальное значение, выход какого из элементов счи- тать прямым выходом триггера? 14. Что произойдет, если на входы R и 5 триггера подать одновременно две единицы? 15. В чем заключается отличие полного одноразрядного двоичного сумма- тора от полусумматора? 16. Перечислите основные функциональные цифровые узлы комбинаци- онного типа и укажите их назначение. 17. Какие устройства необходимо использовать в случае, когда заранее не- известно, сколько выходов микросхем нужно объединять на один вход? 18. Согласно ГОСТу входы элементов изображаются слева, а выходы — справа. Соблюдая это правило при проектировании двоичного счет- чика, в числе, содержащемся в счетчике, младшие разряды будут рас- положены левее старших или правее? 19. Каково назначение арифметико-логического устройства? 20. Каково назначение статической и динамической памяти? В чем заклю- чается их отличие? 21. Как зависит количество ячеек памяти ОЗУ от количества адресных вы- водов в микросхеме? 22. Программируемые ПЗУ (ППЗУ). Каким образом осуществляется про- цесс программирования? 23. Какие микросхемы репрограммируемого ПЗУ российского и зарубеж- ною производства вы знаете?
Глава 4 АРХИТЕКТУРА МИКРОПРОЦЕССОРОВ 4.1. Принципы реализации микропроцессоров Принципы микропрограммного управления В условиях, когда микропрограммирование не используется, вы- полнение команды обеспечивается электрической схемой. Но в большинстве современных вычислительных машин непосред- ственная связь между аппаратурой и программными средствами осуществляется через микропрограммный уровень. Любая машинная команда исполняется аппаратурой не непосредственно, а путем ее интерпретации в соответственную последовательность более простых действий. А значит, всегда существует задача программирования ма- шинных команд из более простых действий — микропрограммиро- вание. Впервые этот термин был введен в 1953 г. специалистом по ВТ Уилксом. Но это было применимо только к аппаратным средствам. Примерно в середине 1960-х гг. усилиями разработчиков <4ВМ» идеи Уилкса превратились в принцип организации вычислительных ма- шин. Микропрограммирование обеспечило переход к модульному по- строению ЭВМ Развивая идеи микропрограммирования, Глушков показал, что в любом устройстве обработки информации функцио- нально можно выделить операционный автомат и управляющий ав- томат (рис. 4 1). Рис . 4.1. Схема устройства обработки информации
Управляющий блок предназначен для обеспечения работы всех узлов и устройств ЭВМ в соответствии с выполняемой программой. Основные функции управляющего блока: • организация пуска и остановки ЭВМ; • определение очередности выбора команд из оперативной памяти; • формирование физических адресов операндов; • формирование последовательности управляющих сигналов для выполнения арифметических, логических и иных операций при выполнении программы; • обеспечение работы ЭВМ в различных режимах; • автоматическое выполнение программы; • пошаговое выполнение программы; • режим прерывания; • режим прямого доступа к памяти и т.д. На рис. 4.2 приведена обобщенная структура устройства управ- ления (УУ). Рис. 4 2. Обобщенная структура УУ ЦУУ — центральное УУ, которое выполняет основные функции по реализации программы. МУУ — местное УУ (находится при каждом из устройств, вхо- дящих в состав ЭВМ). Оно реализует специфические алгоритмы, соответствующие принципам действия различных внешних устройств. ВЗУ — внешнее запоминающее устройство. Иерархическая структура понятий при постановке задач на ЭВМ представлена на рис. 4.3. Алгоритм — это система последовательных операций (в соответ- ствии с определенными правилами) для решения поставленной за- дачи. Программа — кодированная запись алгоритма. Команда — кодированная запись вычислительной, логической или иной операции. В устройствах ЭВМ команда физически выпол- няется с помощью микроопераций.
Задача Алгоритм Программа Команда Микрооперация Рис. 4.3. Иерархическая структура понятий при постановке задач на ЭВМ Микрооперация — некоторое простейшее преобразование данных, например прием байта данных в регистр, инверсия переменной и т.д. Порядок функционирования устройства базируется на следующих положениях. 1. Любая машинная команда рассматривается как некоторое сложное действие, которое состоит из последовательности элемен- тарных действий над словами информации — микроопераций. 2. Порядок следования микроопераций зависит не только от зна- чений преобразуемых слов, но также от их информационных сигна- лов, вырабатываемых операционным автоматом. Примерами таких сигналов могут быть признаки результата операции, значения от- дельных битов данных и т.п. 3. Процесс выполнения машиной команды описывается в виде некоторого алгоритма в терминах микроопераций и логических условий. Описание информационных сигналов — микропрог- рамма. 4. Микропрограмма служит не только для обработки данных, но и обеспечивает управление работой всего устройства в целом — принцип микропрограммного управления. Таким образом, основная задача уровня микроархитектуры — ин- терпретация команд второго уровня архитектуры команд (см. рис. 1.2). На этом уровне регистры вместе с АЛУ формируют тракт данных, по которому поступают данные. На некоторых машинах ра- бота тракта данных контролируется особой программой, которая называется микропрограммой. На других машинах тракт данных кон- тролируется аппаратными средствами. Строение уровня микроархи- тектуры зависит от уровня архитектуры команд, а также от стоимости и назначения компьютера.
Однако до недавнего времени этот принцип микропрограмм- ного управления в вычислительных машинах широкого примене- ния не находил. Объясняется это несколькими причинами. С одной стороны, не существовали достаточно надежные и дешевые быст- родействующие запоминающие устройства для хранения микро- программ; с другой стороны, неправильно понимались задачи мик- ропрограммирования и те выгоды, которые оно может принести. Предполагалось, что главная ценность микропрограммирования состоит в том, что каждый потребитель может сконструировать себе из микропрограмм тот набор команд, который наиболее выгоден для его конкретной задачи. Переход от одного набора команд к дру- гому достигался бы путем простой замены информации в запоми- нающем устройстве без физического переконструирования устрой- ства. Чтобы освободить программиста от необходимости детально изу- чать устройство машины, необходимо использовать методы автома- тического программирования и в максимальной степени приблизить язык программирования к языку человека. И уже с 1970 г., когда микропрограммирование стало обычным, у производителей появи- лась возможность вводить новые машинные команды путем расши- рения микропрограммы, т.е. с помощью программирования. Это открытие привело к виртуальному взрыву в производстве программ машинных команд, поскольку производители начали конкурировать друг с другом, стараясь выпустить лучшие программы. Эти команды не представляли особой ценности, поскольку те же задачи можно было легко решить, используя уже существующие программы, но обычно они работали немного быстрее. Связь с микрокодом и архитектурой набора команд Как было сказано выше (см. п. 1.2), в компьютерной инженерии микроархитектура, также называемая организацией компьютера, — это способ, которым данная архитектура набора команд (АНК) реа- лизована в процессоре. Каждая АНК может быть реализована с по- мощью различных микроархитектур. Реализация может варьиро- ваться в зависимости от целей конкретной разработки или в результате технологических сдвигов. Архитектура компьютера яв- ляется комбинацией микроархитектуры, микрокода и архитектуры набора команд. Архитектура набора команд (англ, instruction set architecture, ISA) определяет программируемую часть ядра микропроцессора.
Микроархитектура описывает модель, топологию и реализацию архитектуры набора команд на микросхеме микропроцессора. На этом уровне определяется: • конструкция и взаимосвязь основных блоков центрального про- цессора; • структура ядер, исполнительных устройств, АЛУ, а также их взаи- модействия; • блоки предсказания переходов; • организация конвейеров; • организация кэш-памяти; • взаимодействие с внешними устройствами. В рамках одного семейства микропроцессоров микроархитектура со временем расширяется путем добавления новых усовершенство- ваний и оптимизации существующих команд с целью повышения производительности, энергосбережения и функциональных возмож- ностей микропроцессора. При этом сохраняется совместимость с предыдущей версией ISA. Во многих случаях работа элементов микроархитектуры контролируется микрокодом, встроенным в про- цессор. В случае наличия слоя микрокода в архитектуре процессора он выступает своеобразным интерпретатором, преобразуя команды уровня АПК в команды уровня микроархитектуры. При этом различ- ные системы команд могут быть реализованы на базе одной микро- архитектуры. Микроархитектура машины обычно представляется в виде диа- грамм определенной степени детализации, описывающих взаимо- связи различных микроархитектурных элементов, которые могут быть чем угодно: от отдельных вентилей и регистров до целых ариф- метико-логических устройств и даже более крупных элементов. На этих диаграммах обычно выделяют тракт данных (где размещены данные) и тракт управления (который управляет движением данных) Машины с различной микроархитектурой могут иметь одинако- вую АНК и, таким образом, быть пригодными для выполнения тех же программ. Новые микроархитектуры и/или схемотехнические решения вместе с прогрессом в полупроводниковой промышлен- ности являются тем, что позволяет новым поколениям процессоров достигать более высокой производительности, используя ту же АНК. В настоящее время на уровне микроархитектуры команд обычно находятся простые команды, которые выполняются за один цикл (таковы, в частности, RISC-машины). В других системах (например, в Pentium 4) на этом уровне имеются более сложные команды; вы- полнение одной такой команды занимает несколько циклов. Чтобы
выполнить команду, нужно найти операнды в памяти, считать их и записать полученные результаты обратно в память. Управление уровнем команд со сложными командами отличается от управления уровнем команд с простыми командами, так как в первом случае выполнение одной команды требует определенной последователь- ности операций. Команды микропроцессора, в отличие от микрокоманд, разраба- тываются независимо от аппаратуры микросхемы, поэтому их раз- рядность обычно совпадает с разрядностью микропроцессора. Ко- манда микропроцессора состоит из инструкции и обозначается — код операции, КОП (или INS в англоязычной литературе). Команда микропроцессора может состоять только из кода операции, когда не требуется указывать адрес операнда (операнды — это данные, над которыми команда производит какое-либо действие), или может со- стоять из кода операции и адресов операндов или данных. Форматы команд очень сильно зависит от структуры процессора. Рассмотрим построение команд для восьмиразрядного процес- сора, построенного по структуре фон-Неймана. Примеры постро- ения команд для такого процессора приведены на рис. 4.4. Если для кода операции используется восьмибитное слово (байт), то при помощи этого слова можно закодировать 256 операций. В процессе разработки системы команд для операции может быть назначен любой код. Именно системой команд и определяется кон- кретное семейство процессоров. Однобайтовые команды позволяют работать с внутренними программно-доступными регистрами про- цессора.
Для выполнения одной и той же операции над разными регистрами процессора назначаются разные коды. Запоминать эти коды очень утомительно для человека. При программировании в машинных кодах легко совершить ошибку и очень трудно найти ее, особенно если коды различаются только на один бит. Для сокращения объема записи вместо двоичного можно воспользоваться шестнадцатеричным кодом, однако это не увеличивает наглядности программы. Фрагмент испол- няемого кода микропроцессора приведен в листинге 4.1. Листинг 4.1 Фрагмент исполняемого кода микропроцессора 75CBFF75CAFB75CDFF75CCFB75985275 C834D28875D24A7bD320'75D5G17533GE 75345975A60175A11375D13230DFFD20 8929E5DB9533C2D712ОCF8E5DA9534С2 D71200F8E5DD1200F8E5DC1200F89001 181200D8B2B41208CF80CEC289E5DB94 Чтобы уменьшить объем запоминаемой информации и увеличить наглядность исходного текста программы, каждой операции процес- сора придумывают мнемоническое обозначение В качестве мнемо- нического обозначения операции обычно используют сокращения английских слов, обозначающих эту операцию. Например, для опе- рации копирования используется мнемоническое обозначение MOV', для операции суммирования используется мнемоническое обозна- чение ADD', для операции вычитания используется мнемоническое обозначение SUB', для операции умножения используется мнемони- ческое обозначение MUL и т.д. Для полного обозначения команды используется мнемоническое обозначение операции и используемые ею операнды, которые пере- числяются через запятую. При этом в большинстве процессоров опе- ранд — приемник информации записывается первым, а операнд — источник информации — вторым. Например: • MOV RB, А; Скопировать содержимое регистра А в регистр ЛО; • ADD A, R5; Просуммировать содержимое регистров R5 иА, резуль- тат поместить в регистр А. Приведенные выше команды — это однобайтовые команды, так как в них используются только внутренние регистры процессора. Если в команде используется константа в качестве операнда или ука- зывается адрес операнда в системной памяти, то команда будет за- нимать в системной памяти два или три байта. Например: • MOV А, 1025; Скопировать содержимое 1025 ячейки памяти в ре- гистр А;
• ADD A, #110; Просуммировать содержимое регистра Л с числом 110. Несмотря на то что общий объем исходного текста программы увеличивается, скорость написания и, особенно, отладки программ в таком виде возрастает. Теперь вместо одного текста программы в памяти компьютера или на бумаге придется хранить два текста: один для человека, который в дальнейшем будем называть исходным текстом программы; другой для микропроцессора, который в даль- нейшем будем называть загрузочным модулем. Преобразование программы, записанной в мнемоническом виде, в машинные коды является рутинной работой, которую можно по- ручить компьютерной программе Язык программирования, в кото- ром для обозначения машинных команд используются мнемониче- ские обозначения, называется ассемблером. Точно так же называют и программу или пакет программ, которые осуществляют трансля- цию (преобразование) исходного текста программы (исходный мо- дуль) в машинные коды (загрузочный модуль). Основные направления развития микропроцессоров В общем случае все центральные процессоры, одночиповые мик- ропроцессоры и многочиповые реализации выполняют программы, производя следующие шаги: 1) чтение инструкции и ее декодирование; 2) поиск всех связанных данных, необходимых для обработки инструкции; 3) обработка инструкции; 4) запись результатов. Эта последовательность выглядит просто, но осложняется тем фактом, что иерархия памяти (где располагаются инструкции и дан- ные), которая включает в себя кэш, основную память и энергонеза- висимые устройства хранения, такие как жесткие диски, всегда была медленнее самого процессора. Шаг 2 часто привносит длительные (по меркам центрального процессора) задержки, пока данные посту- пают по компьютерной шине. В настоящее время существуют два направления развития микро- процессоров: • 7?/5С-процессоры (процессоры с сокращенным набором команд); • CISC-процессоры (процессоры с полным набором команд). Микропроцессоры с архитектурой RISC (Reduced Instruction Set Computers) используют сравнительно небольшой (сокращенный) набор наиболее употребляемых команд, определенный в результате
статистического анализа большого числа программ для основных областей применения CZSC-процессоров исходной архитектуры Все команды работают с операндами и имеют одинаковый формат. Об- ращение к памяти выполняется с помощью специальных команд загрузки регистра и записи. Простота структуры и небольшой набор команд позволяют реализовать полностью их аппаратное выполне- ние и эффективный конвейер при небольшом объеме оборудования. Арифметику AZSC-процессоров отличает высокая степень дробления конвейера. Этот прием позволяет увеличить тактовую частоту (а зна- чит, и производительность) компьютера. Чем более элементарные действия выполняются в каждой фазе работы конвейера, тем выше частота его работы. 7?/5С-процессоры с самого начала ориентиро- ваны на реализацию всех возможностей ускорения арифметических операций, поэтому их конвейеры обладают значительно более высо- ким быстродействием, чем в С/5С-процессорах. Поэтому RISC- процессоры в 2—4 раза быстрее имеющих ту же тактовую частоту С/УС-процессоров с обычной системой команд и более высокопро- изводительны, несмотря на больший размер программ. RISC- архитектура построена на четырех основных принципах. 1. Любая операция должна выполняться за один такт вне зависи- мости от ее типа. 2. Система команд должна содержать минимальное количество наиболее часто используемых простейших инструкций одинаковой длины. 3. Операции обработки данных реализуются только в формате «регистр—регистр» (операнды выбираются из оперативных реги- стров процессора, и результат операции записывается также в ре- гистр, а обмен между оперативными регистрами и памятью выпол- няется только с помощью команд загрузки/записи). 4. Состав системы команд должен быть удобен для компиляции операторов языков высокого уровня. Усложнение )?/УС-ироисссоров фактически приближает их архи- тектуру к С/УС-архитектуре. В настоящее время число процессоров с RISC-архитектурой су- щественно возросло и все ведущие фирмы США их производят, в том числе фирмы «Intel», «Motorola» — производители основных се- мейств процессоров с CISC-архитектурой. Микропроцессоры с архитектурой CISC (Complex Instruction Set Computers — архитектура вычислений с полной системой команд) реализуют на уровне машинного языка комплексные наборы команд различной сложности — от простых, характерных для микропроцес-
сора первого поколения, до очень сложных. Большинство совре- менных процессоров для персональных компьютеров построено по архитектуре CISC. В последнее время появились гибридные процессоры, которые имеют систему команд CISC, однако внутри преобразовывают их в цепочки /?/5С-команд, которые и исполняются ядром процессора Постепенное усложнение С/5С-процессеров происходит в на- правлении более совершенного управления машинными ресурсами, а также в направлении сближения машинных языков с языками вы- сокого уровня. В то же время сложная система команд и переменный формат команды процессоров с С/5С-архитектурой привели к быстрому росту сложности схем. Для того чтобы такие процессоры вообще могли работать с приемлемым энергопотреблением и размещаться на ограниченной площади, производители работают над миниатю- ризацией транзисторов. В качестве примера внутреннего устройства микропроцессора рассмотрим устройство процессора с полным набором команд. Здесь будет рассматриваться упрощенная модель процессора для облегче- ния понимания работы С75С-микропроцессор состоит из двух частей: • обрабатывающего блока; • блока микропрограммного управления. Блок обработки микропроцессора (операционный блок) Блок обработки сигналов предназначен для считывания команд из системной памяти и выполнения считанных команд. Эти действия он осуществляет под управлением блока микропрограммного управ- ления, который формирует последовательность микрокоманд, необ- ходимую для выполнения команды. Схема одного из вариантов по- строения блока обработки сигналов приведена на рис. 4.5. В этой схеме явно просматривается, что отдельные биты микро- команды (показанной внизу схемы) управляют различными блоками обработки сигналов (БОС), поэтому их можно рассматривать неза- висимо друг от друга. Такие группы бит называются полями микроко- манды и составляют формат этой микрокоманды. Кроме бит, управ- ляющих блоком обработки сигналов, есть биты, управляющие бло- ком микропрограммного управления. Формат микрокоманды рассматриваемого процессора приведен на рис. 4 6. Результат выпол- нения микрокоманды записывается по сигналу общей синхрони- зации CLK.
Рис. 4.5. Операционный блок микропроцессора Основным принципом работы любого цифрового устройства с па- мятью, в том числе и микропроцессора, является наличие цепи син- хронизации. Этот сигнал, как и цепь питания, подводится к любому регистру цифрового устройства. Для хранения и декодирования выполняемой команды выделим 8-разрядный регистр, который назовем RI. Для реализации более простой системы команд выберем аккуму- ляторный процессор. Соответственно необходимо один из регистров выделить в качестве аккумулятора АСС. Так как мы выбрали для примера 8-разрядный микропроцессор, то и все регистры в этом процессоре 8-разрядные. Максимальное число, которое можно записать в такой регистр, — 255, но для боль- шинства программ такого объема памяти недостаточно. В приведен- ной на рис 4.5 схеме, для того чтобы получить 16-разрядный адрес, используется два 8-разрядных регистра адреса. Теперь максимальное число, которое можно записать в этих двух регистрах, будет 65535, что вполне достаточно для записи программ и обрабатываемых ими данных. Для того чтобы различать регистр старшего и младшего байта адреса, обозначим их как РСН — старший байт и PCL — млад-
ший байт. Это позволяет при помощи 8-разрядного АЛУ формиро- вать 16-разрядный адрес. Программный счетчик хранит текущее значение ячейки памяти, из которой считывается команда, но процессор может обращаться и к данным, поэтому для формирования адреса выделим еще пару регистров: РАН— старший байт и RAL — младший байт. Выходы этих регистров выведем за пределы микросхемы и будем использовать в качестве 16-разрядной шины адреса. Еще один регистр используется для формирования сигналов управления системной шины микропроцессора. В простейшем слу- чае это сигналы записи (ИЛ?) и чтения (RD}. Для формирования не- обходимых сигналов достаточно записывать в определенный бит регистра логический ноль или единицу. Определим формат регистра управления. Пусть нулевой бит этого регистра будет сигналом за- писи, а первый бит этого регистра будет сигналом чтения. Остальные биты этого регистра пока не важны Полученный формат приведен на рис. 4.6. 7__6___5__4___3 2 __1__О I I I I I Г~I п Рис. 4.6. Формат регистра управления (CR) Блок микропрограммного управления микропроцессора Блок микропрограммного управления предназначен для форми- рования последовательности микрокоманд блока обработки сигна- лов. В простейшем случае его можно построить на счетчике с воз- можностью предзаписи и ПЗУ. Схема такого блока приведена на рис. 4.7. В этой схеме адрес очередной микрокоманды формирует двоич- ный счетчик. Если требуется осуществить безусловный или условный
переход, то новый адрес записывается из ПЗУ в этот счетчик, как в обв1чный параллельный регистр по сигналу параллельной за- писи VI. Переход к следующему адресу микрокоманды производится по сигналу общей синхронизации CLK(рис. 4.8). 6 бит 4 бита 4 бита 4 бита 8 бит 5 бит КОП (К, PI, М} Ист 1 WS) Ист 2 (85) Прм (85) CONST Условие перехода Адрес перехода Управление БОС (26 бит) ------► -*----Управление БМУ Рис. 4.8. Формат микрокоманды процессора Микропрограммирование процессора Как мы уже выясняли, вес действия микропроцессора и сигналы на его выводах определяются последовательностью микрокоманд (микропрограммой), подаваемых на управляющие входы блока об- работки. При изучении принципов работы ОЗУ и ПЗУ приводились вре- менные диаграммы, которые необходимо сформировать, для того чтобы записать или прочитать необходимую информацию. Выберем одну из этих диаграмм (рис. 4.9). Рис. 4.9, Временные диаграммы считывания команды микропроцессором Любую временную диаграмму формирует микропроцессор. Устройство микросхемы, на примере которой мы будем формировать
необходимые для работы сигналы, рассматривалось при обсуждении блока обработки микропроцессора. По принципиальной схеме блока обработки сигнала можно определить формат микрокоманды, управ- ляющей этим блоком. Работа любого цифрового устройства начинается с заранее задан- ных начальных условий. Эти начальные условия формируются спе- циальным сигналом RESET (сбоос), который формируется после подачи питания на схему. Договоримся, что сигнал сброса микро- процессора будет записывать в регистр программного счетчика PC нулевое значение. (Это условие справедливо не для всех процессо- ров. Например, IBM-совместимые процессоры при сбросе микро- схемы записывают в программный счетчик значение Н)000Л.) Выполнение любой команды начинается с ее считывания из си- стемной памяти (ОЗУ или ПЗУ). Необходимые для этого микроко- манды подаются на входы управления БОС из блока микропро- граммного управления (БМУ), как только снимается сигнал сброса со счетчика микрокоманд БМУ. При считывании однобайтной ко- манды достаточно считать из системной памяти только код операции и выполнить эту операцию. Временная диаграмма этого процесса приведена на рис 4.10. Последовательность операций, которые не- обходимо выполнить микропрограмме, показана стрелочками. Для считывания следующей команды микропрограмма запускается за- ново. Рис. 4.10. Временные диаграммы сигналов считывания команд из ОЗУ Для того чтобы считать код операции из системной памяти, не- обходимо выставить на шине адреса адрес этой команды. Этот адрес
хранится в счетчике команд PC. Скопируем его в регистр адреса ЛА, выходы которого подключены к шине адреса. N Описание Поля микрокоманды БОС Константа Источник А Источник В Команда Приемник 1 PCH RAH 1111 НИ 1111 1010 ООН 0 0 1100 2 PCL^RAL 1111 1111 1111 1011 ООН 0 0 1101 Затем сформируем сигнал считывания. Для этого в регистр управ- ления запишем константу71111 1101. N Описание Поля микрокоманды БОС Константа Источник А Источник В Команда Приемник 3 const —> CR 1111 1101 1111 1111 ООП 0 0 1110 Теперь можно считать число с шины данных, а так как системная память в этот момент выдает на нее код операции, то мы считаем именно этот код. Запишем его в регистр команд и снимем сигнал чтения с системной шины. Для этого в регистр управления запишем константу 1111 1111. N Описание Поля микрокоманды БОС Константа Источник А Источник В Команда Приемник 4 data —> R1 1111 1111 1100 1111 1100 0 0 1001 5 const -> CR 1111 1111 НИ 1111 ООН 00 1110 Прежде чем перейти к дальнейшему выполнению микропро- граммы, увеличим содержимое счетчика команд на единицу. N Описание Поля микрокоманды БОС Константа Источник А Источник В Команда Приемник 6 PCL + 1 -> PCL 1111 НИ 1011 1111 1100 1 0 1011 7 РСН+С^РСН 1111 1111 1010 1111 1100 1 0 1010 После считывания команды ее необходимо декодировать. Это можно выполнить микропрограммным способом, проверяя каждый бит регистра команд и осуществляя ветвление по результату про- верки, или включить в состав блока микропрограммного управления аппаратный дешифратор команд, который сможет осуществить вет-
вление микропрограммы на 256 ветвей за один такт синхронизации микропроцессора. Выберем именно этот путь. Восьмым тактом мик- ропрограмма направляется на одну из 256 ветвей, отвечающую за вы- полнение считанной инструкции. Например, если была считана команда MOV A, RCi, то следующая микрокоманда будет выглядеть следующим образом. N Описание Поля микрокоманды БОС Константа Источник А Источник В Команда Приемник 8 RO^ACC 1111 1111 0000 1111 110000 1000 И так как в этом случае команда полностью выполнена, то счет- чик микрокоманд сбрасывается для выполнения следующей ко- манды. Рассмотрим еще один пример. Пусть из системной памяти счи- тывается команда безусловного перехода JMP 1234. Первые восемь микрокоманд совпадают для всех команд микропроцессора. Разли- чие наступает, начиная с девятой команды, которая зависит от кон- кретной инструкции. При выполнении команды безусловного пере- хода необходимо считать адрес новой команды, который записан в байтах, следующих за кодом операции. Этот процесс аналогичен считыванию кода операции. N Описание Поля микрокоманды БОС Кон- станта Источник A Источник В Команда Прием- ник 9 PCH^RAH 1111 1111 1111 1010 0011 0 0 1100 10 PCL RAL 1111 1111 1111 1011 ООП 0 0 1101 11 const - + CR 1111 1110 1111 1111 ООП 0 0 1110 12 data - э RI 1111 1111 1100 1111 1100 0 0 1001 13 const - ->CR nil 1111 1111 nil ООП 0 0 1110 14 PCL+ 1 -> PCL nil nil 1011 nil 1100 1 0 1011 15 PCH + C PCH 1111 nil 1010 1111 1100 1 0 1010 Теперь считаем второй байт адреса перехода. N Описание Поля микрокоманды БОС Кон- станта Источник А Источник В Команда Прием- ник 16 PCH-+RAH 11111111 1111 1010 ООП 00 1100 17 PCL RAL 1111 1111 1111 1011 ООН 0 0 1101
N Описание Поля микрокоманды БОС Кон- станта Источник А Источник В Команда Прием- ник 18 const —> CR НИ 1110 1111 1111 ООН 00 1110 19 data -> РСН 11111111 1100 1111 1100 0 0 1110 20 const —> CR 11111111 1111 1111 ООН 0 0 1110 21 RI^PCL 11111111 1001 1111 1100 1 0 1001 В результате выполнения этой микропрограммы в программный счетчик будет загружен адрес, записанный во втором и третьем байтах команды безусловного перехода ЛИР 1234. Временная диаграмма, фор- мируемая рассмотренной микропрограммой, приведена на рис 4.11. 4.2. Система команд процессора и методы адресации операндов Команды процессора Основная функция любого процессора, ради которой он и созда- ется, — это выполнение команд. Система команд, выполняемых про- цессором, представляет собой нечто подобное таблице истинности логических элементов или таблице режимов работы более сложных логических микросхем. То есть она определяет логику работы процес- сора и его реакцию на те или иные комбинации внешних событий. Написание программ для микропроцессорной системы — важ- нейший и часто наиболее трудоемкий этап разработки такой сис- темы. А для создания эффективных программ необходимо иметь
хотя бы самое общее представление о системе команд используемого процессора. Самые компактные и быстрые программы и подпрог- раммы создаются на языке ассемблера, использование которого без знания системы команд абсолютно невозможно, ведь язык ассемб- лера представляет собой символьную запись цифровых кодов ма- шинного языка, кодов команд процессора. Конечно, для разработки программного обеспечения существуют всевозможные программные средства. Пользоваться ими обычно можно и без знания системы команд процессора. Чаще всего применяются языки программиро- вания высокого уровня, такие как Паскаль и Си. Однако знание сис- темы команд и языка ассемблера позволяет в несколько раз повысить эффективность некоторых наиболее важных частей программного обеспечения любой микропроцессорной системы — от микрокон- троллера до персонального компьютера. Именно поэтому рас- смотрим основные типы команд, имеющиеся у большинства процес- соров, и особенности их применения Каждая команда, выбираемая (читаемая) из памяти процессором, определяет алгоритм поведения процессора на ближайшие не- сколько тактов. Код команды говорит о том, какую операцию пред- стоит выполнить процессору и с какими операндами (т.е. кодами данных), где взять исходную информацию для выполнения команды и куда поместить результат (если необходимо). Код команды может занимать от одного до нескольких байт, причем процессор узнает о том, сколько байт команды ему надо читать, из первого прочитан- ного им байта или слова В процессоре код команды расшифровы- вается и преобразуется в набор микроопераций, выполняемых от- дельными узлами процессора. Но разработчику микропроцессорных систем это знание не слишком важно, ему важен только результат выполнения той или иной команды. В общем случае система команд процессора включает в себя сле- дующие четыре основные группы команд: • команды пересылки данных; • арифметические команды; • логические команды; • команды переходов. Команды пересылки данных не требуют выполнения никаких опе- раций над операндами. Операнды просто пересылаются (точнее, копируются) из источника (Source) в приемник (Destination). Источ- ником и приемником могут быть внутренние регистры процессора, ячейки памяти или устройства ввода/вывода. АЛУ в данном случае не используется.
Арифметические команды выполняют операции сложения, вычи- тания, умножения, деления, увеличения на единицу (инкременти- рования), уменьшения на единицу (декрементирования) и т.д. Этим командам требуется один или два входных операнда. Формируют команды один выходной операнд. Логические команды производят над операндами логические опе- рации, например логическое «И», логическое «ИЛИ», исключающее «ИЛИ», очистку инверсию, разнообразные сдвиги (вправо, влево, арифметический сдвиг, циклический сдвиг). Этим командам, как и арифметическим, требуется один или два входных операнда, и фор- мируют они один выходной операнд. Наконец, команды переходов предназначены для изменения обыч- ного порядка последовательного выполнения команд. С их помощью организуются переходы на подпрограммы и возвраты из них, всевоз- можные циклы, ветвления программ, пропуски фрагментов программ и т.д. Команды переходов всегда меняют содержимое счетчика команд. Переходы могут быть условными и безусловными. Именно эти ко- манды позволяют строить сложные алгоритмы обработки информации. В соответствии с результатом каждой выполненной команды уста- навливаются или очищаются биты регистра состояния процессора (PSW). Но надо помнить, что не все команды изменяют все име- ющиеся в РКП7 флаги. Это определяется особенностями каждого конкретного процессора. У разных процессоров системы команд существенно различаются, но в основе своей они очень похожи. Количество команд у процес- соров также различно. Например, у упоминавшегося уже процессора MC68000 всего 61 команда, а у процессора 8086 — 133 команды. У со- временных мощных процессоров количество команд достигает не- скольких сотен. В то же время существуют процессоры с сокращен- ным набором команд (так называемые Л/5С-процессоры), в которых за счет максимального сокращения количества команд достигается увеличение эффективности и скорости их выполнения. Рассмотрим теперь особенности четырех выделенных групп ко- манд процессора более подробно Команды пересылки данных Команды пересылки данных занимают очень важное место в сис- теме команд любого процессора. Они выполняют следующие важ- нейшие функции: • загрузка (запись) содержимого во внутренние регистры процес- сора;
• сохранение в памяти содержимого внутренних регистров процес- сора; • копирование содержимого из одной области памяти в другую; • запись в устройства ввода/вывода и чтение из устройств ввода/ вывода. В некоторых процессорах (например, Т-11) все эти функции вы- полняются одной-единственной командой MOV (для байтовых пе- ресылок — MOVB) но с различными методами адресации операндов. В других процессорах помимо команды MOV имеется еще не- сколько команд для выполнения перечисленных функций. Напри- мер, для загрузки регистров могут использоваться команды загрузки, причем для разных регистров — разные команды (их обозначения обычно строятся с использованием слова LOAD — загрузка). Часто выделяются специальные команды для сохранения в стеке и для из- влечения из стека (PUSH — сохранить в стеке, POP — извлечь из стека). Эти команды выполняют пересылку с автоинкрементной и с автодекрементной адресацией (даже если эти режимы адресации не предусмотрены в процессоре в явном виде). Иногда в систему команд вводится специальная команда MOVS для строчной (или цепочечной) пересылки данных (например, в про- цессоре 8086). Эта команда пересылает не одно слово или байт, а за- данное количество слов или байтов (MOVSB), т.е. инициирует не один цикл обмена по магистрали, а несколько. При этом адрес памяти, с которым происходит взаимодействие, увеличивается на 1 или на 2 после каждого обращения или же уменьшается на 1 или на 2 после каждого обращения, т.е. в неявном виде применяется автоин- крементная или автодекрементная адресация. В некоторых процессорах (например, в процессоре 8086) специ- ально выделяются функции обмена с устройствами ввода/вывода. Команда IN используется для ввода (чтения) информации в устрой- ство ввода/вывода, а команда OUT используется для вывода (записи) из устройства ввода/вывода. Обмен информацией в этом случае про- изводится между регистром-аккумулятором и устройством ввода/ вывода. В более продвинутых процессорах этого же семейства (на- чиная с процессора 80286) добавлены команды строчного (цепочеч- ного) ввода (команда INS) и строчного вывода (команда OUTS). Эти команды позволяют пересылать целый массив (строку) данных из памяти в устройство ввода/вывода (OUTS) или из устройства ввода/вывода в память (INS). Адрес памяти после каждого обраще- ния увеличивается или уменьшается (как и в случае с командой MOVS).
Также к командам пересылки данных относятся команды обмена информацией (их обозначение строится на основе слова Exchange). Может быть предусмотрен обмен информацией между внутренними регистрами, между двумя половинами одного регистра (SWAP) или между регистром и ячейкой памяти. Арифметические команды Арифметические команды рассматривают коды операндов как числовые двоичные или двоично-десятичные коды. Эти команды могут быть разделены на пять основных групп: • команды операций с фиксированной запятой (сложение, вычи- тание, умножение, деление); • команды операций с плавающей запятой (сложение, вычитание, умножение, деление); • команды очистки; • команды инкремента и декремента; • команда сравнения. Команды операций с фиксированной запятой работают с кодами в регистрах процессора или в памяти как с обычными двоичными кодами. Команда сложения (ADD) вычисляет сумму двух кодов. Ко- манда вычитания (SUB) вычисляет разность двух кодов. Команда умножения (MUL) вычисляет произведение двух кодов (разрядность результата вдвое больше разрядности сомножителей). Команда де- ления (DIV) вычисляет частное от деления одного кода на другой. Причем все эти команды могут работать как с числами со знаком, так и с числами без знака. Команды операций с плавающей запятой (точкой) используют формат представления чисел с порядком и мантиссой (обычно эти числа занимают две последовательные ячейки памяти) В совре- менных мощных процессорах набор команд с плавающей запятой не ограничивается только четырьмя арифметическими действиями, а содержит и множество других, более сложных команд, например вычисление тригонометрических функций, логарифмических функций, а также сложных функций, необходимых при обработке звука и изображения. Команды очистки (CLR) предназначены для записи нулевого кода в регистр или ячейку памяти Эти команды могут быть заменены командами пересылки нулевого кода, но специальные команды очистки обычно выполняются быстрее, чем команды пересылки. Команды очистки иногда относят к группе логических команд, но суть их от этого не меняется.
Команды инкремента (увеличения на единицу, INC) и декремента (уменьшения на единицу, DEC) также бывают очень удобны. Их можно в принципе заменить командами суммирования с единицей или вычитания единицы, но инкремент и декремент выполняются быстрее, чем суммирование и вычитание. Эти команды требуют од- ного входного операнда, который одновременно является и выход- ным операндом. Наконец, команда сравнения (обозначается СМР) предназначена для сравнения двух входных операндов. По сути, она вычисляет раз- ность этих двух операндов, но выходного операнда не формирует, а всего лишь изменяет биты в регистре состояния процессора (PSW) по результату этого вычитания. Следующая за командой сравнения команда (обычно это команда перехода) будет анализировать биты в регистре состояния процессора и выполнять действия в зависи- мости от их значений. В некоторых процессорах предусмотрены ко- манды цепочечного сравнения двух последовательностей операндов, находящихся в памяти (например, в процессоре 8086 и совместимых с ним). Логические команды Логические команды выполняют над операндами логические (по- битовые) операции, т.е. они рассматривают коды операндов не как единое число, а как набор отдельных битов. Этим они отличаются от арифметических команд. Логические команды выполняют следу- ющие основные операции: • логическое «И», логическое «ИЛИ», сложение по модулю 2 (ис- ключающее «ИЛИ»); • логические, арифметические и циклические сдвиги; • проверка битов и операндов; • установка и очистка битов (флагов) регистра состояния процес- сора (PSW). Команды логических операций позволяют побитно вычислять ос- новные логические функции от двух входных операндов. Кроме того, операция «И» (AND) используется для принудительной очистки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие очистки, установлены в ноль). Операция «ИЛИ» (OR) применяется для при- нудительной установки заданных битов (в качестве одного из опе- рандов при этом используется код маски, в котором разряды, тре- бующие установки в единицу, равны единице). Операция «исклю- чающее ИЛИ» (XOR) используется для инверсии заданных битов
(в качестве одного из операндов при этом применяется код маски, в котором биты, подлежащие инверсии, установлены в единицу). Команды требуют двух входных операндов и формируют один вы- ходной операнд Команды сдвигов позволяют побитно сдвигать код операнда вправо (в сторону младших разрядов) или влево (в сторону старших разрядов). Тип сдвига (логический, арифметический или цикличе- ский) определяет, каково будет новое значение старшего бита (при сдвиге вправо) или младшего бита (при сдвиге влево), а также опре- деляет, будет ли где-то сохранено прежнее значение старшего бита (при сдвиге влево) или младшего бита (при сдвиге вправо). Напри- мер, при логическом сдвиге вправо в старшем разряде кода операнда устанавливается ноль, а младший разряд записывается в качестве флага переноса в регистр состояния процессора. А при арифметиче- ском сдвиге вправо значение старшего разряда сохраняется прежним (нулем или единицей), младший разряд также записывается в каче- стве флага переноса. Циклические сдвиги позволяют сдвигать биты кода операнда по кругу (по часовой стрелке при сдвиге вправо или против часовой стрелки при сдвиге влево). При этом в кольцо сдвига может входить или не входить флаг переноса. Б бит флага переноса (если он исполь- зуется) записывается значение старшего бита при циклическом сдвиге влево и младшего бита при циклическом сдвиге вправо. Со- ответственно, значение бита флага переноса будет переписываться в младший разряд при циклическом сдвиге влево и в старший разряд при циклическом сдвиге вправо. Для примера на рис. 4.12 показаны действия, выполняемые ко- мандами сдвигов вправо. Команды проверки битов и операндов предназначены для уста- новки или очистки битов регистра состояния процессора в зависи- мости от значения выбранных битов или всего операнда в целом. Выходного операнда команды не формируют. Команда проверки операнда (TST) проверяет весь код операнда в целом на равенство нулю и на знак (на значение старшего бита), она требует только од- ного входного операнда. Команда проверки бита (BIT) проверяет только отдельные биты, для выбора которых в качестве второго опе- ранда используется код маски. В коде маски проверяемым битам основного операнда должны соответствовать единичные разряды. Наконец, команды установки и очистки битов регистра со- стояния процессора (т.е. флагов) позволяют установить или очистить любой флаг, что бывает очень удобно Каждому флагу обычно соот-
Логический сдвиг вправо Арифметический сдвиг вправо Ст. Флаг переноса „ Мл. Операнд ,, _ Мл. Флаг Операнд переноса Циклический сдвиг вправо Мл. Флаг Операнд переноса Циклический сдвиг вправо через перенос Операнд Рис. 4.12. Команды сдвигов вправо Флаг переноса ветствуют две команды, одна из которых устанавливает его в еди- ницу, а другая сбрасывает в ноль. Например, флагу переноса С (от Carry) будут соответствовать команды CLC (очистка) и SEC или STC (установка). Команды переходов Команды переходов предназначены для организации всевозмож- ных циклов, ветвлений, вызовов подпрограмм и т.д., т.е. они нару- шают последовательный ход выполнения программы. Эти команды записывают в регистр — счетчик команд новое значение и тем самым вызывают переход процессора не к следующей по порядку команде, а к любой другой команде в памяти программ. Некоторые команды переходов предусматривают в дальнейшем возврат назад, в точку, из которой был сделан переход, другие не предусматривают этого. Если возврат предусмотрен, то текущие параметры процессора со- храняются в стеке. Если возврат не предусмотрен, то текущие пара- метры процессора не сохраняются Команды переходов без возврата делятся на две группы: • команды безусловных переходов; • команды условных переходов. В обозначениях этих команд используются слова Branch (ветвле- ние) и Jump (прыжок). Команды безусловных переходов вызывают переход в новый адрес независимо ни от чего. Они могут вызывать переход на указанную величину смешения (вперед или назад) или же на указанный адрес
памяти. Величина смещения или новое значение адреса указывается в качестве входного операнда. Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно выступают значения флагов в регистре состояния процессора (Р5И7). То есть условием перехода является результат пре- дыдущей операции, меняющей значения флагов. Всего таких условий перехода может быть от 4 до 16. Несколько примеров команд условных переходов: • переход, если равно нулю; • переход, если не равно нулю; • переход, если есть переполнение; • переход, если нет переполнения; • переход, если больше нуля; • переход, если меньше или равно нулю. Если условие перехода выполняется, то производится загрузка в регистр — счетчик команд нового значения. Если же условие пере- хода не выполняется, счетчик команд просто наращивается и про- цессор выбирает и выполняет следующую по порядку команду. Специально для проверки условий перехода применяется команда сравнения (СМР), предшествующая команде условного пе- рехода (или даже нескольким командам условных переходов). Но флаги могут устанавливаться и любой другой командой, напри- мер командой пересылки данных, любой арифметической или ло- гической командой. Отметим, что сами команды переходов флаги не меняют, что как раз и позволяет ставить несколько команд пере- ходов одну за другой. Совместное использование нескольких команд условных и без- условных переходов позволяет процессору выполнять разветвленные алгоритмы любой сложности. На рис. 4.13 показано разветвление программы на две ветки с последующим соединением, а на рис 4.14 — разветвление на три ветки с последующим соединением. Команды переходов с дальнейшим возвратом в точку, из которой был произведен переход, применяются для выполнения подпро- грамм, т.е. вспомогательных программ. Эти команды называются также командами вызова подпрограмм (распространенное назва- ние — CALL). Использование подпрограмм позволяет упростить структуру основной программы, сделать ее более логичной, гибкой, легкой для написания и отладки. В то же время надо учитывать, что широкое использование подпрограмм, как правило, увеличивает время выполнения программы.
Память Рис. 4.13. Реализация разветвления на две ветки Памя-ь Рис. 4.14. Реализация разветвления на три ветки Все команды переходов с возвратом предполагают безусловный переход (они не проверяют никаких флагов). При этом они требуют одного входного операнда, который может указывать как абсолютное значение нового адреса, так и смещение, складываемое с текущим значением адреса. Текущее значение счетчика команд (текущий адрес) сохраняется перед выполнением перехода в стеке. Для обратного возврата в точку вызова подпрограммы (точку пе- рехода) используется специальная команда возврата (RETили RTS). Эта команда извлекает из стека значение адреса команды перехода и записывает его в регистр — счетчик команд. Особое место среди команд перехода с возвратом занимают ко- манды прерываний (распространенное название — INT). Эти ко-
манды в качестве входного операнда требуют номер прерывания (адрес вектора). Обслуживание таких переходов осуществляется точно так же, как и аппаратных прерываний. То есть для выполнения данного перехода процессор обращается к таблице векторов преры- ваний и получает из нее по номеру прерывания адрес памяти, в ко- торый ему необходимо перейти. Адрес вызова прерывания и содер- жимое регистра состояния процессора (RSW) сохраняются в стеке. Сохранение АРК — важное отличие команд прерывания от команд переходов с возвратом. Команды прерываний во многих случаях оказываются удобнее, чем обычные команды переходов с возвратом. Сформировать таб- лицу векторов прерываний можно один раз, а потом уже обращаться к ней по мере необходимости. Номер прерывания соответствует но- меру подпрограммы, т.е. номеру функции, выполняемой подпро- граммой. Поэтому команды прерывания гораздо чаще включаются в системы команд процессоров, чем обычные команды переходов с возвратом. Для возврата из подпрограммы, вызванной командой прерыва- ния, используется команда возврата из прерывания (/RET или RTI). Эта команда извлекает из стека сохраненное там значение счетчика команд и регистра состояния процессора (PSW). Отметим, что у некоторых процессоров предусмотрены также ко- манды условных прерываний, например команда прерывания при переполнении. Конечно, в данном разделе мы рассмотрели только основные ко- манды, наиболее часто встречающиеся в процессорах. У конкретных процессоров могут быть и многие другие команды, не относящиеся к перечисленным группам команд. Но изучать их надо уже после того, как выбран тип процессора, подходящий для задачи, решаемой данной микропроцессорной системой. Адресация операндов Большая часть команд процессора работает с кодами данных (опе- рандами). Одни команды требуют входных операндов (одного или двух), другие выдают выходные операнды (чаще один операнд). Входные операнды называются еще операндами-источниками, а вы- ходные называются операндами-приемниками. Все эти коды опе- рандов (входные и выходные) должны где-то располагаться. Они могут находиться во внутренних регистрах процессора (наиболее удобный и быстрый вариант). Они могут располагаться в системной памяти (самый распространенный вариант). Наконец, они могут
находиться в устройствах ввода/вывода (наиболее редкий случай). Определение места положения операндов производится кодом ко- манды. Причем существуют разные методы, с помощью которых код команды может определить, откуда брать входной операнд и куда помещать выходной операнд. Эти методы называются методами ад- ресации. Эффективность выбранных методов адресации во многом определяет эффективность работы всего процессора в целом. Методы адресации Количество методов адресации в различных процессорах может быть от 4 до 16. Рассмотрим несколько типичных методов адреса- ции операндов, используемых сейчас в большинстве микропроцес- соров. Непосредственная адресация предполагает, что операнд (входной) находится в памяти непосредственно за кодом команды (рис 4.15). Операнд обычно представляет собой константу, которую надо куда- то переслать, к чему-то прибавить и т.д. Например, команда может состоять в том, чтобы прибавить число 6 к содержимому какого-то внутреннего регистра процессора. Это число 6 будет располагаться в памяти, внутри программы в адресе, следующем за кодом данной команды сложения. Память Программа • Команда Операнд Рис. 4.15. Непосредственная адресация Прямая (или абсолютная) адресация предполагает, что операнд (входной или выходной) находится в памяти по адресу, код которого находится внутри программы сразу же за кодом команды (рис. 4.16). Например, команда может состоять в том, чтобы очистить (сделать нулевым) содержимое ячейки памяти с адресом 1000000. Код этого адреса 1000000 будет располагаться в памяти, внутри программы в следующем адресе за кодом данной команды очистки. Регистровая адресация предполагает, что операнд (входной или выходной) находится во внутреннем регистре процессора (рис. 4.17). Например, команда может состоять в том, чтобы переслать число
Память Программа < Данные . Рис. 4.16. Прямая адресация из нулевого регистра в первый. Номера обоих регистров (0 и 1) будут определяться кодом команды пересылки. Косвенно-регистровая (иди косвенная) адресация предполагает, что во внутреннем регистре процессора находится не сам операнд, а его адрес в памяти (рис. 4.18). Например, команда может состоять в том, чтобы очистить ячейку памяти с адресом, находящимся в нулевом регистре. Номер этого регистра (0) будет определяться кодом ко- манды очистки Реже встречаются еще два метода адресации. Автоинкрементная адресация очень близка к косвенной адреса- ции, но отличается от нее тем, что после выполнения команды со- держимое используемого регистра увеличивается на единицу или
на два. Этот метод адресации очень удобен, например, при последо- вательной обработке кодов из массива данных, находящегося в па- мяти. После обработки какого-то кода адрес в регистре будет указы- вать уже на следующий код из массива. При использовании косвен- ной адресации в данном случае пришлось бы увеличивать содержимое этого регистра отдельной командой. Автодекрементная адресация работает наподобие автоинкремент- ной, но только содержимое выбранного регистра уменьшается на единицу или на два перед выполнением команды. Эта адресация также удобна при обработке массивов данных. Совместное исполь- зование автоинкрементной и автодекрементной адресаций позволяет организовать память стекового типа. Из других распространенных методов адресации можно упомя- нуть об индексных методах, которые предполагают для вычисления адреса операнда прибавление к содержимому регистра заданной кон- станты (индекса). Код этой константы располагается в памяти непо- средственно за кодом команды. Отметим, что выбор того или иного метода адресации в значи- тельной степени определяет время выполнения команды. Самая быстрая адресация — это регистровая, так как она не требует допол- нительных циклов обмена по магистрали. Если же адресация требует обрашения к памяти, то время выполнения команды будет увеличи- ваться за счет длительности необходимых циклов обращения к па- мяти. Понятно, что чем больше внутренних регистров у процессора, тем чаще и свободнее можно применять регистровую адресацию и тем быстрее будет работать система в целом. Сегментирование памяти Говоря об адресации, нельзя обойти вопрос о сегментировании памяти, применяемом в некоторых процессорах, например в про- цессорах IBM PC-совместимых персональных компьютеров. В процессоре Intel 8086 сегментирование памяти организовано следующим образом. Вся память системы представляется не в виде непрерывного про- странства, а в виде нескольких кусков — сегментов заданного раз- мера (по 64 Кбайт), положение которых в пространстве памяти можно изменять программным путем. Для хранения кодов адресов памяти используются не отдельные регистры, а пары регистров: • сегментный регистр определяет адрес начала сегмента (т.е. поло- жение сегмента в памяти);
• регистр указателя (регистр смещения) определяет положение ра- бочего адреса внутри сегмента. При этом физический 20-разрядный адрес памяти, выставляемый на внешнюю шину адреса, образуется так, как показано на рис 4.19, т.е. путем сложения смещения и адреса сегмента со сдвигом на 4 бита. Положение этого адреса в памяти показано на рис. 4.20. Рис. 4.19. Формирование физического адреса памяти из адреса сегмента и смещения Адрес сегмента Раэмеэ сегмента (10000 ба йт - 64 Кба йт) Физический адрес Рис. 4.20. Физический адрес в сегменте (все коды — шестнадцатеричные) Сегмент может начинаться только на 16-байтной границе памяти (так как адрес начала сегмента, по сути, имеет четыре младших ну- левых разряда, как видно из рис. 4.19), т.е. с адреса, кратного 16. Эти допустимые границы сегментов называются границами параграфов. Отметим, что введение сегментирования прежде всего связано с тем, что внутренние регистры процессора 16-разрядные, а физиче- ский адрес памяти 20-разрядный (16-разрядный адрес позволяет использовать память только в 64 Кбайт, что явно недостаточно).
В появившемся в то же время процессоре MC68000 фирмы «Moto- rola» внутренние регистры 32-разрядные, поэтому там проблема сег- ментирования памяти не возникает. Применяются и более сложные методы сегментирования памяти. Например, в процессоре Intel 80286 в так называемом защищенном режиме адрес памяти вычисляется в соответствии с рис. 4.21. Процессор ► Сегмент Таблица > дескрипторов сегмента Рис. 4.21. Адресация памяти в защищенном режиме процессора Intel 80286 В сегментном регистре в данном случае хранится не базовый (на- чальный) адрес сегментов, а коды селекторов, определяющие адреса в памяти, по которым хранятся дескрипторы (т.е. описатели) сегмен- тов Область памяти с дескрипторами называется таблицей дескрип- торов. Каждый дескриптор сегмента содержит базовый адрес сег- мента, размер сегмента (от 1 до 64 Кбайт) и его атрибуты. Базовый адрес сегмента имеет разрядность 24 бит, что обеспечивает адреса- цию 16 Мбайт физической памяти. Таким образом, на сумматор, вычисляющий физический адрес памяти, подается не содержимое сегментного регистра, как в пре- дыдущем случае, а базовый адрес сегмента из таблицы дескрипто- ров.
Еще более сложный метод адресации памяти с сегментированием использован в процессоре Intel 8038b и в более поздних моделях про- цессоров фирмы «Intel». Этот метод иллюстрируется рис. 4.22. дескриптора Рис. 4.22. Формирование физического адреса памяти процессора 80386 в защищенном режиме Адрес памяти (физический адрес) вычисляется в три этапа. Сна- чала вычисляется так называемый эффективный адрес (32-разряд- ный) путем суммирования трех компонентов: базы, индекса и сме- щения (Base, Index, Displacement), причем возможно умножение индекса на масштаб {Scale). Эти компоненты имеют следующий смысл: • смешение — это 8, 16 или 32-разрядное число, включенное в ко- манду; • база — это содержимое базового регистра процессора (использу- ется для указания на начало некоторого массива); • индекс — это содержимое индексного регистра процессора (ис- пользуется для выбора одного из элементов массива); • масштаб — это множитель (он может быть равен 1, 2, 4 или 8), указанный в коде команды, на который перед суммированием с другими компонентами умножается индекс (используется для указания размера элемента массива). Затем специальный блок сегментации вычисляет 32-разрядный линейный адрес, который представляет собой сумму базового адреса сегмента из сегментного регистра с эффективным адресом. Наконец, физический 32-битный адрес памяти образуется путем преобразо- вания линейного адреса блоком страничной переадресации, который
осуществляет перевод линейного адреса в физический страницами по 4 Кбайт. В любом случае сегментирование позволяет выделить в памяти один или несколько сегментов для данных и один или несколько сегментов для программ. Переход от одного сегмента к другому сводится всего лишь к изменению содержимого сегментного реги- стра Иногда это бывает очень удобно. Но для программиста рабо- тать с сегментированной памятью обычно сложнее, чем с непре- рывной, несегментированной памятью, так как приходится сле- дить за границами сегментов, за их описанием, переключением И т.д. Адресация байтов и слов Многие процессоры, имеющие разрядность 16 или 32, способны адресовать не только целое слово в памяти (16- или 32-разрядное), но и отдельные байты. Каждому байту в каждом слове при этом от- водится свой адрес. Так, в случае 16-разрядных процессоров все слова в памяти (16-разрядные) имеют четные адреса, а байты, входящие в эти слова, могут иметь как четные адреса, так и нечетные. Например, пусть 16-разрядная ячейка памяти имеет адрес 23420 и в ней хранится код 2/15 £ (рис. 4.23). Старший байт (адрес 23421) Старшин байт (адрес 23423) Младший байт (адрес 23420) Младший байт (адрес 23422) Рис. 4.23. Адресация слов и байтов Слово (адрес 23420) Слово (адрес 23422) При обращении к целому слову (с содержимым 245/:') процессор выставляет адрес 23420. При обращении к младшему байту этой ячейки (с содержимым 5Е) процессор выставляет тот же самый адрес 23420, но использует команду, адресующую байт, а не слово. При об- ращении к старшему байту этой же ячейки (с содержимым 2А) про- цессор выставляет адрес 23421 и использует команду, адресующую байт. Следующая по порядку 16-разрядная ячейка памяти с содсржи-
мым 487У7 будет иметь адрес 23422, т.е. опять же четный. Ее байты будут иметь адреса 23422 и 23423. Для различия байтовых и словных циклов обмена на магистрали в шине управления предусматривается специальный сигнал байто- вого обмена. Для работы с байтами в систему команд процессора вводятся специальные команды или предусматриваются методы бай- товой адресации. 4.3. Регистровая архитектура х86-совместимых процессоров Регистр — электронное устройство, способное хранить небольшой обьем цифровой информации и состоящее из триггеров. Триггер — электронное устройство, способное долговременно на- ходиться в двух или более устойчивых состояниях и менять их под воздействием внешних сигналов. Таким образом, триггер может ис- пользоваться для хранения минимально возможного количества ин- формации — бита. Количество триггеров в регистре определяет его разрядность, т.е. количество бит информации, которое возможно хранить в ре- гистре. Регистр процессора — блок ячеек памяти, образующий сверхбыс- трую оперативную память (СОЗУ) процессора; используется самим процессора. В отличие от языков высокого уровня в языке ассемблера пере- менные хранятся не под абстрактными именами (х, у, z, i, к и т.д.), а непосредственно в регистрах. Поэтому регистры процессора имеют строго фиксированные имена (и номера) для возможности ссылаться на них из программ на языке ассемблера (и из машинных команд). Причем имена (номера) имеют не только регистры в целом, но и не- которые их части. Большинство регистров процессора недоступны программисту. Соответственно регистры процессора можно разделить: • на программно доступные — программист может изменять эти регистры по своему усмотрению; • программно недоступные (скрытые) — доступ к ним имеет только ЦП, поэтому программист либо не имеет возможности изменить их, либо может изменять их только косвенным образом. Некоторые регистры х86-совместимых процессоров: 1. Основные регистры: • регистры общего назначения;
• сегментные регистры; • регистр указателя следующей команды; • регистр флагов (состояния). 2. Регистры управления памятью. 3. Регистры управления процессором. 4. Отладочные регистры. 5. Регистры FPU(регистры математического сопроцессора) 6. Расширения архитектуры х86 (х86 extended features). 7. Прочие регистры. 1. Основные регистры. Программно доступные К ним относятся регистры общего назначения, хранят операнды арифметических и ло- гических выражений, индексы, адреса и делятся: • на регистры данных; • регистры индексов; • регистры указателей. Регистры данных (табл. 4.2) могут использоваться без ограничений для любых целей, но некоторые команды применяют их специаль- ным образом. Служат для хранения промежуточных вычислений: • RAX, ЕАХ, АХ, АН, AL — регистры аккумулятора (Accumulator). Используются для хранения результата арифметических дей- ствий; • RBX, ЕВХ, ВХ, ВН, BL — регистры базы (Base). Используются для адресации по базе; • RCX, ЕСХ, СХ, CH, CL — регистры счетчика (Counter). Использу- ются для организации циклов и в строковых операциях; • RDX, EDX, DX, DH, DL — регистры данных (Data). Используются для хранения старшей части результата в том случае, если он не помещается полностью в аккумулятор. Могут использоваться как адресные регистры при работе с портами ввода вывода; Таблица 4.2 Регистры данных RAX RCX RDX RBX ЕАХ I ЕСХ EDX ЕВХ АХ СХ DX ВХ АН\AL СН\ CL DH\ DL вн\ BL RSP RBP RSI RDI Rx | ESP | EBP | ESI | EDI 1 RxD | SP | BP 1 si 1 DI RxW \SPL \bpl | SIL \dil RxB
• /?8 ЛI5, R8D R\5D, RSJV R15W, RSB R\5B — дополнительные ре- гистры данных, появившиеся в 64-разрядных процессорах: - RAX. RCX, RDX, RBX, RSP, RBP, RSI. RDI, RS-R15 - 64-бит- ные; - EAX, ЕСХ, EDX, ЕВХ, ESP, EBP, ESI, EDI, RSD-R] 5D - 32-битные (extended АХ), - АХ, СХ, DX. ВХ, SP, BP, SI, DI, RSW—RX5W— 16-битные; - АН, AL, CH, CL, DH, DL, ВН, BL, SPL, BPL, SIL, DIL, R8B—RY5B — 8-битные (половинки 16-битных регистров). Например, АН — high АХ — старшая половинка 8 бит, AL — low АХ — младшая половинка 8 бит. Регистры RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, Rx, RxD, RxW, RxB, SPL, BPL, SIL, DIL доступны только в 64-битном режиме ра- боты процессора. Регистры индексов (табл. 4.3) могут использоваться для хранения временных переменных, но только тогда, когда не используются по основному назначению. Хранят индексы исходных и целевых эле- ментов массива или строки: • RSI, ESI. SI, SIL — индекс источника (Source Index); • RDI, EDI, DI, DIL — индекс приемника (Destination Index). Регистры указателей (см. табл. 4.3) могут использоваться для хра- нения временных переменных, но только тогда, когда не использу- ются по основному назначению. Используются при работе со стеком и при адресации по базе: • RBP, EBP, BP, BPL — указатель базы (Base Pointer); • RSP, ESP, SP, SPL — указатель стека (Stack Pointer). Таблица 4.3 Регистры индексов и указателей RSP RBP RSI RDI Rx | ESP | EBP | ESI | EDI 1 RxD | SP | BP 1 si 1 DI RxlV \SPL \bpl \SIL \dil RxB Регистры SIL, DIL, BPL, SPL появились только в 64-разрядных процессорах. Сегментные регистры Используются для хранения селекторов сегментов. Селектор сегмента — это некоторое число, явным или неявным образом указывающее на положение сегмента в ОП. Например, в ре-
альном режиме селектор сегмента равен адресу начала сегмента, де- ленному на 16 (т.е. номеру параграфа), и явно указывает на начало сегмента. А в защищенном режиме селектор сегмента указывает на ячейку в таблице, расположенной в ОП, в которой и хранится адрес начала сегмента, т.е. — указание неявное. Сегмент — область ОП, в рамках которой можно адресовать дан- ные, указывая смещение (начинающееся с нуля) от начала сегмента, при этом физический (реальный) адрес будет вычисляться ЦП с уче- том значения селектора сегмента. Сегментные регистры имеют разрядность 16 бит и делятся: • na.CS — регистр сегмента кода (Code Segment); • SS — регистр сегмента стека (Stack Segment); • DS (Data Segment), ES (Extended data Segment), FS, GS — регистры сегментов данных. Регистр указателя следующей команды. RIP, EIP, IP (Instruction Pointer) — хранит смещение следующей команды относительно ко- дового сегмента. В 64-разрядных процессорах используется свой регистр — указа- тель инструкций — RIP. Младшей частью этого регистра является регистр EIP. На основе RIP в 64-разрядных процессорах введен новый метод адресации RIP-relative. В остальном работа RIP аналогична работе регистра EIP. Регистр флагов. RFLAGS, EFLAGS, FLAGS — регистры, использу- ющиеся при выполнении большинства команд; например, ин- струкции условного перехода используют один или несколько флагов состояния для проверки условия. Структура регистра флагов приве- дена в табл. 4.4. Таблица 4.4 Структура регистра флагов Бит, № Обозна- чение Название Описание Тип флага Когда введен FLAGS 0 CF Carry Flag Флаг переноса Состояние 1 1 Зарезервирован 2 PF Parity Flag Флаг четности Состояние 3 0 Зарезервирован 4 AF Auxiliary Carry Flag Вспомогательный флаг переноса Состояние 5 0 Зарезервирован 6 ZF Zero Flag Флаг нуля Состояние
Окончание табл. 4.4 Бит, № Обозна- чение Название Описание Тип флага Когда введен 7 SF Sign Flag Флаг знака Состояние 8 TF Trap Flag Флаг трассировки (пошаговое выпол- нение) Системный 9 IF Interrupt Enable Flag Флаг разрешения прерываний Системный 10 DF Direction Flag Флаг направления Управля- ющий 11 OF Oveiflow Flag Флаг переполнения Состояние 12 IOPL I/O Privilege Level Уровень приоритета ввода/вывода Системный 80286 13 14 NT Nested Task Флаг вложенности задач Системный 80286 15 0 Зарезервирован EFLAGS 16 RF Resume Flag Флаг возобновле- ния Системный 80386 17 VM Virtual- 8086 Mode Режим виртуаль- ного процессора 8086 Системный 80386 18 AC Alignment Check Проверка выравни- вания Системный 80486SX 19 VIF Virtual Interrupt Flag Виртуальный флаг разрешения преры- вания Системный Pentium 20 VIP Virtual Interrupt Pending Ожидающее вирту- альное прерывание Системный Pentium 21 ID ID Flag Проверка на до- ступность ин- струкции CPUID Системный Поздние 80486121 22 0 Зарезервированы 31 RFLAGS 32 0 Заре зервированы 63
В микропроцессорах Intel 8086 имеет название FLAGS и является 16-разрядным. Расширенные регистры EFLAGS и RFLAGS, введенные в архитектурах IA-32 (процессоры 80386) и х86-64, являются 32-бит- ными и 64-битными соответственно. Расширенные регистры сохра- няют обратную совместимость. Регистр флагов содержит группу флагов состояния, управляющий флаг и группу системных флагов. В этом регистре каждый бит явля- ется флагом, т.е. устанавливается в 1 при определенных условиях или установка его в 1 изменяет поведение процессора. Значение некоторых флагов в регистре флагов можно изменять напрямую, с помощью специальных инструкций (например, CLD для сброса флага направления), но нет инструкций, которые позво- ляют обратиться (проверить или изменить) к регистру флагов как к обычному регистру. Однако можно сохранять регистр флагов в стек или регистр (Е)АХ и восстанавливать регистр флагов из них с помощью инструкций LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD. При приостановке задачи (используя многозадачные возмож- ности процессора) процессор автоматически сохраняет значение флага регистров в TSS (task state segment), при активизации новой задачи процессор загружает регистр флагов из TSS новой задачи. Когда активизируется обработчик прерывания или обработчик исключительной ситуации, процессор автоматически сохраняет зна- чение флага регистров в текущем стеке. Флаги состояния в активном состоянии. Флаги состояния (биты 0, 2, 4, 6, 7 и 11) отражают результат выполнения арифметических ин- струкций, таких как ADD, SUB, MUL. DIV. CF — устанавливается при переносе из/заеме в (при вычитании) старший значащий бит результата и показывает наличие переполне- ния в беззнаковой целочисленной арифметике. Также используется в длинной арифметике. PF — устанавливается, если младший значащий байт результата содержит четное число единичных (ненулевых) битов. Изначально этот флаг был ориентирован на использование в коммуникацион- ных программах: при передаче данных по линиям связи для конт- роля мог также передаваться бит четности. Принцип работы и ин- струкции для проверки флага четности облегчали проверку целост- ности данных. AF — устанавливается при переносе или заеме из бита 4 резуль- тата. Этот флаг ориентирован на использование в двоично-десятич- ной (binary coded decimal, BCD) арифметике.
ZF— устанавливается, если результат машинной операции по мо- дулю 2 в степени к (где к — разрядность ячейки) равен нулю. SF — равен значению старшего значащего бита результата, кото- рый является знаковым битом в знаковой арифметике. OF — устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде (регистре или ячейке памяти). Этот флаг показывает наличие переполнения в знаковой целочисленной арифметике (в дополнительном коде). Из перечисленных флагов только флаг CF можно изменять на- прямую с помощью инструкций STC, CLC и СМС Также битовые инструкции (ВТ, BTS, BTR и ВТС) копируют указанный бит во флаг CF. Флаги состояния позволяют одной и той же арифметической ин- струкции выдавать результат трех различных типов: беззнаковое, знаковое и двоично-десятично кодированное (BCD) целое число. Если результат считать беззнаковым числом, то флаг СЕ показывает условие переполнения (перенос или заем); для знакового результата (в дополнительном коде) перенос или заем показывает флаг OF, а для ЙСЭ-результата перенос/заем показывает флаг Л/7. Флаг SFотражает знак знакового результата, флаг ZF отражает и беззнаковый, и зна- ковый нулевой результат. В длинной целочисленной арифметике флаг СЕ используется со- вместно с инструкциями сложения с переносом (ADC) и вычитания с заемом (SBB) для распространения переноса или заема из одного вычисляемого разряда длинного числа в другой. Инструкции условного перехода Jcc (переход по условию сс, на- пример JNZpflR перехода, если результат не ноль), SETcc (установить значение байта-результата в зависимости от условия сс), LOOPcc (ор- ганизация цикла) и CMOVcc (условное копирование) используют один или несколько флагов состояния для проверки условия Напри- мер, инструкция перехода JLE (jump if less or equal — переход, если «меньше или равен», <) проверяет условие «ZF- 1 или SFOF». Флаг РЕ был введен для совместимости с другими микропроцес- сорными архитектурами и по прямому назначению используется редко. Более распространено его использование совместно с осталь- ными флагами состояния в арифметике с плавающей запятой: ин- струкции сравнения (FCOM, FCOMP и т.п.) в математическом сопро- цессоре устанавливают в нем флаги-условия СО, Cl, С2 и СЗ, и эти флаги можно скопировать в регистр флагов. Для этого рекомендуется использовать инструкцию FSTSW АХ для сохранения слова со- стояния сопроцессора в регистре АХ и инструкцию SAHF для после-
дующего копирования содержимого регистра АН в младшие 8 битов регистра флагов [4]; при этом СО попадает во флаг CF, С2 — в PF, а СЗ — в ZF. Флат С2 устанавливается, например, в случае несравни- мых аргументов (NaN или неподдерживаемый формат) в инструкции сравнения FUCOM. Управляющий флаг. Флаг направления (DF, бит 10 в регистре фла- гов) управляет строковыми инструкциями (MOYS, CMPS, SCAS, LODS и STOS) установка флага заставляет уменьшать адреса (обра- батывать строки от старших адресов к младшим); обнуление застав- ляет адреса увеличивать Инструкции STD и CLD соответственно устанавливают и обнуляют флаг DF. Системные флаги и поле IOPL. Системные флаги и поле IOPL управляют операционной средой и не предназначены для использо- вания в прикладных программах. IF — обнуление этого флага запрещает отвечать на маскируемые запросы на прерывание. TF — установка этого флага разрешает пошаговый режим от- ладки, когда после каждой выполненной инструкции происходит прерывание программы и вызов специального обработчика преры- вания (см. также IntS). IOPL — показывает уровень приоритета ввода/вывода исполня- емой программы или задачи: чтобы программа или задача могла вы- полнять инструкции ввода-вывода или менять флаг IF, ее текущий уровень приоритета (СРП) должен быть < IOPL. NT— этот флаг устанавливается, когда текущая задача «вложена» в другую, прерванную задачу и сегмент состояния TSS текущей за- дачи обеспечивает обратную связь с TSS предыдущей задачи. Флаг NT проверяется инструкцией IRET для определения типа возврата — межзадачного или внутризадачного. RF— флаг маскирования ошибок отладки. VM — установка этого флага в защищенном режиме вызывает пе- реключение в режим виртуального 8086. Режим виртуального процессора 8086 (режим И86), предназначен для совместимости с программами, разработанными для реального режима В рамках этого режима процессор ведет себя так, как если бы он находился в реальном режиме, за исключением того, что прерывания и исключения передаются обработчикам защищенного режима вне этой задачи (кроме случая, когда используется карта пе- ренаправления прерываний). АС — установка этого флага вместе с битом АМ в регистре С7?0 включает контроль выравнивания операндов при обращениях к па-
мяти — обращение к невыравненному операнду вызывает исключи- те^ 1ьн у ю ситуацию. VIF— виртуальная копия флага 7F; используется совместно с фла- гом VIP. VIP — устанавливается для указания наличия отложенного пре- рывания; используется совместно с флагом VIF. ID — возможность программно изменить этот флаг в регистре флагов указывает на поддержку инструкции CPUID. CPUID (идентификация процессора) сообщает информацию о производителе, типе и модификации процессора, о наличии и под- держке различных расширений. Команда CPUID поддерживается х86-совместимыми процессорами, начиная со старших моделей 80486. 2. Регистры управления памятью — это регистры системных адре- сов. В защищенном режиме процессор берет информацию о сегмен- тах памяти из дескрипторных таблиц — глобальной (GDT) и локаль- ной (LDT), но если положение LDTописано в одном из дескрипто- ров GDT, то положение самой GDTнеобходимо указывать иначе. Помимо этого, в процессоре i80286 появилась возможность разме- щать таблицу векторов прерываний в произвольном месте оператив- ной памяти, а не обязательно в самом начале, как в процессоре 8086. Это привело к необходимости добавить четыре регистра, указыва- ющих положения структур данных, ответственных за сегментацию в защищенном режиме: • GDTR: 48-битный (6-байтный) регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрип- торов (GDT) и ее 16-битный размер (минус 1): — чтение — команда SGDT — запись — команда LGDT. • IDTR\ 48-битный (6-байтный) регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрип- торов обработчиков прерываний (IDT) и ее 16-битный размер (минус 1). Каждый раз, когда происходит прерывание или исклю- чение, процессор передает управление на обработчик, описыва- емый дескриптором из IDTс соответствующим номером: — чтение — команда SIDT; — запись — команда LIDT. • LDTR’ 80-битный (10-байтный) регистр, в видимой части кото- рого содержится 16-битный селектор для GDT(TIселектора равен нулю), а в теневой — весь 8-байтный дескриптор из GDT, описы- вающий текущую таблицу локальных дескрипторов (LDT):
— чтение — команда SLDT, — хапись — команда LLDT. • TR: 80-битный (10-байтный) регистр, в видимой части которого содержится 16-битный селектор для GDT {TI селектора равен нулю), а в теневой — весь 8-байтный дескриптор из GDT, описы- вающий сегмент состояния текущей задачи — TSS (Task State Seg- ment). Служит для организации многозадачной работы процес- сора в защищенном режиме: — чтение — команда STR, — запись — команда LTR. 3. Регистры управления процессором. Пять 32-битных регистров CRQ—CR4 управляют функционированием процессора и работой от- дельных его внутренних блоков. Доступ к этим регистрам возможен с помощью обычной команды MOV. 4. Отладочные регистры Восемь 32-битных регистров DR(‘i—DR1 предназначены для аппаратной отладки. Позволяют программам, выполняющимся на уровне привилегий 0, определять точки оста- нова, не модифицируя код программ (например — для отладки прог- рамм, применяющих сложные схемы защиты от трассировки). Доступ к этим регистрам возможен с помощью обычной команды MOV. 5. Регистры сопроцессора х87. Сопроцессор (FPU) предназначен для выполнения операций над вещественными числами. С про- граммной точки зрения сопроцессор содержит блок регистров дан- ных, регистр управления и группу регистров состояния и указателей. Восемь регистров данных разрядностью 80 бит организованы в стек (табл. 4.5). Номер регистра, являющегося текущей вершиной стека, хранится в специальном поле регистра состояния (указателе вер- шины стека). Операция PUSH уменьшает значение указателя на еди- ницу и помещает в стек данные в регистр, являющийся новой вер- шиной стека. Операция POP записывает данные с вершины стека в память или регистр и увеличивает указатель на единицу. Ин- струкции адресуют регистры либо явно, либо неявно. Неявная адре- сация подразумевает операнд, находящийся на вершине стека. Явная адресация подразумевает указание смещения регистра относительно вершины стека — v/(Z). 6. Расширения архитектуры х86. Расширения архитектуры х86 — инженерные решения, разрабатываемые различными производите- лями микропроцессоров архитектуры х86 для собственных процес- соров, которые зачастую присутствуют в одних моделях и отсут-
Регистры данных FPU (арифметический стек) Физический номер 80 бит Относительный номер 1 бит 15 бит 64 бит Знак Порядок Мантисса 0 mmO ST(5) 1 mml ST(6) 2 mm2 ST(T) 3 mm3 ST{Q) 4 mm 4 ST(\) 5 mm5 ST(2) 6 mm6 S7(3) 7 mm7 ST(4) Регистры MMX / 3DNow\ ствуют в других. Разработчики программного обеспечения, прежде чем использовать их в собственных программах, должны выполнить специальную команду CPUID, которая сообщает о наличии тех или иных расширений. Если расширение не поддерживается, программа должна либо завершить работу, либо использовать другие алгоритмы, не использующие расширений. Иногда расширения становятся часто используемыми в популяр- ных программах, тогда их начинают включать в свои процессоры практически все производители. Наиболее известные из расширений — MMX, SSE, 3D Now'., Hyper- threading. В основном новые расширения разрабатываются фирмой «Intel» и затем подхватываются другими производителями. Но иногда бывает так, что сама «Intel» включает в свои процессоры расшире- ния, созданные иными фирмами. К примеру, так было с архитекту- рой х86-64, впервые разработанной компанией «AMD», а уже впо- следствии реализованная «Intel» как Intel64/EM64T. MMX было первым расширением, реализующим технологию SIMD (Single Instruction — Multiple Data). Основная идея SIMD за- ключается в одновременной обработке нескольких элементов дан- ных одной операцией. Расширение ММХ использует новые типы упакованных 64-битных целочисленных данных: • 8 упакованных байт (Packed byte); • 4 упакованных слова (Packed word); • 2 упакованных двойных слова (Packed double word); • 1 учетверенное слово (Quad word).
Эти типы данных могут специальным образом обрабатываться в 64-битных регистрах MMQ— \!М~!. представляющих собой младшие биты стека 80-битных регистров FPU. Каждая инструкция ММХ вы- полняет действие сразу над всем комплектом операндов (8, 4, 2 или 1), размещенных в адресуемых регистрах. Как и регистры FPU, эти ре- гистры не могут использоваться для адресации памяти. Совпадение регистров ММХи FPUнакладывает ограничение на чередование кодов FPU и ММХ. В отличие от стека FPU регистры ММХ адресуются не с помощью стека, а физически (по своим физическим номерам). Технология 3DNow\ разработанная «AMD», расширяет возмож- ности ММХ. Она позволяет оперировать с новым типом данных — парой упакованных вещественных чисел одинарной точности. Эти числа занимают по двойному слову (32 бита) в 64-битных регистрах ММХ. Расширение 3£Wow! работает с упакованными данными в FP- формате с одинарной точностью, а также упакованными 8 байт, 4 слова, 2 двойных слова и 64-битными целыми числами, размещая их в младших 64 битах регистров FPU/MMX. SSE (англ. Streaming SIMD Extensions, потоковое SIMD- расширение процессора) — это SIMD (англ. Single Instruction, Mul- tiple Data, одна инструкция — множество данных), набор инструк- ций, разработанный «Intel» и впервые представленный в процессорах серии Pentium III как ответ на аналогичный набор инструкций 3DNow\ от «AMD», который был представлен годом раньше. Перво- начально названием этих инструкций было KNI — Katmai New In- structions (Katmai — название первой версии ядра процессора Pen- tium III). Технология SSE позволяла преодолеть две основные проблемы ММХ'. при использовании ММХ невозможно было одновременно использовать инструкции сопроцессора, так как его регистры были общими с регистрами ММХ, и возможность ММХ работать только с целыми числами. В SSE добавлены восемь (шестнадцать для х64) 128-битных реги- стров, которые называются XMMQ—XMM1 (-ХММ15). Каждый ре- гистр может содержать четыре 32-битных значения с плавающей точкой одинарной точности. Преимущество в производительности достигается в том случае, когда необходимо произвести одну и ту же последовательность дей- ствий над разными данными. В таком случае блоком SSE осуще- ствляется распараллеливание вычислительного процесса между дан- ными.
Блок ХММ. Начиная с Pentium III, «Intel» использует в своих про- цессорах новое потоковое расширение SSE (Streaming SIMD Exten- sion). Оно реализуется дополнительным независимым блоком, име- ющим восемь 128-битных регистров, названных XMMQ—XMM1, и регистр состояния/управления MXCSR. В каждый из регистров ХММпомещаются четыре числа в формате с плавающей точкой оди- нарной точности. Блок позволяет выполнять векторные (пакетные) и скалярные инструкции. Векторные инструкции реализуют опера- ции сразу над четырьмя комплектами операндов. Скалярные ин- струкции работают только с одним комплектом операндов — млад- шим 32-битным словом. При выполнении инструкций тради- ционное оборудование FPU/MMX не используется, что позволяет эффективно смешивать инструкции ММХ с инструкциями с плава- ющей точкой. Кроме инструкций с новым блоком ХММ, в расширение SSE вхо- дят и дополнительные целочисленные инструкции с регистрами ММХ, а также инструкции управления кэшированием. В процессоре Pentlum4 набор инструкций получил новое расши- рение — SSE2, в основном касающееся добавления новых 128-бит- ных типов данных для блока ХММ'. • упакованная пара вещественных чисел двойной точности; • упакованные целые числа: 16 байт, 8 слов, 4 двойных слова или пара учетверенных слов. В процессор введены новые функции целочисленной арифме- тики, 128-разрядные для регистров ХММ и такие же 64-разрядные для регистров ММХ', ряд старых инструкций ММХ распространили на ХММ (в 128-битном варианте); добавлены инструкции преобра- зования для новых форматов данных, а также расширены возмож- ности «перемешивания» данных в блоке ХММ. Кроме того, расши- рена поддержка управления кэшированием и порядком исполнения операций с памятью. Advanced Vector Extensions (AVX) — расширение системы команд х86 для микропроцессоров «Intel» и «AMD». Л ЕЕпредоставляет раз- личные улучшения, новые инструкции и новую схему кодирования машинных кодов. Новая схема кодирования инструкций VEX использует VEX- префикс. В настоящий момент существуют два ИЕА-префикса — длиной 2 и 3 байта. Для 2-байтного ЕЕ.¥-префикса первый байт равен 0хС5, для 3-байтного — 0хС4. В 64-битном режиме первый байт ЕЕТ-префикса уникален. В 32-битном режиме возникает конфликт с инструкциями LES
и LDS, который разрешается старшим битом второто байта, он имеет значение только в 64-битном режиме через неподдерживаемые формы инструкций LES и LDS. Длина существующих AVX-инструкций вместе с КЕА-ирсфик- сом не превышает 11 байт. В следующих версиях ожидается появле- ние более длинных инструкций. Планируемые дополнения системы команд Схема кодирования инструкций VEX легко допускает дальнейшее расширение набора инструкций AVX. В следующей версии, AVX2, добавлены инструкции для работы с целыми числами, FMA3 (увели- чил производительность при обработке чисел с плавающей запятой в 2 раза [11]), загрузку распределенного в памяти вектора (gather) и прочее. Различные планируемые дополнения системы команд х86: • AES; • CLMUL, • Intel/AMD FMA3; • AMDFMA4, • AMD ХОР ; • AMDCVTX6. В серверных процессорах поколения Broadwell добавлены расши- рения AVX 3.1, а в серверных процессорах поколения Skylake — AVX3.2. Регистры архитектуры х86-64 (AMD64) Выпущенные фирмой «AMD» процессоры Athlon64 и Opteron имеют архитектуру х86-64, которая, в отличие от архитектуры х86, является полностью 64-битной. Она естественным образом расши- ряет регистры общего назначения х86 до 64 бит и увеличивает их количество. Также удваивается число регистров ХММ. Регистры FPU/ ММХостаются без изменений (табл. 4.6). В отличие от процессоров х86, у которых все вещественные вы- числения производились в сопроцессоре, а блоку ХММ отводились только векторные операции, процессоры х86-64 практически все вещественные вычисления выполняют в блоке ХММ.
Регистры архитектуры х86-64 (AMD64) SSE 128 бит 64 бита ХММО RAX ЕАХ хмм\ RBX ЕВХ ХММ2 RCX ЕСХ ХММЗ RDX EDX ХММ4 RSI ESI ХММЗ RDI EDI ХММ6 RBP EBP ХМ Ml RSP ESP хммх RS, ХММ9 R9 ХММ10 ЛЮ ХММ11 АН ХММ12 А12 ХМ МО А13 ХММ14 А14 ХММО А15 4.4. Режимы работы х86-совместимых процессоров Процессоры IA-32 могут работать в четырех режимах: режиме ре- альных адресов, защищенном режиме, режиме виртуального процес- сора 8086 и режиме системного управления. Рассмотрим более по- дробно эти режимы. Реальный режим адресации После включения питания компьютера или после подачи на про- цессор сигнала сброса процессор архитектуры х86 начинает работу в реальном режиме. В этом режиме начинается исполнение кода BIOS 1ВМ-РС-совместимого компьютера. В реальном режиме может быть выполнена инициализация некоторой аппаратуры (например, инициализация контроллера ОЗУ чипсета), необходимая для работы программ после переключения процессора в защищенный режим. Если размеры кода и данных программы, выполняющей инициали- зацию аппаратуры, невелики, эта программа может выполняться в реальном режиме. Так, например, операционная система (ОС) DOS работает в реальном режиме и не пытается перевести процессор в за-
щищенный режим. Ранние версии ОС Microsoft Windows могли ра- ботать только в реальном режиме. Даже ОС Wincows 3 0 среди трех режимов работы предусматривала запуск в реальном режиме и могла выполняться на процессоре 8086. Реальный режим отличается возможностью обращения к памяти с адресным пространством 1 Мбайт посредством механизма сегмент- ной адресации, который используется для увеличения объема па- мяти, доступной системе (с 16 до 20 разрядов адреса). В режиме реальных адресов используется сегментная адресация памяти (адрес ячейки памяти формируется из двух чисел: сдвинутого на 4 бита адреса начала сегмента и смещения ячейки от начала сег- мента; любому процессу доступна вся память компьютера). Изна- чально режим не имел названия, был назван реальным только после создания процессоров 80286, поддерживаю]цих режим, названный защищенным (режим назван защищенным, так как создавался для защиты процессов друг от друга — для того чтобы не позволить про- цессам иметь доступ к областям памяти друг друга; но для процессо- ров 80286 защищенный режим не был по-настоящему защищенным, так как эти процессоры не поддерживали страничную адресацию памяти, впервые реализованную в процессорах 80386). В реальном режиме виртуальный адрес ячейки памяти состоит из двух чисел: • сегментной части разрядностью 16 бит, по которой вычисляется физический адрес начала сегмента; • смещения разрядностью 16 бит ячейки памяти от начала сегмента. Для вычисления физического или линейного адреса ячейки па- мяти процессор вычисляет физический адрес начала сегмента — ум- ножает сегментную часть виртуального адреса на число 16 (или, что то же самое, сдвигает ее влево на 4 бита), а затем складывает полу- ченное число со смещением от начала сегмента: Сегментная часть х 16 + Смещение. Если сегментная часть адреса не указана (в коде инструкции), процессор читает сегментную часть адреса из одного из сегментных регистров (из какого именно — зависит от кода инструкции). При такой адресации адреса 0400А:0001 h и 0000/7:4001/? (буква «h» означает, что число записано в шестнадцатеричной системе счис- ления) будут ссылаться на одну и ту же ячейку памяти, так как 400Л х 16 + 1 = 0 х 16 + 4001/z. Минимальный адрес: 0000/г:0000/? (0 байт).
Максимальный адрес: FFFFh: FFFFh (FFFFh x 16 + FFFFh = \OFFEFh = 1114095 Байт = = 100000Л + 1000Oh - 11 h - 1 Mбайт + 64 Кбайт - 17 байт). Описанный способ вычисления физического адреса позволяет адресовать (1 Мбайт + 64 Кбайт - 17 байт + 1 байт) памяти (диапазон адресов ООООл.-.Ю/ТЕ/Тг); 1 байт добавляется для учета байта с нуле- вым адресом. Однако в процессорах 8086/8088 имеется всего 20 адресных линий (металлических дорожек), поэтому размер до- ступной памяти составляет 220 байт = 1 Мбайт (диапазон адресов 0000h-FFFFFh), а при адресации выше (в диапазоне 100000Л- lOFFEFh) происходит переполнение («заворот») — старший единич- ный бит адреса игнорируется, и происходит обращение к 64 Кбайт в начальных адресах (0000/?—FFEFh). Процессоры 80286 имеют 24-битовую адресную шину (возможна адресация 224 байт = 16 Мбайт памяти), поэтому в них переполнения не происходит. Компьютеры IBM PC/AT построены на процессоре Intel 80286 и для сохранения совместимости с компьютерами IBM PC и IBM PC/XT (построенными на Intel 808х) оснащены логическим элемен- том (вентилем), управляющим работой 21-адресной линии (провода) (обозначаемой «А20») и названным «Gate А20». Этот логический элемент по умолчанию отключен (что соответствует режиму совмес- тимости) и управляется через контроллер клавиатуры (обычно через микросхему Intel 8042). Процессоры 80286 и более новые модели, работая в реальном ре- жиме, в основном имеют такие же ограничения на размер адресного пространства, как и процессоры 8086. Для использования памяти большего размера программам, разработанным для реального ре- жима, необходимы специальные программные средства. На машинах с процессором 80286 и более новыми моделями можно, например, использовать драйверы вроде HIMEM.SYS. Существуют также сред- ства, предоставляемые недокументированной командой LOADALL (что, однако, сопряжено с рядом трудностей). В процессорах 80386 и более новых моделях появилась возможность, не документирован- ная фирмой «Intel» и позволяющая перевести процессор в режим, неофициально названный режимом unreal. Работая в режиме unreal, программа может, хоть и с некоторыми ограничениями, использовать 32-битовое физическое адресное пространство (2 байт = 4 Гбайт). Несмотря на то что фирма «Intel» не предусмотрела возможность перехода процессора 80286 из защищенного режима в реальный ре-
жим, компьютер IBM PC/AT имеет такую возможность благодаря аппаратным особенностям и поддержке со стороны BIOS. Компью- тер IBM PC/AT позволяет программам подавать сигнал сброса на процессор. Код BIOS может различать причины/режимы переза- пуска, анализируя содержимое ячейки энергонезависимой памяти CMOS с адресом 077? и ячейки ОЗУ с адресом 40/?:72/?. Любая прог- рамма, записав в названные ячейки памяти подходящие значения и подав сигнал сброса на процессор, может заставить процессор перезагрузиться; после перезагрузки процессор начнет исполнять код BIOS', код BIOS прочитает значения из вышеназванных ячеек памяти, не станет выполнять начальную загрузку, не станет изме- нять содержимое ОЗУ (в ОЗУ останутся те же данные, что и до пе- резагрузки процессора) и передаст управление коду, расположен- ному в ОЗУ по адресу, записанному в ячейку ОЗУ с адресом 40/?:67/?. Таким образом, программа может многократно переключаться между защищенным и реальным режимами, хотя этот способ тре- бует сравнительно большого расхода времени на каждое переклю- чение. Защищенный режим адресации В защищенном режиме формирование физического адреса на- много сложнее. В этом случае селектор сегмента используется для поиска базового адреса в одной из двух специальных таблиц базовых адресов, находящихся в оперативной памяти. Эти таблицы называ- ются дескрипторными таблицами или таблицами описания сегмен- тов памяти, так как в них кроме базовых адресов начала сегментов содержатся размеры сегментов и байт с описанием прав доступа к этим сегментам. Одна из них называется глобальной дескриптор- ной таблицей GDT, а вторая — локальной дескрипторной таблицей LDT. Причем GDT одна для всех задач, выполняемых на компью- тере, a LDTможет быть своей у каждой задачи, и сегмент, в котором она находится, должен быть описан в GDT. В защищенном режиме селектор сегмента — это специальная 16-битная структура, имеющая следующий вид, представленный в табл. 4.7. Index (биты 15—3) — номер дескриптора в таблице. Таблица 4.7 16-битная структура селектора сегмента Index 77 RPL 15 з 2 1 о
TI (бит 2): индикатор таблицы (0 — использовать GDT, 1 — ис- пользовать LDT). RPL (биты 1—0): уровень привилегий запроса (Requested Privilege Level). Частным случаем RPL является текущий уровень привиле- гий — CPL (Current Privilege Level), чье значение в любой момент времени находится в сегментном регистре CS Уровень привилегий запроса (RPL) — это число от 0 до 3. указы- вающее уровень зашиты сегмента, для доступа к которому использу- ется данный селектор. Если программа имеет более высокий уровень привилегий (CPL), при использовании этого сегмента привилегии понизятся до RPL. Для 32-битного защищенного режима размер записи в таблицах дескрипторов (размер одного дескриптора) равен 8 байт. Существует несколько типов дескрипторов. Дескриптор сегмента данных или кода имеет вид, представленный в табл. 4.8. Таблица 4.8 32-битпая структура дескриптора сегмента Старшее 32-разрядное слово дескриптора сегмента Base (31 24) G D/B 0 AVL Limit (19 16) Р DPL 5 Type Base (23 16) 31 24 23 22 21 20 19 16 15 14 13 12|111 |8 7| o Младшее 32-разрядное слово дескриптора сегмента Base (31 16) Limit (15 0) 31 1 16 15 1 0 G — бит гранулярности. Определяет размер единицы гранулярно- сти: • G- 0—1 байт; • G- 1—4096 байт (4 Кбайт). Base — линейный 32-битный адрес начала сегмента. Limit — 20-битное число, равное размеру сегмента в единицах гра- нулярности. Отсчет ведется с нуля, так что Limit - 0 соответствует сегменту длиной в одну единицу гранулярности. Остальные поля определяют тип (Туре), права доступа {DPL — Descriptor Privilege Level) и прочие характеристики сегмента. Процессор по селектору, хранящемуся в сегментном регистре, находит соответствующую запись в дескрипторной таблице, считы- вает значения базового адреса сегмента, добавляет смещение и по- лученный результат использует как искомый линейный адрес в опе- ративной памяти. Однако реально используемый при этом физиче-
ский адрес будет получен из линейного адреса путем еще нескольких преобразований, необходимых, в частности: • для поддержки процессором более чем 4 Гбайт (252 байта) памяти в 32-битном режиме (страничная адресация, режимы Р5ЕЪЬ и РАЕ); • поддержки процессором виртуальной памяти, данные которой, при необходимости, могут быть временно выгружены на жесткий диск. Режим виртуального процессора 8086 Возможность программного перехода из защищенного режима в реальный режим была предусмотрена фирмой «Intel» только в про- цессорах 80386 и в более новых моделях. Однако в 80386 большую ценность имеет другая новая возможность — режим виртуального 8086 (И86, W86). Заметим, что до разработки фирмой «Intel» процессора 180836 тер- мин «виртуальный режим» иногда использовался в литературе для обозначения защищенного режима работы процессора i80286. В режим Г86 процессор может перейти из защищенного режима, если установить в регистре флагов EFLAGS бит виртуального режима (VM-бит). Номер бита VMв регистре EFLAGS — 17. Когда процессор i80386 находится в виртуальном режиме, его по- ведение во многом напоминает поведение хорошо знакомого нам процессора i8086. В частности, для адресации памяти используется схема <сегмент: смещение>, размер сегмента составляет 64 Кбайт, а размер адресуемой в этом режиме памяти — 1 Мбайт. Виртуальный режим предназначен для работы программ, ориен- тированных на процессор i8086 (или i8088). Но виртуальный ре- жим — это не реальный режим процессора i8086, имеются суще- ственные отличия. Процессор фактически продолжает использовать схему преобразования адресов памяти и средства мультизадачности защищенного режима. В виртуальном режиме используется трансляция страниц памяти. Это позволяет в мультизадачной операционной системе создавать несколько задач, работающих в виртуальном режиме. Каждая из этих задач может иметь собственное адресное пространство, каждое раз- мером в 1 Мбайт. Все задачи виртуального режима обычно выполняются в третьем, наименее привилегированном кольце защиты. Когда в такой задаче возникает прерывание, процессор автоматически переключается из виртуального режима в защищенный. Поэтому все прерывания
отображаются в операционную систему, работающую в защищенном режиме. Обработчики прерываний защищенного режима могут модели- ровать функции соответствующих прерываний реального режима, что необходимо для правильной работы программ, ориентированных на реальный режим операционной системы MS-DOS. Благодаря режиму F86 появилась возможность создания вирту- альных машин. Операционная система может ограничить доступ к той или иной области памяти для каждой виртуальной машины, может выделять для них виртуальную память вместо реальной (фи- зической) и может контролировать обращения к портам ввода/вы- вода. Перечисленное используется для организации работы ОС DOS под управлением многозадачных ОС вроде OS/2 и Microsoft Windows. При этом каждой виртуальной машине DOS доступен только 1 Мбайт адресного пространства и одновременно могут быть запущены не- сколько виртуальных машин DOS. Режим системного управления Режим системного управления (System Management Mode) по- явился в новых поколениях микропроцессоров Intel. Он предна- значен для выполнения некоторых действий с возможностью их полной изоляции от прикладного программного обеспечения и даже от операционной системы. Микропроцессор переходит в этот режим только аппаратно. Никакой программный способ не предусмотрен для перехода в этот режим. Вход в режим управления системой возможен только по аппарат- ному сигналу SMI (прерывание управления системой) из любого другого режима работы. Получив этот сигнал, процессор сохраняет свое текущее состояние в специальной области памяти (так называ- емая память режима управления системой — SMRAM) и начинает выполнение кода SMM. Завершается код SMM выполнением доступ- ной только ему инструкции RSM, возвращающей управление прог- рамме, прерванной сигналом SM1. Сигнал SMI не может быть запре- щен и имеет наивысший приоритет по сравнению с любыми другими источниками прерываний. Код режима управления системой не может быть прерван ника- кими внешними событиями, включая вторичное появление сигнала на линии SMI. Он выполняется в плоском адресном пространстве объемом 4 Гбайт и может использовать любые команды процессора. В режиме управления системой невозможно использование меха- низма расширенной физической адресации, именно поэтому объем
доступного физического адресного пространства памяти ограничен величиной 4 Гбайт. SMRAM является частью оперативной памяти. Базовый адрес и размер области, отведенной под SMRAM, устанавливаются прог- раммно (это выполняет инициализационный код BIOS). В много- процессорных системах каждому логическому процессору назнача- ется своя область SMRAM. Первоначально в качестве SMRAM использовалось ОЗУ, лежащее по физическим адресам 000/1_0000—WOBFFFF При работе процес- сора в обычном режиме в этом диапазоне находится видеопамять и доступы осуществляются к ней. Когда же процессор находится в режиме SMM, доступ к видеопамяти блокируется и вместо нее до- ступным становится обычное ОЗУ. Позднее появилась возможность выделять SMRAM в памяти с адресами свыше 1 Мбайт. В документа- ции на чипсеты Intel соответствующие области обычно обозначаются TSEG и HSEG. Например, чипсет G45 позволяет использовать для доступа к SMRAMследующие группы адресов: • область совместимой (compatible) SMRAM, лежащую по физиче- ским адресам 000Л 0000—0N)B_FFFF; • область TSEG, лежащую сразу под памятью, отведенной под нужды встроенного графического контроллера, а если последний не используется — в конце нижней (ниже 4 Гбайт) области до- ступной для использования системной памяти; • область HSEG, лежашую с точки зрения процессора по физиче- ским адресам ГЕЕИ 0000 — FEDBFFFF, но отображаемую на ад- реса памяти 0(Ю/1_0000—Q0QB_FFFF, т.е. в область совместимой SMRAM. Разница заключается в том, что область 000Л 0000— 000B_FFFF не может кэшироваться процессором, поскольку на эти адреса приходится и SMRAM, и видеопамять, а область ЕЕЕИОООО — FEDB FFFF может быть кэширована. Современные чипсеты, включая упомянутый выше G45, вклю- чают специальную поддержку обращений к SMRAM' те области, которые отведены под нее, недоступны внешним устройствам, а также процессорам, работающим не в режиме управления систе- мой. При использовании механизма виртуализации возможны два ва- рианта обработки SMF. • обычный режим (default treatment), в котором обработку SMIосу- ществляет код аппаратной платформы, на базе которой работают виртуальные машины (т.е код, находящийся в «настоящем» BIOS)'
• двухмониторный режим (dual-monitor treatment), когда обслужи- вание SMI выполняется двумя программами: исполнительным монитором (executive monitor) и монитором SMM(SMM monitor). Первый работает вне режима управления системой, он обеспечи- вает виртуализацию для поддержки гостевых систем. Второй мо- нитор функционирует в SMM и выполняет функции управления реальной аппаратной платформой. Двухмониторный режим под- держивается не всеми процессорами. Разработка программ для режима управления системой сильно осложняется тем, что его практически невозможно отлаживать. Фак- тически единственный способ отладки — это использование прог- раммных эмуляторов, однако для этого требуется корректная реали- зация соответствующей виртуальной машиной не только собственно режима управления системой, но и всех тонкостей аппаратуры, ко- торой код режима SMM должен управлять. 4.5. Конвейеризация инструкций Одна из первых и наиболее мощных техник повышения произво- дительности — это использование конвейера инструкций. Конвей- еры увеличивают производительность, позволяя нескольким ин- струкциям прокладывать свой путь через процессор в одно и то же время. Многие современные процессоры управляются тактовым генера- тором. Процессор внутри состоит из логических элементов и ячеек памяти — триггеров. Когда приходит сигнал от тактового генератора, триггеры приобретают свое новое значение и логике требуется неко- торое время для декодирования новых значений. Затем приходит следующий сигнал от тактового генератора, триггеры принимают новые значения и т.д. Разбивая последовательности логических эле- ментов на более короткие и помещая триггеры между этими корот- кими последовательностями, уменьшают время, необходимое логике для обработки сигналов. В этом случае длительность одного такта процессора может быть, соответственно, уменьшена. Например, простейший конвейер /?Л5'С-процессоров можно пред- ставить пятью стадиями с наборами триггеров между стадиями: • получение инструкции; • декодирование инструкции; • выполнение; • доступ к памяти; • запись в регистр.
RISC сделал конвейеры меньше и значительно проще в конструи- ровании, отделив каждый этап обработки инструкций, зафиксировав длину машинной инструкции и сделав время их выполнения одина- ковым — один такт или как максимум один цикл доступа к памяти (из-за выделения инструкций LOAD и STORE). Процессор в целом функционирует на манер сборочной линии с инструкциями, посту- пающими с одной стороны, и результатами, выходящими с другой. Из-за уменьшенной сложности классического Л75С-конвсйсра кон- вейерезированное ядро и кэш-инструкции могли быть размещены на кристалле того же размера, который содержал бы лишь ядро в слу- чае С/УС-архитектуры. Это и было истинной причиной того, что RISC был быстрее. Ранние разработки, такие как SPARC и MIPS, часто работали в 10 раз быстрее С/5С-рсшений «Intel» и «Motorola» той же тактовой частоты и цены. Конвейер помогает не во всех случаях. Существует несколько воз- можных минусов. Конвейер инструкций можно назвать «полностью конвейерным», если он может принимать новую инструкцию каж- дый машинный цикл. Иначе в конвейер должны быть вынужденно вставлены задержки, которые выравнивают конвейер, при этом ухуд- шая его производительность. Преимущества. Время цикла процессора уменьшается, таким образом увеличивая скорость обработки инструкций в большинстве случаев. Некоторые комбинационные логические элементы, такие как сумматоры или умножители, могут быть ускорены путем увеличения количества логических элементов. Использование конвейера может предотвратить ненужное наращивание количества элементов. Недостатки. Бесконвейерный процессор исполняет только одну инструкцию за раз. Это предотвращает задержки веток инструкций (фактически каждая ветка задерживается) и проблемы, связанные с последовательными инструкциями, которые исполняются парал- лельно. Следовательно, схема такого процессора проще и он дешевле для изготовления. Задержка инструкций в бесконвейерном процессоре несколько ниже, чем в конвейерном эквиваленте. Это происходит из-за того, что в конвейерный процессор должны быть добавлены дополнитель- ные триггеры. У бесконвейерного процессора скорость обработки инструкций стабильна. Производительность конвейерного процессора предска- зать намного сложнее, и она может значительно различаться в раз- ных программах.
Рассмотрим пример. Допустим, типичная инструкция для сложе- ния двух чисел — это СЛОЖИТЬ А, В, С. Эта инструкция суммирует значения, находящиеся в ячейках памяти А и В. а затем кладет ре- зультат в ячейку памяти С В конвейерном процессоре контроллер может разбить эту операцию на последовательные задачи вида: • ЗАГРУЗИТЬ A, R1; • ЗАГРУЗИТЬ В, R2; • СЛОЖИТЬ /?], R2, R3; • ЗАПИСАТЬ R3. С; • загрузить следующую инструкцию. Ячейки 7?1, R2 и R3 являются регистрами процессора. Значения, которые хранятся в ячейках памяти, которые мы называем Л и В, загружаются (т.е. копируются) в эти регистры, затем суммируются, и результат записывается в ячейку памяти С. В данном примере конвейер состоит из трех уровней — загрузки, исполнения и записи. Эти шаги называются уровнями или шагами конвейера. В бесконвейерном процессоре только один шаг может работать в один момент времени, поэтому инструкция должна полностью за- кончиться, прежде чем следующая инструкция в принципе начнется. В конвейерном процессоре все эти шаги могут выполняться одно- временно на разных инструкциях. Поэтому, когда первая инструкция находится на шаге исполнения, вторая инструкция будет на стадии раскодирования, а третья инструкция будет на стадии прочтения. Конвейер не уменьшает время, которое необходимо для того, чтобы выполнить инструкцию, но зато он увеличивает объем (число) инструкций, которые могут быть выполнены одновременно, и таким образом уменьшает задержку между выполненными инструкциями, увеличивая так называемую пропускную способность. Чем больше уровней имеет конвейер, тем больше инструкций могут выполняться одновременно и тем меньше задержка между завершенными ин- струкциями. Каждый микропроцессор, произведенный в наши дни, использует как минимум двухуровневый конвейер. Рассмотрим еще один пример: теоретический трехуровневый кон- вейер. Шаг Английское название Описание Выборка Fetch Прочитать инструкцию из памяти Исполнение Execute Исполнить инструкцию Запись Write-back Записать результат в память и/или регистры
Псевдоассемблерный листинг, который нужно выполнить: • ЗАГРУЗИТЬ 40, А; загрузить число 40 в А; • КОПИРОВ АТЬ А, В', скопировать А в 5; • СЛОЖИТЬ 20, В; добавить 20 к В; • ЗАПИСАТЬ В, 0x0300; записать В в ячейку памяти 0x0300. Как это будет исполняться: Такт Выборка Исполнение Запись Пояснение Такт 1 ЗАГРУЗИТЬ Инструкция ЗАГРУЗИТЬ читается из памяти Такт 2 КОПИРО- ВАТЬ ЗАГРУЗИТЬ Инструкция ЗАГРУЗИТЬ выполняется, инструкция КОПИРОВАТЬ читается из памяти Такт 3 СЛОЖИТЬ КОПИРО- ВАТЬ ЗАГРУЗИТЬ Инструкция ЗАГРУЗИТЬ находится на шаге записи результата, где се резуль- тат (т.е. число 40) записы- вается в регистр А. В это же время ин- струкция КОПИРОВАТЬ исполняется. Так как она должна скопировать со- держимое регистра Л в ре- гистр В, она должна до- ждаться окончания ин- струкции ЗАГРУЗИТЬ Такт 4 ЗАПИСАТЬ СЛОЖИТЬ СКОПИРО- ВАТЬ Загружена инструкция ЗАПИСАТЬ, тогда как инструкция СКОПИРО- ВАТЬ прощается с нами, а по инструкции СЛО- ЖИТЬ в данный момент производятся вычисления И так далее. Следует учитывать, что иногда инструкции будут за- висеть от итогов других инструкций (например, как наша ин- струкция КОПИРОВАТЬ). Когда более чем одна инструкция ссыла- ется на определенное место, читая его (т.е. используя в качестве входного операнда) либо записывая в него (т.е. используя его в каче- стве выходного операнда), исполнение инструкций не в порядке, который был изначально запланирован в оригинальной программе, может повлечь за собой «конфликт конвейера». Существует не-
сколько зарекомендовавших себя приемов либо для предотвращения конфликтов, либо для их исправления, если они случились. Контрольные вопросы и задания 1. Постройте структурную схему блока микропрограммного управления микропроцессора и опишите принцип работы. 2. Постройте структурную схему блока обработки сигналов микропроцес- сора и опишите принцип работы. 3. Составьте алгоритм работы конвейернго процессора сложения двух чисел. 4. Каковы преимущества конвейеризации инструкций? 5. Какие регистры микропроцессора доступны программисту? 6. Что такое регистр флагов? 7. Основные функции регистров управления процессором и памятью. 8. Для чего нужны отладочные регистры микропрцессора? 9. Каковы функции регистров FPU(математического сопроцессора)? 10. Какие расширения архитектуры х86 (х86 extended features) вы знаете? 11. В каких режимах могут работать процессоры IA-32? 12. Каково назначение режима виртуального процессора 8086? 13. Каково назначение режима системного управления? 14. Назначение режима реальных адресов процессора. В чем заключается отличие от защищенного режима? 15. Режим системного управления (System Management Mode), назначение. Существует ли программный способ для перехода микропроцессора в данный режим?
Глава 5 ОРГАНИЗАЦИЯ МИКРОПРОЦЕССОРНОЙ СИСТЕМЫ В этой главе рассмотрим принципы построения микропроцес- сорных систем и способы взаимодействия устройств в составе ми- кропроцессорной системы. 5.1. Структура связей микропроцессорных систем Микропроцессорная система — сложная система, включающая в себя большое количество различных устройств. Основой ее явля- ется микропроцессор. Связь устройств микропроцессорной системы между собой осуществляется с помощью сопряжений, которые в вы- числительной технике называются интерфейсами. Интерфейс — это совокупность программных и аппаратных средств, предназначенных для передачи информации между компо- нентами микропроцессорной системы и включающих в себя элект- ронные схемы, линии, шины и сигналы адресов, данных и управ- ления, алгоритмы передачи сигналов и правила интерпретации сиг- налов устройствами. В широком смысле интерфейс включает также механическую часть (совместимость по типоразъемам) и вспомога- тельные схемы, обеспечивающие электрическую совместимость устройств по уровням логических сигналов, входным и выходным токам и т.д. Подробное изучение интерфейсов и системных шин не входит в задачи данного курса. Поэтому эти вопросы мы будем рассматри- вать лишь с точки зрения общего представления об организации ра- боты микропроцессорной системы и принципах взаимодействия составляющих ее устройств. Для достижения максимальной универсальности и упрощения протоколов обмена информацией в микропроцессорных системах применяется так называемая шинная структура связей между отдель- ными устройствами, входящими в систему. Суть шинной структуры связей сводится к следующему. При классической структуре связей (рис. 5.1) все сигналы и коды между устройствами передаются по отдельным линиям связи.
Рис. 5.1. Классическая структура связей Каждое устройство, входящее в систему, передает свои сигналы и коды независимо от других устройств. При этом в системе получа- ется очень много линий связи и разных протоколов обмена инфор- мацией. При шинной структуре связей (рис. 5.2) все сигналы между устрой- ствами передаются по одним и тем же линиям связи, но в разное время (это называется мультиплексированной передачей). Причем передача по всем линиям связи может осуществляться в обоих на- правлениях (так называемая двунаправленная передача) В результате количество линий связи существенно сокращается, а правила обмена (протоколы) упрощаются. Группа линий связи, по которым переда- ются сигналы или коды, как раз и называется шиной (англ. bus). Рис. 5.2. Шинная структура связей Понятно, что при шинной структуре связей легко осуществляется пересылка всех информационных потоков в нужном направлении, например их можно пропустить через один процессор, что очень важно для микропроцессорной системы. Однако при шинной струк- туре связей вся информация передается по линиям связи последова- тельно во времени, по очереди, что снижает быстродействие системы по сравнению с классической структурой связей. Большое достоинство шинной структуры связей состоит в том, что все устройства, подключенные к шине, должны принимать и пе- редавать информацию по одним и тем же правилам (протоколам
обмена информацией по шине). Соответственно, все узлы, отвеча- ющие за обмен с шиной в этих устройствах, должны быть единооб- разны, унифицированны. Существенный недостаток шинной структуры связан с тем, что все устройства подключаются к каждой линии связи параллельно. Поэтому любая неисправность любого устройства может вывести из строя всю систему, если она портит линию связи. По этой же при- чине отладка системы с шинной структурой связей довольно сложна и обычно требует специального оборудования. В системах с шинной структурой связей применяют все три суще- ствующие разновидности выходных каскадов цифровых микросхем: • стандартный выход или выход с двумя состояниями (обозначается 2С, 2S, реже - ТТЛ, TTL); • выход с открытым коллектором (обозначается ОК, ОС); • выход с тремя состояниями или (что то же самое) с возможностью отключения (обозначается ЗС, 35). Упрощенно эти три типа выходных каскадов могут быть представ- лены в виде схем на рис. 5.3. Рис. 5.3. Три типа выходов цифровых микросхем У выхода 2Сдва ключа замыкаются по очереди, что соответствует уровням логической единицы (верхний ключ замкнут) и логического нуля (нижний ключ замкнут). У выхода ОК замкнутый ключ форми- рует уровень логического нуля, разомкнутый — логической единицы. У выхода ЗС ключи могут замыкат ься по очереди (как в случае 20, а могут размыкаться одновременно, образуя третье, высокоимпе- дансное состояние. Переход в третье состояние (Z-состояние) управ- ляется сигналом на специальном входе EZ. Выходные каскады типов ЗС и ОК позволяют объединять не- сколько выходов микросхем для получения мультиплексированных (рис. 5.4) или двунаправленных (рис. 5.5) линий. При этом в случае выходов ЗС необходимо обеспечить, чтобы на линии всегда работал только один активный выход, а все осталь-
Рис. 5.4. Мультиплексированная линия Рис. 5.5. Двунаправленная линия ные выходы находились бы в это время в третьем состоянии, иначе возможны конфликты. Объединенные выходы ОК могут работать все одновременно, без всяких конфликтов. Типичная структура микропроцессорной системы приведена на рис. 5.6. Она включает в себя три основных типа устройств- • процессор; • память, включающую оперативную память (ОЗУ, RAM — Random Access Memory) и постоянную память (ПЗУ, ROM — Read Only Memory), которая служит для хранения данных и программ; • устройства ввода/вывода (УВВ, I/O — Input/Output Devices), слу- жащие для связи микропроцессорной системы с внешними устройствами, для приема (ввода, чтения. Read) входных сигналов и выдачи (вывода, записи, Write) выходных сигналов. Выходные сигналы
Все устройства микропроцессорной системы объединяются об- щей системной шиной (она же называется еще системной магистра- лью или каналом). Системная магистраль включает в себя четыре основные шины нижнего уровня: • шину адреса (Address Bus); • шину данных (Data Bus); • шину управления (Control Bus); • шину питания (Power Bus). Шина данных — это основная шина, ради которой и создается вся система. Количество се разрядов (линий связи) определяет скорость и эффективность информационного обмена, а также максимально возможное количество команд. Шина данных всегда двунаправленная, так как предполагает пе- редачу информации в обоих направлениях. Наиболее часто встреча- ющийся тип выходного каскада для линий этой шины — выход с тремя состояниями. Обычно шина данных имеет 8, 16, 32 или 64 разряда. Понятно, что за один цикл обмена по 64-разрядной шине может передаваться 8 байт информации, а по 8-разрядной — только один байт. Разряд- ность шины данных определяет и разрядность всей магистрали. На- пример, когда говорят о 32-разрядной системной магистрали, под- разумевается, что она имеет 32-разрядную шину данных. Шина адреса — вторая по важности шина, которая определяет максимально возможную сложность микропроцессорной системы, т.е. допустимый объем памяти и, следовательно, максимально воз- можный размер программы и максимально возможный объем запо- минаемых данных. Количество адресов, обеспечиваемых шиной адреса, определяется как 2А, где N — количество разрядов. Напри- мер, 16-разрядная шина адреса обеспечивает 65 536 адресов. Разряд- ность шины адреса обычно кратна четырем и может достигать 32 и даже 64. Шина адреса может быть однонаправленной (когда маги- стралью всегда управляет только процессор) или двунаправленной (когда процессор может временно передавать у правление магистра- лью другому устройству, например контроллеру ПДП). Наиболее часто используются типы выходных каскадов с тремя состояниями или обычные ТТЛ (с двумя состояниями). Как в шине данных, так и в шине адреса может использоваться положительная или отрицательная логика. При положительной ло- гике высокий уровень напряжения соответствует логической еди- нице на соответствующей линии связи, низкий — логическому нулю.
При отрицательной логике — наоборот. В большинстве случаев уровни сигналов на шинах — ТТЛ. Для снижения общего количества линий связи магистрали часто применяется мультиплексирование шин адреса и данных, т.е. одни и те же линии связи используются в разные моменты времени для передачи как адреса, так и данных (в начале цикла — адрес, в конце цикла — данные). Для фиксации этих моментов (стробирования) служат специальные сигналы на шине управления Понятно, что мультиплексированная шина адреса/данных обеспечивает меньшую скорость обмена, требует более длительного цикла обмена (рис. 5.7). По типу шины адреса и шины данных все магистрали также делятся на мультиплексированные и немультиплексированные. Шина / \ адреса / Шина / п \ \ Данные )— Данных \ / аШдрХ/даннЬ1х~( АдРес ХДанные)~ Немультиплексированные шины Мультиплексированная шина Рис. 5.7. Мультиплексирование шин адреса и данных В некоторых мультиплексированных магистралях после одного кода адреса передается несколько кодов данных (массив данных). Это позволяет существенно повысить быстродействие магистрали. Иногда в магистралях применяется частичное мультиплексирование, т.е. часть разрядов данных передается по немультиплексированным линиям, а другая часть — по мультиплексированным с адресом ли- ниям. Шина управления — это вспомогательная шина, управляющие сиг- налы на которой определяют тип текущего цикла и фиксируют мо- менты времени, соответствующие разным частям или стадиям цикла. Кроме того, управляющие сигналы обеспечивают согласование ра- боты процессора (или другого хозяина магистрали, задатчика, master) с работой памяти или устройства ввода/вывода (устройства-испол- нителя, slave). Управляющие сигналы также обслуживают запрос и предоставление прерываний, запрос и предоставление прямого доступа. Сигналы шины управления могут передаваться как в положитель- ной логике (реже), так и в отрицательной логике (чаще). Линии шины управления могут быть как однонаправленными, так и двуна- правленными. Типы выходных каскадов могут быть самыми раз- ными: с двумя состояниями (для однонаправленных линий); с тремя
состояниями (для двунаправленных линий); с открытым коллекто- ром (для двунаправленных и мультиплексированных линий). Самые главные управляющие сигналы — это стробы обмена, т.е сигналы, формируемые процессором и определяющие моменты времени, в которые производится пересылка данных по шине дан- ных, обмен данными. Чаше всего в магистрали используются два различных строба обмена: • строб записи (вывода), который определяет момент времени, когда устройство-исполнитель может принимать данные, выстав- ленные процессором на шину данных; • строб чтения (ввода), который определяет момент времени, когда устройство-исполнитель должно выдать на шину данных код дан- ных, который будет прочитан процессором. При этом большое значение имеет то, как процессор заканчивает обмен в пределах цикла, в какой момент он снимает свой строб об- мена. Возможны два пути решения (рис. 5.8): 1) при синхронном обмене процессор заканчивает обмен данными самостоятельно, через раз и навсегда установленный временной ин- тервал выдержки (/ВЬ1Д), т.е. без учета интересов устройства-исполни- теля; 2) при асинхронном обмене процессор заканчивает обмен только тогда, когда устройство-исполнитель подтверждает выполнение опе- рации специальным сигналом (так называемый режим handshake — рукопожатие). Строб ------- обмена \/ Синхронный обмен а) Ci роб обмена Подтв. Асинхронный обмен G} Рис. 5.8. Синхронный (а) обмен и асинхронный (б) обмен Достоинства синхронного обмена — более простой протокол об- мена, меньшее количество управляющих сигналов. Недостатки — отсутствие гарантии, что исполнитель выполнил требуемую опера- цию, а также высокие требования к быстродействию исполнителя. Достоинства асинхронного обмена — более надежная пересылка данных, возможность работы с самыми разными по быстродействию исполнителями. Недостаток — необходимость формирования сиг- нала подтверждения всеми исполнителями, т.е. дополнительные ап- паратурные затраты.
Какой тип обмена быстрее — синхронный или асинхронный? От- вет на этот вопрос неоднозначен. С одной стороны, при асинхрон- ном обмене требуется какое-то время на выработку, передачу допол- нительного сигнала и на его обработку процессором. С другой сто- роны, при синхронном обмене приходится искусственно увеличивать длительность строба обмена для соответствия требова- ниям большего числа исполнителей, чтобы они успевали обмени- ваться информацией в темпе процессора. Поэтому иногда в маги- страли предусматривают возможность как синхронного, так и асин- хронного обмена, причем синхронный обмен является основным и довольно быстрым, а асинхронный применяется только для мед- ленных исполнителей. По используемому типу обмена магистрали микропроцессорных систем также делятся на синхронные и асинхронные. Рассмотрим структурную схему подключения микропроцес- сорных устройств к системной шине простейшего микропроцессор- ного устройства (рис. 5.9). В качестве обязательных устройств, которые входят в состав лю- бой микропроцессорной системы, можно назвать ОЗУ, ПЗУ, таймер и порты ввода/вывода. В состав системной шины в зависимости от типа процессора входит одна или несколько шин адреса, одна или несколько шин данных и шина управления. Несколько шин данных и адреса применяется для увеличения производительности процес- сора и используется только в сигнальных процессорах. В универсаль- ных процессорах и контроллерах обычно применяется одна шина адреса и одна шипа данных. В понятие шины вкладывают разное значение при рассмотрении различных вопросов. В простейшем случае под понятием «шина» подразумевают параллельно проложенные провода, по которым пе- редается двоичная информация. При этом по каждому проводу пе- редается отдельный двоичный разряд. Информация может переда- ваться в одном направлении, как, например, для шины адреса или шины управления, или в различных направлениях (для шины дан- ных). По шине данных информация передается либо к процессору, либо от процессора в зависимости от операции записи или чтения, которую в данный момент осуществляет процессор. В любом случае все сигналы, необходимые для работы системной шины, формируются микросхемой процессора, как это рассматри- валось при изучении операционного блока. Иногда для увеличения скорости обработки информации функции управления системной шины берет на себя отдельная микросхема (например, контроллер
16 /16 ,'8 /16 RD И/R /8 АО А12 рг) yj/д DO 07 Центральный процессор RD IVR 00 D7 ОЗУ А0-А12 CS ----т-----Q- А0-А12 ,113 А14 .415 D0-D7 RD ПЗУ /'8 WR 00 D/ АО-АЮ CS ----Г“-- A<j-A IО до £ 2 Порт ввода/выьода CS ВхI-Вх4 ША □Д ШУ All Al 2 AI3 Al 1 А15 А1 А 2 4з 44 А5 Аб А7 А8 А9 А 0 А' 1 А 2 А 3 Д’ 4 415 Рис. 5.9. Структурная схема подключения микропроцессорных устройств к системной шине
прямого доступа к памяти или сопроцессор). Арбитраж доступа к си- стемной шине при этом осуществляет контроллер системной шины (в простейшем случае достаточно сигнала занятости шины). В некоторых случаях в понятие «шина» дополнительно включают требования по уровням напряжения, которыми представляются нули и единицы, передаваемые по ее проводам. В состав требований могут быть включены длительности фронтов передаваемых сигналов, типы используемых разъемов и их распайка, последовательность переда- ваемых сигналов и скорость их передачи. При подключении различных устройств к системной шине воз- никает вопрос: как различать эти устройства между собой? Един- ственный способ сделать это — использовать индивидуальный адрес для каждого устройства, подключенного к системной шине микро- процессора. Так как адресация производится к каждой ячейке устройства индивидуально, то возникает понятие адресного про- странства, занимаемого каждым устройством, и адресного простран- ства микропроцессорного устройства в целом. 5.2. Адресное пространство микропроцессорного устройства Диапазон доступных адресов микропроцессора определяется раз- рядностью шины адреса системной шины. При этом минимальный номер ячейки памяти (адрес) будет равен нулю, а максимальный определяется из формулы М = Т- 1 В качестве минимально адресуемой ячейки памяти выбирается 8-разрядная ячейка памяти (байт). Для 16-разрядной шины это будет число 65535 (64К). Адресное пространство этой шины и распределе- ние памяти микропроцессорной системы, изображенной на рис. 5.9, приведено на рис. 5.10, а распределение памяти микропроцессорной системы, изображенной на рис. 5.9, — на рис. 5.11. Микропроцессоры после включения питания и выполнения про- цедуры сброса всегда начинают выполнение программы с опреде- ленного адреса, чаще всего нулевого. Однако есть и исключения. Например, процессоры, на основе которых строятся универсальные компьютеры IBM PC или Macintosh, стартуют не с нулевого адреса. Программа должна храниться в памяти, которая не стирается при выключении питания, т.е в ПЗУ.
Рис. 5.10. Адресное пространство 16-разрядной шины адреса 64К Порт ввода/вывода 1111111111111111 Неиспользуемое адресное пространство хххххххххххххххх 16К ОЗУ 0011111111111111 001ххххххххххххх 8К 001 0000000000000 Неиспользуемое адресное пространство ОООххххххххххххх 2К ПЗУ 0000011111111111 ОООООххххххххххх 0 0000000000000000 Рис. 5.11 Распределение памяти микропроцессора с 16-разрядной шиной адреса Способы расширения адресного пространства микропроцессора Известно, что размер адресного пространства определяется раз- рядностью счетчика команд микропроцессора. Достаточно часто при развитии микропроцессорной системы возможности адресного про- странства исчерпываются. В таком случае приходится прибегать к методам расширения адресного пространства. Для этого можно воспользоваться параллельным портом. Внешние выводы параллель- ного порта при этом используются в качестве старших битов адрес- ной шины. Такой метод расширения адресного пространства назы-
вается страничным методом адресации. Регистр данных параллель- ного порта при использовании его для расширения адресного пространства будет называться переключателем страниц. Схема ис- пользования параллельного порта в качестве переключателя страниц памяти приведена на рис. 5.12. В этой схеме параллельный порт используется в качестве простей- шего контроллера памяти микропроцессорного устройства. При применении 8-разрядного параллельного порта в микропроцессор- ной системе появились дополнительные восемь линий адреса. В ре- зультате адресное пространство микропроцессорной системы увели- чилось до 16 Мбайт. Структура нового адресного пространства при- ведена на рис. 5.13, а принцип формирования нового адреса с использованием переключателя страниц приведен на рис. 5.14. Метод страничной адресации прост в реализации и при форми- ровании адреса физической памяти не приводит к дополнительным временным задержкам, но при использовании многозадачного ре- жима работы процессора для каждой активной задачи выделяется целая страница в системной памяти микропроцессора. При такой работе в системной памяти процессора остается много неиспользу- емых областей. Решить возникшую проблему позволяет метод сег- ментной организации памяти. При сегментном методе организации памяти для расширения адресного пространства используется базовый регистр, относительно которого производится адресация команд или данных в программе. Разрядность базового регистра обычно выбирают равной разрядности счетчика команд. В качестве базового регистра, как и при страничной организации памяти, можно использовать параллельный порт. Для формирования физического адреса используется параллель- ный двоичный сумматор. На входы этого сумматора подается содер- жимое базового регистра и содержимое счетчика команд. Суммиро- вание производится со смещением содержимого базового регистра влево на несколько бит относительно счетчика команд (рис. 5.16). В результате максимальный размер сегмента определяется разрядно- стью программного счетчика, а максимальная неиспользуемая об- ласть памяти — смещением базового регистра относительно прог- раммного счетчика. Адресное пространство при использовании сегментного метода адресации приведено на рис. 5.15, а формирование адреса при сег- ментной адресации приведено на рис. 5.16. Количество сегментов определяется количеством базовых реги- стров. Сегменты могут перекрываться в адресном пространстве,
Рис. 5.12. Использование параллельного порта в качестве переключателя страниц памяти
Полный адрес Адрес внутри Адрес ячейки страницы внутри страницы FFFFFF FFFF Страница 255 1111111111111111 FFCCOC 0000 0000000000000000 O2FFFF FFFF Страница 2 1111111111111111 020000 0000 0000000000000000 01FFFF FFFF Страница 1 1111111111111111 010000 0000 0000000000000090 OOFFFF FFFF Страница 0 1111111111111111 оосоос 0000 0000000000000000 Рис. 5.13. Структура страничного адресного пространства 7________________________Г 15___________________________________О Переключатель страниц ] Программный счетчик 23 U ----------------------Сформированный адрес----------------------» Рис. 5.14. Формирование адреса с использованием переключателя страниц Полный адрес Адрес внутри сегмента FFFFF Неиспользуемое пространство 17031 17030 8000 Сегмент 2 0F030 0000 0F028 0F01C 0018 0000 Сегмент 1 0F0C5 F005 Сегмент 0 00000 оосо Рис. 5.15. Пример адресного пространства с разделением на сегменты и тем самым может регулироваться размер памяти, который отво- дится под каждый конкретный сегмент памяти. В компьютерах се- мейства IBM PC имеются четыре базовых регистра, определяюших сегмент данных, сегмент программы, сегмент стека и дополнитель-
___________________ 15_______________________О | ОООО | Программный счетчик | + 15 _ ___ _ 0____ |Базовый регистр 0000 J | А^рес = Программный счетчик + Базовый регистр 216 | 20 0 -*------------Сформированный адре:-----------► Рис. 5.16. Формирование адреса при сегментной адресации пый сегмент. Информацию в базовые регистры заносит операцион- ная система при переключении задач. Еще одним распространенным способом увеличения адресного пространства является применение окон. При использовании окон производится расширение не всего адресного пространства, а только его части. Внутри адресного пространства выделяется некоторая об- ласть, которая называется окном. В это окно может отображаться часть другого адресного пространства. При использовании окон может быть использован как странич- ный метод отображения адресного пространства, так и сегментный метод отображения адресного пространства в окно. При использовании страничного метода отображения конкретная страница другого адресного пространства, которая в данный момент отображается в окно памяти, определяется переключателем страниц, построенным по такому же принципу, как это было рассмотрено на рис. 5.12. При использовании сегментного метода отображения конкретная область адресного пространства, которая будет отображаться в окно, определяется содержимым базового регистра. Если разрядность ад- реса вспомогательного адресного пространства, отображаемого в окно основной памяти, совпадает с разрядностью базового реги- стра, то любая область вспомогательной памяти может быть отобра- жена в основную память с точностью до байта. Принцип построения оконной адресации при отображении стра- ниц показан на рис 5.17. Оконная адресация часто используется при развитии микропро- цессорных семейств, когда размера областей памяти, отведенных для конкретных задач в младших моделях семейства, не хватает для стар- ших моделей семейства, а при этом нужно поддерживать аппаратную совместимость с младшими моделями семейства. В качестве примера можно привести микросхемы 181 с96 фирмы «Intel» или TMS320c5410
Основная гамягь Дополнительная память Страница, которая видна в данный момент из основной памяти Рис. 5.17. Применение окна для расширения адресного пространства фирмы «Texas Instrument», где для расширения области регистров специальных функций используется оконная адресация. Типичное распределение адресного пространства В зависимости от модификации персонального компьютера и со- става его периферийного оборудования распределение адресного пространства может несколько различаться. Тем не менее размеще- ние основных компонентов системы довольно строго унифициро- вано. Типичная схема использования адресного пространства ком- пьютера приведена в табл. 5.1. Значения адресов, как и повсюду дальше в книге, даны в шестнадцат еричной системе счисления. Первые 640 Кбайт адресного пространства с адресами от ООООО/г до 9FFFFh (и соответственно, с сегментными адресами от 0000Л до dFFFh) отводятся под основную оперативную память, которую еще называют стандартной (conventional). Начальный килобайт опера- тивкой памяти занят векторами прерываний, которые обеспечивают работу системы прерываний компьютера, и включает 256 векторов по 4 байта каждый. Вслед за векторами прерываний располагается так называемая область данных BIOS, которая занимает всего 256 байт, начиная с сегментного адреса 40А. Сама BIOS (от Basic In- Out System, базовая система ввода-вывода) является частью опера- ционной системы, хранящейся в постоянном запоминающем устройстве. Это запоминающее устройство (ПЗУ BIOS) располагается на системной плате компьютера и является, таким образом, приме- ром встроенного или «зашитого» программного обеспечения. В функции BIOS входит тестирование компьютера при его включе- нии, загрузка в оперативную память собственно операционной сис- темы MS-DOS, хранящейся на магнитных дисках, а также управление
Таблица 5.1 Типичное распределение адресного пространства Физические адреса Объем адресного пространства Обычная память (640 Кбайт) От 00000Й до 00400Й Векторы прерываний 1 Кбайт От 00400/7 до 00500/7 Область данных BIOS 256 байт От 00500/7 До Vffffh ОС MS DOS Десятки Кбайт Свободная память Оставшаяся па- мять до 640 Кбайт Старшая или верхняя (upper) память (между 640 Кбайт и 1 Мбайт) От аОООО/г ДО 9/07; Графический видеобуфер 64 Кбайт От ЛОООО/г до 68000/7 Свободная область 32 Кбайт От />8000/7 до сООООй Текстовый видеобуфер 32 Кбайт От сООООЛ до г/ООООЛ ПЗУ расшире- ния BIOS 64 Кбайт От Л0000А до /0000А Свободные адреса 128 Кбайт От /0000/7 доЖй ПЗУ BIOS 64 Кбайт Расширенная память (между 1 Мбайт и 4 Гбайт) От юоооол до \Qffefh НМЛ 64 Кбайт От \tyfefh до 100000000/7 XMS До 4 Гбайт штатной аппаратурой компьютера — клавиатурой, экраном, дисками и пр. В области данных BIOS хранятся разнообразные данные, ис- пользуемые программами BIOS в своей работе. Так, здесь размеща- ются: • входной буфер клавиатуры, куда поступают коды нажимаемых пользователем клавиш; • адреса видеоадаптера, а также последовательных и параллельных портов; • данные, характеризующие текущее состояние видеосистемы (форма курсора и его текущее положение на экране, видеорежим, используемая видеостраница и пр.); • ячейки для отсчета текущего времени и т.д. Область данных BIOS заполняется информацией в процессе на- чальной загрузки компьютера, а затем динамически модифицируется
системой по мере необходимости. Многие прикладные программы, особенно написанные на языке ассемблера, обращаются к этой об- ласти с целью чтения или модификации содержащихся в них данных. С некоторыми ячейками области данных BIOS мы столкнемся при рассмотрении примеров конкретных программ. В области памяти, начиная с адреса 500й, располагается соб- ственно операционная система MS-DOS, которая обычно занимает несколько десятков килобайт. Программы MS-DOS, как и другие си- стемные составляющие (векторы прерываний, область данных BIOS), записываются в память автоматически в процессе начальной за- грузки компьютера. Вся оставшаяся память до границы 640 Кбайт свободна для за- грузки любых системных или прикладных программ. Как правило, в начале сеанса в память загружают резидентные программы (руси- фикатор, антивирусные программы). При наличии резидентных программ объем свободной памяти уменьшается. Оставшиеся 384 Кбайт адресного пространства между границами 640 Кбайт и 1 Мбайт, называемые старшей или верхней (upper) па- мятью, первоначально были предназначены для размещения посто- янных запоминающих устройств (ПЗУ). Практически под ПЗУ за- нята только небольшая часть адресов, а остальные используются в других целях. Часть адресного пространства старшей памяти отводится для ад- ресации к графическому и текстовому видеобуферам графического адаптера. Графический адаптер представляет собой отдельную мик- росхему или даже отдельную плату, в состав которой входит соб- ственное запоминающее устройство (видеопамять). Это запомина- ющее устройство не имеет никакого отношения к оперативной па- мяти компьютера, однако его схемы управления настроены на диапазоны адресов AWOOh-AFFFFh и BWOOh-BFFFFh, входящих в общее с памятью адресное пространство процессора Поэтому лю- бая программа может обратиться по этим адресам и, например, запи- сать данные в видеобуфер, что приведет к появлению на экране не- которого изображения. Если видеосистема находится в текстовом режиме, а запись осуществляется по адресам текстового видеобуфера, на экране появятся изображения тех или иных символов (букв, цифр, различных знаков). Если же перевести видеосистему в графический режим и записывать данные в графический видеобуфер, то на экране появятся отдельные точки или линии. Можно также прочитать теку- щее содержимое ячеек видеобуфера.
В самом конце адресного пространства, в области адресов ЕООООЛ—FFFFFh располагается ПЗУ BIOS — постоянное запомина- ющее устройство, о котором уже говорилось выше. Часть адресного пространства, начиная с адреса С0000Л, отво- дится еще под одно ПЗУ — так называемое ПЗУ расширений BIOS для обслуживания графических адаптеров и дисков. В состав компьютера наряду со стандартной памятью (640 Кбайт) входит еще расширенная (extended) память, максимальный объем ко- торой может доходить до 4 Гбайт. Эта память располагается за пре- делами первого мегабайта адресного пространства и начинается с ад- реса 100000Л. Реально на машине может быть установлен не полный объем расширенной памяти, а лишь несколько десятков мегабайт или даже меньше. Поскольку функционирование расширенной памяти подчиняется «спецификации расширенной памяти» (Extended Memory Specifica- tion, XMS), то и саму память часто называют ХЛ/У-памятью. Как уже отмечалось выше, доступ к расширенной памяти осуществляется в защищенном режиме, поэтому для MS-DOS, работающей только в реальном режиме, расширенная память недоступна. Однако в со- временные версии MS-DOS включается драйвер HIMEM.SYS, под- держивающий расширенную память, т.е. позволяющий ее использо- вать, хотя и ограниченным образом. Конкретно в расширенной па- мяти можно разместить электронные диски (с помощью драйвера RAMDRIVE.SYS) или дисковые кэш-буферы (с помощью драйвера SMARTDRV.SYS). Первые 64 Кбайт расширенной памяти, точнее 64 Кбайт — с 16 адресами от 100000/? до WFFEFh, носят специальное название область старшей памяти (High Memory'Area, НМА). Эта область за- мечательна тем, что, хотя она находится за пределами первого мега- байта, к ней можно обратиться в реальном режиме работы микро- процессора, если определить сегмент, начинающийся в самом конце мегабайтного адресного пространства с сегментного адреса FFFFh, и разрешить использование адресной линии А20. Первые 16 байт этого сегмента заняты ПЗУ, область же со смещениями 00ЮЛ—FFFFh можно в принципе использовать под программы и данные. MS-DOS позволяет загружать в НМА (директивой файла CONFIG.SYS DOS = = HIGH) значительную часть самой себя, в результате чего занятая системой область стандартной памяти существенно уменьшается. Старшую память обслуживает тот же драйвер HIMEM.SYS, поэтому загрузка DOS в НМА возможна, только если установлен драйвер HIMEM.SYS.
В защищенном режиме работы память не ограничивается 1 Мбайт, а может иметь максимальный размер 4 Гбайт. Функции памяти микропроцессорной системы Объем памяти определяет допустимую сложность выполняемых системой алгоритмов, а также в некоторой степени и скорость ра- боты системы в целом. Модули памяти выполняются на микросхемах памяти (оперативной или постоянной). Все чаще в составе микро- процессорных систем используется флэш-память (англ. — flash mem- ory), которая представляет собой энергонезависимую память с воз- можностью многократной перезаписи содержимого. В пространстве памяти микропроцессорной системы обычно вы- деляются несколько особых областей, которые выполняют специ- альные функции. Для подключения модуля памяти к системной магистрали ис- пользуются блоки сопряжения, которые включают в себя дешифра- тор (селектор) адреса, схему обработки управляющих сигналов ма- гистрали и буферы данных (рис. 5.18). Шина адреса Шина данных Шина управления Рис. 5-18. Структура модуля памяти Оперативная память общается с системной магистралью в циклах чтения и записи, постоянная память — только в циклах чтения. Обычно в составе системы имеется несколько модулей памяти, каж- дый из которых работает в своей области пространства памяти. Се- лектор адреса как раз и определяет, какая область адресов простран- ства памяти отведена данному модулю памяти. Схема управления вырабатывает в нужные моменты сигналы разрешения работы па- мяти (С. S') и сигналы разрешения записи в память (И7/?). Буферы дан-
ных передают данные от памяти к магистрали или от магистрали к памяти Память программы начального запуска всегда выполняется на ПЗУ или флэш-памяти. Именно с этой области процессор начинает ра- боту после включения питания и после сброса его с помощью сиг- нала RESET. Память для стека или стек (Stack) — это часть оперативной па- мяти, предназначенная для временного хранения данных в режиме LIFO (Last In — First Out). Особенность стека по сравнению с другой оперативной па- мятью — это заданный и неизменяемый способ адресации. При за- писи любого числа (кода) в стек число записывается по адресу, опре- деляемому как содержимое регистра указателя стека, предварительно уменьшенное (декрементированное) на единицу (или на два, если 16-разрятные слова расположены в памяти по четным адресам). При чтении из стека число читается из адреса, определяемого содержи- мым указателя стека, после чего это содержимое указателя стека уве- личивается (инкрементируется) на единицу (или на два). В результате получается, что число, записанное последним, будет прочитано пер- вым, а число, записанное первым, будет прочитано последним. Такая память называется LIFO или памятью магазинного типа (например, в магазине автомата патрон, установленный последним, будет извле- чен первым). Принцип действия стека показан на рис. 5.19 (адреса ячеек па- мяти выбраны условно). Пусть, например, текущее состояние указателя стека 1000008 и в него надо записать два числа (слова). Первое слово будет запи- сано по адресу 1000006 (перед записью указатель стека уменьшится Оперативная память Чтение Запись Рис. 5.19. Принцип работы стека
на два), второе — по адресу 1000004. После записи содержимое ука- зателя стека — 1000004. Если затем прочитать из стека два слова, то первым будет прочитано слово из адреса 1000004, а после чтения указатель стека станет равным 1000006. Вторым будет прочитано слово из адреса 1000006, а указатель стека станет равным 1000008. Все вернулось к исходному состоянию. Первое записанное слово чита- ется вторым, а второе — первым. Необходимость такой адресации становится очевидной в случае многократно вложенных подпрограмм. Пусть, например, выполня- ется основная программа и из нее вызывается подпрограмма 1. Если нам надо сохранить значения данных и внутренних регистров основ- ной программы на время выполнения подпрограммы, мы перед вы- зовем подпрограммы сохраним их в стеке (запишем в стек), а после ее окончания извлечем (прочитаем) их из стека. Если же из подпрог- раммы 1 вызывается подпрограмма 2, то ту же самую операцию мы проделаем с данными и содержимым внутренних регистров подпрог- раммы 1. Понятно, что внутри подпрограммы 2 крайними в стеке (читаемыми в первую очередь) будут данные из подпрограммы 1, а данные из основной программы будут глубже. При этом в случае чтения из стека автоматически будет соблюдаться нужный порядок читаемой информации. То же самое будет и в случае, когда таких уровней вложения подпрограмм гораздо больше. То есть то, что надо хранить подольше, прячется поглубже, а то, что скоро может потре- боваться, — с краю. В системе команд любого процессора для обмена информацией со стеком предусмотрены специальные команды записи в стек (PUSH) и чтения из стека (POP). В стеке можно прятать не только содержимое всех внутренних регистров процессоров, но и содержи- мое регистра признаков (слово состояния процессора, PSW). Это позволяет, например, при возвращении из подпрограммы контроли- ровать результат последней команды, выполненной непосредственно перед вызовом этой подпрограммы Можно также хранить в стеке и данные, для того чтобы удобнее было передавать их между про- граммами и подпрограммами. В общем случае чем больше область памяти, отведенная под стек, тем больше свободы у программиста и тем более сложные программы могут выполняться Следующая специальная область памяти — это таблица векторов прерываний. Вообще, понятие прерывания довольно многозначно. Под преры- ванием в общем случае понимается не только обслуживание запроса внешнего устройства, но и любое нарушение последовательной ра-
боты процессора. Например, может быть предусмотрено прерывание по факту некорректного выполнения арифметической операции типа деления на ноль. Или же прерывание может быть прог- раммным, когда в программе используется команда перехода на ка- кую-то подпрограмму, из которой затем последует возврат в основ- ную программу. В последнем случае общее с истинным прерыванием только то, как осуществляется переход на подпрограмму и возврат из нее. Любое прерывание обрабатывается через таблицу векторов (ука- зателей) прерываний В этой таблице в простейшем случае находятся адреса начала программ обработки прерываний, которые и называ- ются векторами. Длина таблицы может быть довольно большой (до нескольких сот элементов). Обычно таблица векторов прерыва- ний располагается в начале пространства памяти (в ячейках памяти с малыми адресами). Адрес каждого вектора (или адрес начального элемента каждого вектора) представляет собой номер прерывания. В случае аппаратных прерываний номер прерывания или задается устройством, запросившим прерывание (при векторных прерыва- ниях), или же задается номером линии запроса прерываний (при радиальных прерываниях). Процессор, получив аппаратное преры- вание, заканчивает выполнение текущей команды и обращается к памяти в область таблицы векторов прерываний, в ту ее строку, которая определяется номером запрошенного прерывания. Затем процессор читает содержимое этой строки (код вектора прерывания) и переходит в адрес памяти, задаваемый этим вектором. Начиная с этого адреса, в памяти должна располагаться программа обработки прерывания с данным номером. В конце программы обработки пре- рываний обязательно должна располагаться команда выхода из пре- рывания, выполнив которую процессор возвращается к выполнению прерванной основной программы Параметры процессора на время выполнения программы обработки прерывания сохраняются в стеке. Пусть, например, процессор (рис. 5.20) выполнял основную прог- рамму и команду, находящуюся в адресе памяти 5000 (условно). В этот момент он получил запрос прерывания с номером (адресом вектора) 4 Процессор заканчивает выполнение команды из адреса 5000 Затем он сохраняет в стеке текущее значение счетчика команд (5001) и текущее значение PSW. После этого процессор читает из ад- реса 4 памяти код вектора прерывания. Пусть этот код равен 6000. Процессор переходит в адрес памяти 6000 и приступает к выполне- нию программы обработки прерывания, начинающейся с этого ад- реса. Пусть эта программа заканчивается в адресе 6100. Дойдя
Прерывание с номером 4 500С 5001 Рис. 5.20. Упрощенный алгоритм обработки прерывания до этого адреса, процессор возвращается к выполнению прерванной программы. Для этого он извлекает из стека значение адреса (500 J), на котором его прервали, и бывшее в тот момент РЛ'ИУ Затем процес- сор читает команду из адреса 5001 и дальше последовательно выпол- няет команды основной программы. Прерывание в случае аварийной ситуации обрабатывается точно так же, только адрес вектора прерывания (номер строки в таблице векторов) жестко привязан к данному типу аварийной ситуации. Программное прерывание тоже обслуживается через таблицу век- торов прерываний, но номер прерывания указывается в составе ко- манды, вызывающей прерывание. Такая сложная, на первый взгляд, организация прерываний по- зволяет программисту легко менять программы обработки прерыва- ний, располагать их в любой области памяти, делать их любого раз- мера и любой сложности. Во время выполнения программы обработки прерывания может поступить новый запрос на прерывание. В этом случае он обрабаты- вается точно так же, как описано, но основной программой счита- ется прерванная программа обработки предыдущего прерывания. Это называется многократным вложением прерываний. Механизм стека позволяет без проблем обслуживать это многократное вложе- ние, так как первым из стека извлекается тот код, который был со- хранен последним, т.е. возврат из обработки данного прерывания происходит в программу обработки предыдущего прерывания. Отметим, что в более сложных случаях в таблице векторов преры- ваний могут находиться не адреса начала программ обработки пре- рываний, а так называемые дескрипторы (описатели) прерываний. Но конечным результатом обработки этого дескриптора все равно будет адрес начала программы обработки прерываний.
Наконец, еще одна специальная область памяти микропроцес- сорной системы — это память устройств, подключенных к системной шине. Такое решение встречается нечасто, но иногда оно очень удобно То есть процессор получает возможность обращаться к внут- ренней памяти устройств ввода/вывода или каких-то еще подклю- ченных к системной шине устройств как к своей собственной сис- темной памяти. Обычно окно в пространстве памяти, выделяемое для этого, не слишком большое. Все остальные части пространства памяти, как правило, имеют универсальное назначение. В них могут располагаться как данные, так и программы (конечно, в случае одношинной архитектуры). Иногда это пространство памяти используется как единое целое, без всяких границ. А иногда пространство памяти делится на сегменты с программно изменяемым адресом начала сегмента и с установ- ленным размером сегмента. Оба подхода имеют свои плюсы и ми- нусы. Например, использование сегментов позволяет защитить об- ласть программ или данных, но зато границы сегментов могут за- труднять размещение больших программ и массивов данных. В заключение остановимся на проблеме разделения адресов па- мяти и адресов устройств ввода/вывода. Существует два основных подхода к решению этой проблемы: • выделение в общем адресном пространстве системы специальной области адресов для устройств ввода/вывода; • полное разделение адресных пространств памяти и устройств ввода/вывода. Первый подход хорош тем, что при обращении к устройствам ввода/вывода процессор может использовать те же команды, кото- рые служат для взаимодействия с памятью. Но адресное простран- ство памяти должно быть уменьшено на величину адресного про- странства устройств ввода/вывода. Например, при 16-разрядной шине адреса всего может быть 64 Кбайт адресов. Из них 56 Кбайт адресов отводится под адресное пространство памяти, а 8 Кбайт ад- ресов — под адресное пространство устройств ввода/вывода. Преимущество второго подхода состоит в том, что память зани- мает все адресное пространство микропроцессорной системы. Для общения с устройствами ввода/вывода применяются специальные команды и специальные стробы обмена на магистрали. Именно так сделано, например, в персональных компьютерах Но возможности взаимодействия с устройствами ввода/вывода в данном случае суще- ственно ограничены по сравнению с возможностями общения с па- мятью.
Принцип кэширования данных Кэш-память — это способ организации совместного функциони- рования двух типов запоминающих устройств, отличающихся вре- менем доступа и стоимостью хранения данных, который позволяет уменьшить среднее время доступа к данным за счет динамического копирования в «быстрое» ЗУ наиболее часто используемой инфор- мации из «медленного» ЗУ. Кэш-памятью часто называют не только способ организации ра- боты двух типов запоминающих устройств, но и одно из устройств — «быстрое» ЗУ. Оно стоит дороже и, как правило, имеет сравнительно небольшой объем. Важно, что механизм кэш-памяти является про- зрачным для пользователя, который не должен сообщать никакой информации об интенсивности использования данных и не должен никак участвовать в перемещении данных из ЗУ одного типа в ЗУ дру- гого типа, все это делается автоматически системными средствами. Если кэш-память располагается между микропроцессором и опе- ративной памятью, при обращении процессора к памяти сначала производится поиск необходимых данных в кэш-памяти, выполня- ющей функции буфера между процессором и оперативной памятью. Так как в большинстве случаев эти данные из оперативной памяти предварительно перекачиваются в кэш-память, а время доступа в нее существенно ниже, чем непосредственно в оперативную память, об- щее время доступа к памяти сокращается. Изготавливается такая кэш-память, как правило, на базе микросхем типа SRAM. Кэш-па- мятью комплектуется большинство современных центральных про- цессоров, начиная с Intel 80386 (первоначально кэш-память распо- лагалась не на самом процессоре, как сейчас, а на материнской или на процессорной плате). Различают следующие виды кэш-памяти процессора: • Cache L \ — «кэш-память первого уровня»: промежуточная сверх- оперативная память, как правило находящаяся на самом крис- талле процессора, в которой размещаются наиболее часто исполь- зуемые данные. Работает на частоте процессора. Время доступа к этой памяти существенно меньше, чем к данным в основной оперативной памяти. Этим достигается ускорение работы про- цессора. Из-за ограничений в размерах кристалла процессора и высокого быстродействия этой памяти она имеет небольшую емкость — всего несколько десятков килобайт; • Cache L2 — «кэш-память второго уровня»: промежуточная сверх- оперативная память, имеющая быстродействие ниже памяти пср-
вого уровня, но выше основной оперативной памяти. Ее размер обычно составляет от нескольких сотен килобайт до нескольких мегабайт. Она может выполняться как на том же кристалле, что и процессор, так и в виде отдельных микросхем. В R/SC- процессорах зачастую используется £3-кэш и кэш более высоких порядков; • Cache L3 — «кэш-память третьего уровня»: промежуточная сверх- оперативная память, имеющая быстродействие ниже памяти вто- рого уровня, но выше основной оперативной памяти. Ее размер обычно составляет от одного до нескольких мегабайт. Использу- ется главным образом в серверных процессорах, например Intel Xeon МР. Встречается кэш-память и более высоких уровней (при этом быстродействие памяти каждого последующего уровня меньше каждого предыдущего уровня); • D-Cache — сверхоперативная память, используемая для хранения инструкций процессора. Большинство жестких дисков оснащены собственной кэш-памя- тью размером от нескольких килобайт до нескольких мегабайт (в со- временных жестких дисках — 2, 4, 8, 16 или 32 Мбайт). Дисковая кэш-память (disk cache), или кэш-память жестского диска, — принцип построения кэш-памяти на основе динамического ОЗУ (DRAM), хранящего наиболее часто используемые команды и дан- ные, доступ к которым производится из внешней памяти. Принцип кэширования жесткого диска во многом похож на принцип кэши- рования, используемый для оперативной динамической памяти, хотя способы доступа к диску и памяти сильно различаются. Если время доступа к любой из ячеек оперативной памяти имеет примерно оди- наковое для данного компьютера значение, то время доступа к раз- личным блокам информации на винчестере в общем случае будет различным. Во-первых, нужно затратить некоторое время, чтобы магнитная головка записи-чтения подошла к искомой дорожке. Во- вторых, поскольку при движении головка вибрирует, необходимо время, чтобы она успокоилась. В-третьих, требуется время, чтобы головка нашла искомый сектор. При обращении к оперативной памяти могут читаться или запи- сываться только несколько отдельных байтов, в то время как доступ к диску всегда происходит секторами. Если размер сектора в случае использования любой версии DOS составляет 512 байт, то наимень- ший размер кэш-памяти также должен быть 512 байт. Методы кэши- рования, используемые для оперативной памяти, применяются и для кэширования информации, хранимой на жестких дисках. Поскольку
винчестер является блочно-ориентированным устройством ввода- вывода, то данные передаются блоками определенной длины. Кэш- память диска заполняется не только требуемым сектором, но и сек- торами, непосредственно следующими за ним, так как известно, что в большинстве случаев взаимосвязанные данные хранятся в соседних секторах. Этот метод известен также как метод опережающего чтения (Read Ahead). При работе с многозадачными системами выгодно иметь винчестер с мультисегментной кэш-памятью, которая для каждой из задач отводит свою часть кэша (сегмент). В адаптивной мультисегментной кэш-памяти для повышения производительности число и размеры сегментов могут изменяться. Значительная часть устройств внешней памяти (внешние жесткие диски, приводы CD и DVD), а также периферийные устройства (принтер, сканер) обладают небольшим объемом кэш-памяти (в основном 2, 4, 8 либо 16 Мбайт), что позволяет увеличить скорость доступа к данным Кроме того, кэширование широко распространено и в сетевых технологиях. Механизм, сохранения информации в кэш-памяти При включении микропроцессора в работу вся информация в его кэш-памяти недостоверна. При обращении к памяти микропроцессор сначала проверяет, не содержится ли искомая информация в кэш-памяти. Для этого сформированный им физический адрес сравнивается с адресами ячеек памяти, которые были ранее кэшированы из ОЗУ в кэш-па- мять. При первом обращении такой информации в кэш-памяти, есте- ственно, нет, и это соответствует кэш-промаху. Тогда микропро- цессор проводит обращение к оперативной памяти, извлекает нуж- ную информацию, использует ее в своей работе, но одновременно записывает эту информацию в кэш. Если бы в кэш-память заносилась только востребованная микро- процессором в данный момент информация, то, скорее всего, при следующем обращении вновь произошел бы кэш-промах: вряд ли следующее обращение произойдет к той же самой команде или к тому же самому операнду. Кэш-попадания происходили бы лишь после того, как в КП накопится достаточно большой фрагмент прог- раммы, содержащий некоторые циклические участки кода, или фрагмент данных, подлежащих повторной обработке Для того чтобы уже следующее обращение к КП приводило как можно чаще к кэш-
попаданиям, передача из оперативной памяти в кэш-память проис- ходит не теми порциями (байтами или словами), которые востребо- ваны микропроцессором в данном обращении, а так называемыми строками. То есть кэш-память и оперативная память с точки зрения кэширования организуются в виде строк. Длина строки превышает максимально возможную длину востребованных микропроцессором данных. Обычно она составляет от 16 до 64 байт и выровнена в па- мяти по границе соответствующего раздела (рис. 5.21). Строка кэш-памя-и Востребован ная информация Рис. 5.21. Организация обмена между оперативной и кэш-памятью Высокий процент кэш-попаданий в этом случае обеспечивается благодаря тому, что в большинстве случаев программы обращаются к ячейкам памяти, расположенным вблизи от ранее использованных. Это свойство, называемое принципом локальности ссылок, обеспе- чивает эффективность использования КП. Оно подразумевает, что при исполнении программы в течение некоторого относительно ма- лого интервала времени происходит обращение к памяти в пределах ограниченного диапазона адресов (как по коду программы, так и по данным). Например, микропроцессору для своей работы потребовалось 2 байта информации. Если строка имеет длину 16 байт, то в кэш переписываются не только нужные 2 байта, но и некоторое их окружение. Когда микропроцессор обращается за новой информа- цией, в силу локальности ссылок, скорее всего, обращение про- изойдет по соседнему адресу. Затем опять по соседнему, опять по соседнему и т.д. Таким образом, ряд следующих обращений будет происходить непосредственно к кэш-памяти, минуя опера- тивную память (кэш-попадания). Когда очередной сформирован- ный микропроцессором физический адрес выйдет за пределы строки кэш-памяти (произойдет кэш-промах), будет выполнена подкачка в кэш новой строки, и вновь ряд последующих обраще- ний вызовет кэш-попадания. Чем длиннее используемая при обмене между оперативной и кэш-памятью строка, тем больше вероятность того, что следующее обращение произойдет в пределах этой строки. Но в то же время чем
длиннее строка, тем дольше она будет перекачиваться из оператив- ной памяти в кэш. И если очередная команда окажется командой перехода или выборка данных начнется из нового массива, т.е. сле- дующее обращение произойдет не по соседнему адресу, то время, затраченное на передачу длинной строки, будет использовано на- прасно. Поэтому при выборе длины строки должен быть разумный компромисс между соотношением времени обращения к оператив- ной и кэш-памяти и вероятностью достаточно удаленного перехода от текущего адреса при выполнении программы. Обычно длина строки определяется в результате моделирования аппаратно-про- граммной структуры системы. После того как в КП накопится достаточно большой объем ин- формации, увеличивается вероятность того, что формирование оче- редного адреса приведет к кэш-попаданию. Особенно велика веро- ятность этого при выполнении циклических участков программы. Старая информация по возможности сохраняется в кэш-памяти. Ее замена на новую определяется емкостью, организацией и страте- гией обновления кэша. Типы кэш-памяти Если каждая строка ОЗУ имеет только одно фиксированное место, на котором она может находиться в кэш-памяти, то такая кэш-память называется памятью с прямым отображением. Предположим, что ОЗУ состоит из 1000 строк с номерами от 0 до 999, а кэш-память имеет емкость только 1 00 строк. В кэш-памяти с прямым отображением строки ОЗУ с номерами 0, 100, 200, ..., 900 могут сохраняться только в строке 0 КП и нигде иначе, строки 1, 101, 201, ...,901. ОЗУ — в строке 1 КП, строки ОЗУ с номерами 99, 199, ..., 999, сохраняются в строке 99 кэш-памяти (рис. 5.22). Такая организация кэш-памяти обеспечивает быстрый поиск в ней нужной информа- ции: необходимо проверить ее наличие только в одном месте. Однако емкость КП при этом используется не в полной мере: несмотря на то что часть кэш-памяти может быть не заполнена, будет происходить вытеснение из нее полезной информации при последовательных об- ращениях, например, к строкам 101, 301, 101 ОЗУ. Кэш-память называется полностью ассоциативной, если каждая строка ОЗУ может располагаться в любом месте кэш-памяти. В полностью ассоциативной кэш-памяти максимально исполь- зуется весь ее объем: вытеснение сохраненной в КП информации проводится лишь после ее полного заполнения, Однако поиск в кэш-
ОЗУ Рис. 5.22. Принцип организации кэш-памяти с прямым отображением памяти, организованной подобным образом, представляет собой трудную задачу. Компромиссом между этими двумя способами организации кэш- памяти служит множественно-ассоциативная КП, в которой каждая строка ОЗУ может находиться по ограниченному множеству мест в кэш-памяти. При необходимости замещения информации в кэш-памяти на новую используется несколько стратегий замещения Наиболее известными среди них являются: • LRU — замещается строка, к которой дольше всего не было обра- щений; • FIFO — замещается самая давняя по пребыванию в кэш-памяти строка; • Random — замещение проходит случайным образом. Последний вариант, существенно экономя аппаратные средства по сравнению с другими подходами, в ряде случаев обеспечивает и более эффективное использование кэш-памяги. Предположим, например, что КП имеет объем 4 строки, а некоторый циклический участок программы имеет длину 5 строк. В этом случае при страте- гиях LRU и FIFO кэш-память окажется фактически бесполезной ввиду отсутствия кэш-попаданий. В го же время при использовании стратегии случайного замещения информации часть обращений к КП приведет к кэш-попаданиям. Некоторые эвристические оценки вероятности кэш-промаха при разных стратегиях замещения (в процентах) представлены в табл 5.2.
Таблица 5.2 Вероятность кэш-промаха для различной кэш-памяти Размер кэша, Кбайт Организация кэш-памяти 2-канальная ассоциативная 4-канальная ассоциативная 8-канальная ассоциативная LRU Random LR U Random LRU Random 16 5.2 5.7 4.7 5.3 4.4 5.0 64 1.9 2.0 1.5 1.7 1.4 1.5 256 1.15 1.17 1.13 1.13 1.12 1.12 Анализ таблицы показывает, что- • с увеличением емкости кэша, естественно, уменьшается вероят- ность кэш-промаха, но даже при незначительной на сегодняшний день емкости кэш-памяти в 16 Кбайт около 95% обращений про- исходят к КП, минуя оперативную память; • чем больше степень ассоциативности кэш-памяти, тем больше вероятность кэш-попалания за счет более полного заполнения КП (время поиска информации в КП в данном анализе не учиты- вается); • механизм LRU обеспечивает более высокую вероятность кэш- попадания по сравнению с механизмом случайного замещения Random, однако этот выигрыш не очень значителен. Соответствие между данными в оперативной памяти и в кэш-па- мяти обеспечивается внесением изменений в те области ОЗУ, для которых данные в кэш-памяти подверглись изменениям. Существует два основных способа реализации этих действий: со сквозной за- писью (writethrough) и с обратной записью (write-back). При считывании оба способа работают идентично. При записи кэширование со сквозной записью обновляет основную память па- раллельно с обновлением информации в КП. Это несколько сни- жает быстродействие системы, так как микропроцессор впослед- ствии может вновь обратиться по этому же адресу для записи ин- формации и предыдущая пересылка строки кэш-памяти в ОЗУ окажется бесполезной. Однако при таком подходе содержимое со- ответствующих друг другу строк ОЗУ и КП всегда идентично. Это играет большую роль в мультипроцессорных системах с общей опе- ративной памятью. Кэширование с обратной записью модифицирует строку ОЗУ лишь при вытеснении строки кэш-памяти, например, в случае необ- ходимости освобождения места для записи новой строки из ОЗУ в уже заполненную КП. Операции обратной записи также иниции-
руются механизмом поддержания согласованности кэш-памяти при работе мультипроцессорной системы с общей оперативной памятью. Промежуточное положение между этими подходами занимает способ, при котором все строки, предназначенные для передачи из КП в ОЗУ, предварительно накапливаются в некотором буфере. Передача осуществляется либо при вытеснении строки, как в случае кэширования с обратной записью, либо при необходимости согла- сования кэш-памяти нескольких микропроцессоров в мультипро- цессорной системе, либо при заполнении буфера. Такая передача проводится в пакетном режиме, что более эффективно, чем передача отдельной строки. Организация внутренней кэш-памяти микропроцессора Внутренний кэш 32-разрядного универсального микропроцессора является общим при обращении как к командам, так и к данным. Обращение ведется по физическим адресам. Кэш-память обычно реализуется в виде ассоциативного ЗУ, в ко- тором для каждой строки сохраняются дополнительные сведения, называемые тегом или признаком, в качестве которого выступает адресный код или его часть. Когда в АЗУ подается адрес, с ним од- новременно сравниваются все теги. Внутренняя кэш-память в микропроцессоре i486 реализует сквоз- ную запись. Начиная с МП Pentium, используется сквозная или обратная запись. Во внешней КП применяется любой способ записи или их ком- бинация. Внутренняя кэш-память М П i486 имеет емкость 8 Кбайт и орга- низована в виде 4-канальной ассоциативной памяти. Это означает, что данные из какой-либо строки ОЗУ могут храниться в любой из 4 строк кэш-памяти. КП состоит из следующих блоков (рис. 5.23): • блока данных, • блока тегов; • блока достоверности и LRU. Блок данных содержит 8 Кбайт данных и команд. Он разделен на четыре массива (направления), каждый из которых состоит из 128 строк (см. рис. 5.23). Строка содержит данные из 16 последо- вательных адресов памяти, начиная с адреса, кратного 16. Индекс массивов блока данных, состоящий из 7 бит, соответствует четырем строкам КП, по одной из каждого массива. Четыре строки КП с од- ним и тем же индексом называются множеством.
Блок данных Определяет байты в строке Позиция совпала * В этом блоке информация недостоверна Рис- 5.23, Структура внутренней кэш-памяти МП i486 В блоке тегов имеется один тег длиной 21 бит для каждой строки данных в КП. Блок тегов также разделен на четыре массива по 128 тегов. Тег содержит старшие 21 биг физического адреса дан- ных, находящихся в соответствующей строке КП. В блоке достоверности и LRUсодержится но одному 7-разряд- ному значению для каждого из 128 множеств строк КП: четыре бита достоверности (И, по одному на каждую строку множества, и три бита (50—52), управляющие механизмом LRU. Биты достоверности показывают, содержит строка достоверные (К= 1) или недостоверные (К- 0) данные. При программной очистке КП и аппаратном сбросе процессора все биты достоверности сбрасываются в ноль. Адресация кэш-памяти осуществляется путем разделения стар- ших 28 бит физического адреса на две части. Младшие 7 бит из этих разрядов (разряды 10—4 физического адреса) образуют поле индекса и определяют множество, в котором могут храниться данные. Стар- шие 21 бит (разряды 31—11 физического адреса) служат полем тега и применяются для определения того, находится ли информация с данным физическим адресом в какой-либо строке выбранного множества.
Поиск в кэш-памяти информации с запанным физическим адре- сом выполняется следующим образом. Физический адрес, по кото- рому происходит обращение, разбивается на три поля: Тег, Индекс, № байта. 7 разрядов Л10—Л4 поля индекса определяют одно из 128 множеств. В выбранном множестве содержатся четыре строки с информа- цией. Чтобы определить, присутствует ли нужная информация в одной из строк этого множества, проводится сравнение старших 21 бита физического адреса (поле Тег) с тегами строк выбранного множества. Сравнение проводится только для достоверных строк, т.е. тех, у ко- торых в блоке достоверности установлен бит достоверности V= 1. Если для одной из строк ее тег и разряды /131—/111 физического адреса совпали, то это означает, что произошло кэш-попадание и не- обходимая информация есть в кэш-памяти. Считывается найденная строка из 16 байт. Искомый байт в ней определяется четырьмя младшими разрядами физического адреса (ЛЗ-ЛО). Если на этапе 3 совпадения не произошло или все строки множе- ства недостоверны, эта ситуация определяется как кэш-промах. В этом случае по сформированному микропроцессором физическому адресу выполняется обращение к оперативной памяти. Из ОЗУ из- влекается нужная информация и содержащая ее строка записывается в свободную строку выбранного множества Старшие 21 бит физи- ческого адреса записываются в поле тега этой строки. Если все строки в выбранном множестве достоверны, то замещается строка, к которой дольше всего не было обращений согласно механизму LRU. Этот механизм действует точно так же, как и при вытеснении строк из буфера ассоциативной трансляции TLB Режим работы кэш-памяти определяется программно установкой разрядов CD (запрет кэширования) и NW (запрет сквозной записи) в управляющем регистре С/?0. Кэширование можно разрешить (это состояние после инициализации при сбросе), можно запретить при наличии достоверных строк (в этом режиме КП действует как быстрое внутреннее ОЗУ), или, наконец, кэширование может быть полностью запрещено. Управление работой кэш-памяти на уровне страниц В элементах каталога страниц и таблиц страниц имеются 2 бита, которые применяются для управления выходными сигналами про- цессора и участвуют в кэшировании страниц.
Бит PCD запрещает (PCD =1) или разрешает (PCD = 0) кэширова- ние страницы. Запрещение кэширования необходимо для страниц, которые содержат порты ввода/вывода с отображением на память. Оно также полезно для страниц, кэширование которых не дает вы- игрыша в быстродействии, например страниц, содержащих прог- рамму инициализации. Бит PWTопределяет метод обновления ОЗУ и внешней кэш-па- мяти (кэш 2-го уровня). Если PWT- 1, то для данных в соответству- ющей странице определяется кэширование со сквозной записью; при PWT = 0 применяется способ обратной записи. Используется в микропроцессорах, начиная с Pentium. Так как внутренняя кэш- память в МП i486 работает со сквозной записью, состояние бита PWT на нее не влияет. Бит PWT в этом случае действует только на внешнюю КП. Обеспечение согласованности кэш-памяти микропроцессоров в мультипроцессорных системах Рассмотрим особенности работы кэш-памяти в том случае, когда одновременно несколько микропроцессоров используют общую опе- ративную память (рис. 5.24). В этом случае могут возникнуть проб- лемы, связанные с кэшированием информации из оперативной па- мяти в кэш-память микропроцессоров. Рис. 5.24. Структура мультимикропроцессорной системы с общей оперативной памятью Предположим, что МПЛ считал некоторую строку данных из ОЗУ в свою внутреннюю КП и изменил данные в этой строке в процессе работы. Мы отмечали, что существует два основных механизма обновле- ния оперативной памяти: • сквозная запись, которая подразумевает, что, как только измени- лась информация во внутренней кэш-памяти, эта же информация копируется в то же место оперативной памяти;
• обратная запись, при которой микропроцессор после изменения информации во внутреннем кэше отражает это изменение в опе- ративной памяти не сразу, а лишь в тот момент, когда происходит вытеснение данной строки из кэш-памяти в оперативную. То есть существуют определенные моменты времени, когда информация, предположим, по адресу 2000 имеет разные значения: микропро- цессор ее обновил, а в оперативной памяти осталось старое зна- чение. Если в этот момент другой микропроцессор (МП§), ис- пользующий ту же оперативную память, обратится по адресу 2000 в ОЗУ, то он прочитает оттуда старую информацию, которая к этому времени уже неактуальна. Для обеспечения согласованности (когерентности) памяти в мультипроцессорных системах используются аппаратные меха- низмы, позволяющие решить эту проблему Такие механизмы назы- ваются протоколами когерентности кэш-памяти. Эти протоколы призваны гарантировать, что любое считывание элемента данных возвращает последнее по времени записанное в него значение. Существует два класса протоколов когерентности: • протоколы на основе справочника (directory based): информация о состоянии блока физической памяти содержится только в од- ном месте, называемом справочником (физически справочник может быть распределен по узлам системы); • протоколы наблюдения (snooping): каждый кэш, который содержит копию данных некоторого блока физической памяти, имеет также соответствующую копию служебной информации о его со- стоянии; централизованная система записей отсутствует; обычно кэши расположены на общей шине и контроллеры всех кэшей наблюдают за шиной (просматривают ее), чтобы определять, ка- кие обращения по адресам в пределах этого блока происходят со стороны других микропроцессоров В мультипроцессорных системах с общей памятью наибольшей популярностью пользуются протоколы наблюдения, поскольку для опроса состояния кэшей они могут использовать уже существующее физическое соединение — шину памяти. Для поддержания когерентности применяется два основных ме- тода. Один из методов заключается в том, чтобы гарантировать, что процессор должен получить исключительные права доступа к эле- менту данных перед выполнением записи в этот элемент данных. Этот тип протоколов называется протоколом записи с аннулированием (write invalidate protocol), поскольку при выполнении записи он ан-
нулирует другие копии Это наиболее часто используемый протокол как в схемах на основе справочников, так и в схемах наблюдения. Исключительное право доступа гарантирует, что во время выполне- ния записи не существует никаких других копий элемента данных, в которые можно писать или из которых можно читать: все другие кэшированные копии элемента данных аннулированы. Альтернативой протоколу записи с аннулированием является об- новление всех копий элемента данных в случае записи в этот элемент данных. Этот тип протокола называется протоколом записи с обнов- лением (write update protocol) или протоколом записи с трансляцией (write broadcast protocol). Эти две схемы во многом похожи на схемы работы кэш-памяти со сквозной и с обратной записью. Ключевым моментом реализации в многопроцессорных системах с небольшим числом процессоров как схемы записи с аннулированием, так и схемы записи с обновле- нием данных является использование для выполнения этих операций механизма шины. Для выполнения операции обновления или анну- лирования процессор просто захватывает шину и транслирует по ней адрес, по которому должно производиться обновление или аннули- рование данных. Все процессоры непрерывно наблюдают за шиной, контролируя появляющиеся на ней адреса. Процессоры проверяют, не находится ли в их кэш-памяти адрес, появившийся на шине. Если это так, то соответствующие данные в кэше либо аннулируются, либо обновляются в зависимости от ис- пользуемого протокола. Рассмотрим один из наиболее распространенных протоколов, обеспечивающих согласованную работу кэш-памяти нескольких ми- кропроцессоров и основной памяти в мультимикропроцессорных системах, — протокол MESI, котоцый относится к группе протоко- лов наблюдения с аннулированием. Будем знакомиться с ним на примере двухпроцессорной системы, состоящей из микропроцес- соров А и В Этот протокол использует четыре признака состояния строки кэш-памяти микропроцессора, по первым буквам которых и назы- вается протокол: • измененное состояние (Modified): информация, хранимая в кэш- памяти микропроцессора Л, достоверна только в этом кэше; она отсутствует в оперативной памяти и в кэш-памяти других микро- процессоров; • исключительная копия (Exclusive): информация, содержащаяся в кэше А, содержится еще только в оперативной памяти;
• разделяемая информация (Shared): информация, содержащаяся в кэше А, содержится в кэш-памяти по крайней мере еще одного МП, а также в оперативной памяти; • недостоверная информация (Invalid): в строке кэш-памяти нахо- дится недостоверная информация. Таким образом, состояние признаков потокола MESI отражает следующие состояния (по отношению к МПА) строки кэш-памяти (табл. 5.3). Таблица 5.3 Формирование признаков состояния протокола MESI Состояние признака протокола Состояние строки памяти Кэш Л Кэш В ОЗУ Modified д нд нд Shared д д д Exclusive д нд д Invalid нд X X При работе микропроцессора А с точки зрения обеспечения ко- герентности памяти возможны следующие ситуации: • R//(Read Hit) — кэш-попадание при чтении; • WH (Write Hit) — кэш-попадание при записи; • RME (Read Miss Exclusive) — кэш-промах при чтении; • RMS (Read Miss Shared) — кэш-промах при чтении, но соответ- ствующий блок есть в кэш-памяти другого микропроцессора; • WM ("Write Miss) — кэш-промах при записи; • SHR (Snoop Hit Read) — обнаружение копии блока при прослу- шивании операции чтения другого кэша; • SHW(Snoop Hit Write) — обнаружение копии блока при прослу- шивании операции записи другого кэша. Наибольший интерес здесь представляют две последние позиции. Современные микропроцессоры имеют двунаправленную шину адреса Выдавая информацию на эту шину, микропроцессор адре- сует ячейки оперативной памяти или устройства ввода/вывода. В силу того что в рассматриваемой мультипроцессорной системе микропроцессоры связаны общей шиной, в том числе и шиной ад- реса, принимая информацию по адресным линиям, микропроцессор определяет, было ли обращение по адресам, содержащимся в его кэш-памяти, со стороны других микропроцессоров. При обнаруже- нии такого обращения меняется состояние строки кэш-памяти мик- ропроцессора.
Изменения признака состояния блока кэш-памяти МП в зависи- мости от различных ситуаций в его работе и работе мультимикропро- цессорной системы в целом представлены на рис. 5.25. Рис. 5.25. Л/К57-диаграмма обеспечения когерентности кэш-памяти Проиллюстрируем некоторые из представленных переходов. Пусть блок кэш-памяти находится в состоянии Modified, т.е. до- стоверная информация находится только в кэш-памяти данного МП. Тогда в случае обнаружения при прослушивании адресной шины обращения со стороны другого микропроцессора для чтения инфор- мации по входящим в данную строку адресам микропроцессор дол- жен передать эту строку кэш-памяти в ОЗУ, откуда она уже будет прочитана другим микропроцессором. При этом состояние строки в кэш-памяти рассматриваемого микропроцессора изменится с мо- дифицированного на разделяемое (Shared). Если строка кэш-памяти находилась в состоянии Invalid, т.е. ин- формация в ней была недостоверной, то по отношению к этой строке следует рассматривать только ситуации, связанные с кэш-прома- хами. Так, если произошел кэш-промах при выполнении операции записи, то необходимая строка будет занесена в кэш-память данного МП, в эту строку будут записаны измененные данные и она при- обретет статус исключительного владельца новой информации (Modified).
Контрольные вопросы и задания 1. Опишите принцип работы стека. 2. Постройте структурную схему внутренней кэш-памяти М П i486 и опи- шите принцип работы 3. Опишите механизм сохранения информации в кэш-памяти. 4. Постройте структурную схему подключения микропроцессорных устройств к системной шине 5. Опишите принцип работы внутреннего кэш 32-разрядного универсаль- ного микропроцессора. 6 Постройте классическую структуру связей МПС и опишите принцип ее работы. 7. Опишите структуру микропроцессорной системы. 8 Опишите управление работой кэш-памяти на уровне страниц. 9. Что такое синхронный и асинхронный обмен? Достоинсва и недо- статки. 10. Что такое адресное пространство микропроцессора? 11. Где расположена область старшей памяти (High Memory Area, НМА)? 12. Каково назначение векторов прерываний? 13. Какие способы расширения адресного пространства микропроцессора вы знаете? 14. Что такое страничный метод отображения адресного пространства? 15 Каково назначение сегментного метода отображения адресного про- странства? 16. Каково назначение стековой памями? 17. Что такое кэш-память? Преимущества кэширования. 18. Каковы принципы функционирования кэш-памяти микропроцессора? 19 Какие способы обеспечения согласованности кэш-памяти микропро- цессоров в мультипроцессорных системах вы знаете?
Глава 6 РЕЖИМЫ РАБОТЫ МИКРОПРОЦЕССОРНОЙ СИСТЕМЫ Как уже отмечалось, микропроцессорная система обеспечивает большую гибкость работы, она способна настраиваться на любую задачу. Гибкость эта обусловлена прежде всего тем, что функции, выполняемые системой, определяются программой (программным обеспечением, software), которую выполняет процессор. Аппара- тура (аппаратное обеспечение, hardware) остается неизменной при любой задаче. Записывая в память системы программу, можно за- ставить микропроцессорную систему выполнять любую задачу, под- держиваемую данной аппаратурой. К тому же шинная организация связей микропроцессорной системы позволяет довольно легко за- менять аппаратные модули, например заменять память на новую большего объема или более высокого быстродействия, добавлять или модернизировать устройства ввода/вывода, наконец, заменять процессор на более мощный. Это также позволяет увеличить гиб- кость системы, продлить ее жизнь при любом изменении требова- ний к ней. Но гибкость микропроцессорной системы определяется не только этим. Настраиваться на задачу помогает еще и выбор режима работы системы, т е. режима обмена информацией по системной магистрали (шине). Практически любая развитая микропроцессорная система (в том числе и компьютер) поддерживает три основных режима обмена по магистрали: 1) программный обмен информацией; 2) обмен с использованием прерываний (Interrupts); 3) обмен с использованием прямого доступа к памяти (ПДП, DMA — Direct Memory Access). Программный обмен информацией является основным в любой ми- кропроцессорной системе. Он предусмотрен всегда, без него невоз- можны другие режимы обмена. В этом режиме процессор является единоличным хозяином (или задатчиком, Master) системной маги- страли. Все операции (циклы) обмена информацией в данном случае
инициируются только процессором, все они выполняются строго в порядке, предписанном исполняемой программой. Обмен по прерываниям используется тогда, когда необходима ре- акция микропроцессорной системы на какое-то внешнее событие, на приход внешнего сигнала. В случае компьютера внешним собы- тием может быть, например, нажатие на клавишу клавиатуры или приход по локальной сети пакета данных Компьютер должен реаги- ровать на это соответственно выводом символа на экран или же чте- нием и обработкой принятого по сети пакета. Прямой доступ к памяти (ПДП, DMA) — это режим, принципи- ально отличающийся от двух ранее рассмотренных режимов тем, что обмен по системной шине идет без участия процессора. Внешнее устройство, требующее обслуживания, сигнализирует процессору, что режим ПДП необходим; в ответ на это процессор заканчивает выполнение текущей команды и отключае тся от всех шин, сигнали- зируя запросившему устройству, что обмен в режиме ПДП можно начинать. 6,1. Программный обмен информацией Рассмотрим более подробно программный обмен информацией. Как мы уже выяснили, в этом режиме все операции обмена инфор- мацией выполняются в строгом порядке, предписанном исполня- емой программой. Процессор читает (выбирает) из памяти коды команд и исполняет их, читая данные из памяти или из устройства ввода/вывода, обра- батывая их, записывая данные в память или передавая их в устрой- ство ввода/вывода. Путь процессора по программе может быть ли- нейным, циклическим, может содержать переходы (прыжки), но он всегда непрерывен и полностью находится под контролем процес- сора. Ни на какие внешние события, не связанные с программой, процессор не реагирует (рис. 6.1). Все сигналы на магистрали в дан- ном случае контролируются процессором. Программно управляемая передача данных осуществляется при непосредственном участии и под управлением процессора. Напри- мер, при пересылке блока данных из внешнего устройства в опера- тивную память процессор должен выполнить следующую последо- вательность шагов: 1) сформировать начальный адрес области обмена ОП; 2) занести длину передаваемого массива данных в один из своих внутренних регистров, который будет играть роль счетчика;
Выполнение команд Последовательно Команда 1 Команда 2 Команда 3 Команда Л/ Команда Л/ + 1 Команда N + 2 Команда W + 3 Команда W + 4 Команда W + 5 > Программа Рис. 6.1. Программный обмен информацией 3) выдать команду чтения информации из внешнего устройства (ВУ); при этом на шину адреса из МП выдается адрес ВУ, на шину управления — сигнал чтения данных из ВУ, а считанные данные за- носятся во внутренний регистр МП; 4) выдать команду записи информации в ОП; при этом на шину адреса из МП выдается адрес ячейки оперативной памяти, на шину управления — сигнал записи данных в ОП, а на шину данных вы- ставляются данные из регистра МП, в который они были помещены при чтении из ВУ; 5) модифицировать регистр, содержащий адрес оперативной па- мяти; 6) уменьшить счетчик длины массива на длину переданных дан- ных; 7) если переданы не все данные, то повторить шаги 3—6, в про- тивном случае закончить обмен. Как мы видим, программно управляемый обмен ведет к нерацио- нальному использованию мощности микропроцессора, который вынужден выполнять большое количество относительно простых операций, приостанавливая работу над основной программой. При этом действия, связанные с обращением к оперативной памяти и к внешнему устройству, обычно требуют удлиненного цикла работы микропроцессора, что приводит к еще более существенным потерям производительности.
6.2. Система прерываний Для обработки событий, происходящих асинхронно по отноше- нию к выполнению программы, лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое осо- бое событие в системе, требующее моментальной реакции. Напри- мер, хорошо спроектированные системы повышенной надежности используют прерывание по аварии в питающей сети для выполнения процедур записи содержимого регистров и оперативной памяти на магнитный носитель, с тем чтобы после восстановления питания можно было бы продолжить работу с того же места. Существует несколько видов экстраординарных ситуаций, в кото- рых поведение процессора регламентируется особыми правилами. Такие ситуации возникают, когда требуется срочная реакция на внешние воздействия, когда при выполнении программы проис- ходит какая-либо ошибка или существует вероятность получения неточного результата вычислений. В общем случае все эти ситуации разделяются по принципу их обнаружения, источнику возникновения и реакции на них на следу- ющие три категории. 1 Прерывания и особые ситуации (Interrupts and Exceptions) — об- наруживаются и обрабатываются процессором в самые различные моменты времени и могут происходить как из внешних, так и из внутренних источников; все другие типы экстраординарных ситуаций занимают более низкий уровень иерархии и могут обраба- тываться, только если сперва заявят о своем существовании через прерывание или особую ситуацию. 2. Исключительные ситуации FPU (Floating-Point Exceptions) — мо- гут возникать только при выполнении команд сопроцессора, команд ММХ или 3/эМлг!-комапд. Возникновение исключительной си- туации FPU, в свою очередь, может вызывать генерацию прерывания через подачу сигнала на специальные внешние выводы процессора (так называемая реакция в стиле MS-DOS) или особой ситуации (внутренний механизм процессора обеспечивает генерацию ошибки сопроцессора #MF), обработчик которой далее сам разбирается с тем, какое исключение произошло и какие действия в связи с этим следует предпринять. 3. Исключительные ситуации SIMD (SSE) (SIMD Floating-Point Exceptions) — могуч возникать только при выполнении SIMD-команд и полностью определяются состоянием 57Л7/)-регистров процессора. SIMD-исключения сообщают о своем возникновении через генера-
цию специальной особой ситуации #ХМ. Получив управление, об- работчик особой ситуации должен сам программным путем опреде- лить причину возникновения исключения Прерывания и особые ситуации Прерывания и особые ситуации (Interrupts and Exceptions) — это специальные средства, обеспечивающие быструю реакцию процес- сора на внешние воздействия и прочие неожиданные ситуации. При поступлении прерывания или генерации особой ситуации выполне- ние программы прерывается, а управление передается специальной процедуре — обработчику прерывания или особой ситуации. В боль- шинстве случаев, когда обработка прерывания или особой ситуации заканчивается, управление может быть возвращено в прерванную программу, которая продолжит свое выполнение с той самой точки, в которой она была остановлена. Процессор производит автомати- ческое сохранение/восстановление контекста и состояния для обес- печения этой возможности. Все прерывания и особые ситуации имеют уникальные иденти- фикационные номера. Эти номера называются векторами прерыва- ний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользова- тельскими программами и внешними устройствами. Существует два источника поступления прерываний и три типа особых ситуаций. Кроме того, различают внутренние (программные) и внешние (аппаратные) источники генерации прерываний и особых ситуаций. Внешние или аппаратные прерывания (External or Hardware inter- rupts); 1) внешние маскируемые прерывания (Maskable Hardware Inter- rupts) — инициируются сигналами на внешних выводах процессора или с помощью встроенного контроллера прерываний (Advanced Programmable Interrupt Controller — AP1C). Для пропессоров, начи- ная с Pentium, встроенный ЛРУС-контроллер является наиболее рас- пространенным способом управления прерываниями В этом случае выводы Е/А7]1:0]# программируются через локальную таблицу век- торов (LVT) контроллера APIC, которая позволяет назначать соот- ветствующий вывод для приема любого вида прерываний. Если же встроенного контроллера APIC в процессоре нет или же он отключен, то внешние маскируемые прерывания принимаются на выводе
INTR#. При этом номер поступившего прерывания должен переда- ваться процессору по системной шине специальным внешним контроллером прерываний (например, таким как 8259/1). Как пра- вило, встроенный ЛР/С-контроллер также взаимодействует с систем- ным контроллером прерываний (I/O APIC), который обеспечивает прием множества прерываний от разных источников и передает в процессор(ы) информацию о полученном прерывании по систем- ной шине или специальной выделенной шине APIC (APIC serial bus). Если флаг разрешения прерываний не установлен (EFLAGS.IF = 0), то внешние маскируемые прерывания не обрабатываются. Выше указывалось, что для использования маскируемыми прерываниями предназначены векторы от 32 до 255. Технически, однако, возможно определить любому маскируемому прерыванию, которое принима- ется на выводе INTR# процессора, значение вектора в диапазоне от 0 до 255, а если прием прерываний происходит через встроенный /1Е/С-контроллер — в диапазоне от 16 до 255 (при попытке исполь- зования векторов от 0 до 15 /1/7С-контроллер сигнализирует о некор- ректном векторе прерывания); 2) внешние немаскируемые прерывания (Nonmaskable External In- terrupts) — принимаются на выводе NMI# процессора или внут- ренней шине /1 /VC-контроллсра, механизм запрета немаскируемых прерываний отсутствует (на них не влияет текущее значение флага EFLAGS.IF). Получив запрос на немаскируемое прерывание, про- цессор передает управление по вектору 2 и блокирует прием новых запросов на немаскируемые прерывания вплоть до выполнения ко- манды IRET/IRETD Технически вектор прерывания 2 может ис- пользоваться и для обрабтки маскируемых прерываний, но только описанный выше способ поступления запросов на немаскируемые прерывания обеспечивает особое поведение процессора при их об- работке. Программные прерывания и особые ситуации (Software interrupts and Exceptions): 1) генерируемые процессором особые ситуации (Program-Error Ex- ceptions) — возникают в процессе и по результатам выполнения прог- раммного кода, разделяются на ошибки, ловушки и сбои Каждая особая ситуация генерируется по набору определенных условий, и ей соответствует строго определенный вектор прерывания в диапазоне от 0 до 31. Зачастую при генерации таких особых ситуаций процессор сохраняет в стеке не только адрес возврата из прерывания, но и спе- циальный код ошибки, который позволяет обработчику детально понять причину ошибки, внести коррективы и перезапустить ко-
манду, если это возможно. Для обозначения особых ситуаций при- нято использовать специальные мнемонические обозначения (#DE, #DB и т.д.). Полный перечень всех особых ситуаций, поддержива- емых разными моделями процессоров, приведен в табл. 6.1; 2) программные прерывания и особые ситуации (Software-Generated Interrupts and Exceptions) — могут быть вызваны командами INTO, INT 3, INTOl, INT п. BOUND При этом только команду INT п пра- вильно относить к командам вызова программных прерываний (Soft- ware-Generated Interrupts). Команды INTO, INT 3, BOUND и INT01 по сути являются командами программной генерации особых си- туаций (Software-Generated Exceptions). Например, команда INT40 генерирует прерывание, передавая управление по вектору номер 40, а команда BOUND edi, [есх] может сгененрировать особую ситуацию нарушение границ (#ВВ). В качестве непосредственного операнда команды INT п могут использоваться любые векторы прерываний от 0 до 255 То есть она может использоваться в том числе и для про- граммной эмуляции любых особых ситуаций с векторами от 0 до 31. В этом случае, однако, не происходит записи в стек кода ошибки (как это может иметь место в случае генерации особой ситуации ап- паратными средствами контроля функционирования процессора). Обработчик особой ситуации, который предполагает, что процессор всегда генерирует и помещает в стек предусмотренный код ошибки, не сможет правильно обработать программный вызов командой INT п, так как выберет из стека некорректное значение адреса воз- врата для указателя команд EIP. Кроме того, существуют опреде- ленные отличия в обработке программных прерываний и прог- раммных особых ситуаций в режиме F86; 3) особые ситуации, генерируемые средствами самопроверки про- цессора (Machine-Check Exceptions) — реализованы в процессорах, начиная с Pentium. Условия генерации и типы таких особых ситуаций зависят от модели процессора. Для их обработки используется вектор прерывания 18. Типы особых ситуаций и особенности их обработки Особые ситуации, генерируемые процессором, подразделяются на три типа — ошибки, ловушки и сбои. В зависимости от типа осо- бой ситуации различается реакция процессора на ее возникновение, Ошибка (Fault) — это особая ситуация, которая может быть ис- правлена обработчиком особой ситуации. При встрече ошибки со- стояние процессора сохраняется в том виде, каким оно было до на- чала выполнения команды, инициировавшей генерацию ошибки,
262 Таблица 6.1 Тилы поерываний и особых ситуаций Название Номер Мнемо- ника Тип Источник возникновения Генериру- ется ли код ошибки? Процессор, в котором впервые по- явилось 1 2 3 4 5 6 7 Деление на нуль 0 #DE Ошибка Команды DIV. IDIV и команда ААМ с нулевым непосредственным опе- рандом Нет 8086 Прерывание от- ладки 1 #DB Ошибка/ Ловушка Любые Нет 8086 Н емаскируемое прерывание 2 NMI Прерывание Сигнал на выводе NMI# или внут- ренней шине A PIC-контроллера Нет 8086 Точка останова 3 #ВР Ловушка Команда INT3 Нет 8086 Переполнение 4 #OF Ловушка Команда IN ГО Нет 8086 Нарушение границ 5 #BR Ошибка Команда BOUND Нет 80186 Неопределенный код операции 6 #UD Ошибка Команда UD2, зарезервированные коды операций, некорректные ко- манды Нет lntel286 Сопроцессор отсут- ствует 7 #NM Ошибка Команды FPU, команда WAIT/ FWA1T', команды MMX, 3DNow\, S/MD, котла CRU TS= T nCR0EM=0 Нет Intel286
Продолжение табл. 6.1 1 2 3 4 5 6 7 Двойная ошибка 8 #DF Сбой Любые команды, для которых могут генерироваться особые ситуации, маскируемые и немаскируемые пре- рывания Да (всегда нуль) Intel286 Превышение сег- мента сопроцессо- ром — в Intel486 ... зарезервировано 9 Сбой Команды FPU, обращающиеся к па- мяти Нет только Intel286 Intel386 Неправильный TSS1 10 #TS Ошибка Переключение задачи или доступ к сегменту TSS Да Intel286 Сегмент не присут- ствует* 11 #NP Ошибка Загрузки сегментных регистров или попытки доступа к системным сег- ментам (код, данные, стек, LDT, TSS) Да Intel286 Ошибка стека 12 #SS Ошибка Стековые операции и загрузки сег- ментного регистра 55 Да Intel286 Общая защита 13 #GP Ошибка/ Ловушка Любые ссылки на код или данные и иные операции, предусмотренные механизмом защиты Да Intel286 Страничная ошибка* 14 #PF Ошибка Любые ссылки на код или данные в памяти Да (спец, формат) lntel386 Зарезервировано 15
Окончание табл. 6.1 1 2 3 4 5 6 7 Ошибка сопроцес- сора 16 #MF Ошибка Команды FPU, команда WAIT/ FWAIT. команды ММХ, 3DNowl, SIMD яри наличии отложенных исключений FPU, когда САО. TS = 0 и CR0.EM = 0 Нет Intel286 Контроль выравни- вания* 17 #АС Ошибка Любые невыравненные ссылки на данные в памяти, если активиро- ван контроль выравнивания (CR0.AM= 1, EFLAGS.AC = 1, CPL = 3) Да (всегда нуль) Intel486 Контроль машины 18 #МС Сбой Зависит от модели Зависит от модели Penium 57Л/О-исключение 19 #ХМ Ошибка Команды SIMD (SSE) Нет Pentium III Зарезервировано 20-31 Прерывания поль- зователя 32-255 — Прерывание Внешние прерывания или команда INTn Нет 8086 Указанные особые ситуации генерируются только в защищенном режиме и режиме Р86.
а значения CS' EIP, указывающие на эту команду, сохраняются в стеке обработчика. Прерванная программа после исправления ошибки может быть продолжена непосредственно с команды, вы- звавшей эту ошибку Ловушка (Trap) — особая ситуация, которая генерируется после выполнения соответствующей команды. В этом случае сохраняемые в стеке значения CS EIP указывают на команду, которая будет вы- полняться вслед за командой, вызвавшей ловушку; например, если ловушка произошла во время команды JMP, то сохраненные значе- ния CS EIP указывают на команду, являвшуюся целью команды JMP. Сбой (Abort) — это особая ситуация, которая не допускает точную локализацию вызвавшей ее команды и не допускает перезапуска. Сбои используются для сообщений о некоторых ошибках, таких как технические неисправности и наличие некорректных значений в системных таблицах. Правила функционирования механизма обработки прерываний и особых ситуаций существенно зависят от режима работы процес- сора и текущих установок некоторых флагов в регистре CRA (табл. 6.2). Сам этот механизм включает следующие элементы: • таблица дескрипторов прерываний IDT (в режиме реальной адре- сации — таблица векторов прерываний IVT)', • регистр таблицы дескрипторов прерываний IDTR, • флаг маскирования внешних прерываний EFLAGS.IF', • флаги для работы с виртуальными прерываниями EFLAGS, VIF, EFLAGS. VIP', • специальная таблица — карта перенаправления прерываний IRB — располагается в сегменте TSS задачи; • специальные типы дескрипторов шлюзов. Прерывания и особые ситуации: реальный режим В режиме реальной адресации поддерживается гораздо меньше прерываний и особых ситуаций, чем в защищенном режиме. Их об- работка в современных процессорах производится совершенно ана- логично тому, как это делалось в процессоре 8086. Специальная таблица (рис. 6.2), называемая таблицей векторов прерываний (Interrupt Vector Table — 1VT) или просто таблицей пре- рываний, размещается в памяти по нулевому адресу (по умолчанию). Каждому вектору прерывания или особой ситуации в этой таблице соответствует 32-битное поле, которое содержит дальний указатель на процедуру-обработчик. Процессор автоматически выбирает из па-
Таблица 6.2 Способы обработки процессором прерываний и особых ситуаций в различных режимах работы Режим работы процессора Тип прер. CR0.PE VM CRA.VME CR4.PVI 1OPL IRB IDT IVT Режим реальной адресации П 0 0 X X 0 X — + А, О 0 0 X X 0 X — + Защищенный режим П 1 0 X 0 X X + — А, О 1 0 X 0 X X + — Защищенный режим с под- держкой виртуальных флагов прерываний (CR4.PVI- 1) П 1 0 X 1 X X + — А, О 1 0 X 1 X X + — Режим V86 (CPL = 3,CR4.VME=0) П 1 1 0 X = 3 X + — П 1 1 0 X <3 X #GP(0) — А, О1 1 1 0 X X X + — Режим EVS6 (CPL = 3,CR4.VME= 1) П 1 1 1 X X 0 — + П 1 1 1 X = 3 1 + — П 1 1 1 X <3 1 #GP(0) — А, О' 1 1 1 X X X + — х — Флаг или битовое поле может иметь любое значение. ч— Возможное событие (переход к обработчику прерывания в соответствующем режиме). 1 — Включая особые ситуации, генерируемые командами INTO, INT3, INTQ\, BOUND.
Вектор прерывания О Рис. 6.2. Таблица векторов прерываний в реальном режиме работы мяти соответствующий указатель при поступлении прерывания или генерации особой ситуации, затем сохраняет в стеке текущие значе- ния FLAGS, CS, IP, очищает биты IF, TF, АС регистра FLAGS и пере- дает управление по считанному адресу (рис. 6.3). Рис. 6.3. Стек после вызова прерывания или особой ситуации в реальном режиме работы Начальный адрес таблицы векторов прерываний по умолчанию устанавливается нулевым. Но в процессорах, начиная с lntel286, он может быть переопределен путем программирования регистра IDTR с помощью команды LIDT. На практике для сохранения совмести- мости с программным обеспечением процессоров 8G86/8088 такое переопределение обычно не использовалось. Если при обработке поступившего запроса на прерывание при записи значений в стек процессор превышает предел стекового сег- мента, то согласно документации Intel должно генерироваться пре- рывание 12. Однако на практике некоторые модели процессоров в такой ситуации могут вести себя иначе. Когда при поступлении
запроса на прерывание значение в регистре стека (E)SP равно 1, 3 или 5, возможна полная остановка процессора (переход в режим останова, аналогично тому, как это происходит по команде HLT). Работа механизма реакции на прерывания и особые ситуации в защищенном режиме базируется на специальной таблице дескрип- торов прерываний (Piotected-Mode Interrupt Descriptor Table — IDT). Базовый адрес (BASE) этой таблицы и ее предел {LIMIT) заносятся в регистр IDTR с помощью команды LIDT(рис. 6.4). Таблица IDTсодержит до 256 специальных дескрипторов, каждый из которых соответствует своему прерыванию. Эти дескрипторы за- нимают по 8 байт каждый и располагаются в таблице последова- тельно без каких-либо промежутков. Самый первый дескриптор, расположенный по самому младшему адресу в начале таблицы, со- ответствует прерыванию 0, а самый последний дескриптор, распо- ложенный по самому старшему адресу в таблице, соответствует пре- рыванию 255. Рис. 6.4. Таблица дескрипторов прерываний (IDT) в защищенном режиме работы В качестве дескрипторов таблицы IDTмогут использоваться де- скрипторы разного типа — шлюза прерывания, шлюза ловушки и шлюза задачи. Поведение процессора при поступлении запроса на прерывание зависит как от типа применяемого для данного пре- рывания дескриптора, так и от текущего уровня привилегий задачи.
В случае если в качестве дескриптора прерывания используется шлюз задачи, процессор при поступлении запроса на прерывание выполняет все действия по переключению на новую задачу, сохраняя текущее состояние в TSS старой задачи и загружая новые значения в регистры из TSS задачи обработчика прерывания. Применение та- кого шлюза оправдано для обработки ошибок и сбоев, которые не могут быть обработаны в рамках текущей задачи (например, ошибки, возникающие при переключении задач). Если в качестве дескриптора прерывания используется шлюз ло- вушки или шлюз прерывания, то переключения задач не происходит и программа-обработчик функционирует в рамках той же задачи, что и прерванный код. Отличие шлюза прерывания состот лишь в том, что процессор автоматически сбрасывает флаг EFLAGS.TF при пере- даче управления в обработчик, чем обеспечивается маскирование внешних прерываний. Впоследствии при возврате из процедуры об- работчика прежнее значение регистра EFLAGS восстанавливается из стека. Особенности работы процессора при передаче управления обработчику прерываний защищенного режима Механизм защиты для прерываний в защищенном режиме функ- ционирует практически таким же образом, как это происходит при выполнении команды вызова подпрограммы CALL. Некоторые осо- бенности его работы заключаются в следующем: • процессор не проверяет текущий уровень привилегий CPL для внешних прерываний; • поскольку для прерываний не существует отдельного селектора, то все правила для запрашиваемого уровня привилегий селектора (RPL) игнорируются; • процессор проверяет уровень привилегий DPL шлюза только для программных прерываний, генерируемых командами INT п, 1NT3, INTO, с тем чтобы предотвратить генерацию таких преры- ваний, если CPL > DPL. Если обработчик прерывания защищенного режима (Protected - mode Exception and Interrupt Handler) будет расположен в согласо- ванном кодовом сегменте, то ему при получении управления будет доступен только сегмент стека и те сегменты, привилегии которых позволяют это. Если же обработчик будет размещен в несогласован- ном кодовом сегменте с нулевым уровнем привилегий, то незави- симо от CPL прерванной программы ему будут доступны все сег- менты.
При поступлении запроса на прерывание процессор сохраняет текущие, значения EFLAGS, CS и EIP в стеке Если для обрабатыва- емого прерывания предусмотрена генерация кода ошибки, то этот код сохраняется в стеке сразу после значения EIP. Когда передача управления в обработчик связана с изменением уровня привилегий на более высокий (меньшее числовое значение), это сопровождается переключением стека. Новые значения для SS и ESP берутся из TSS задачи в соответствии с уровнем привилегий обработчика. Переключение стека производится до сохранения ука- занных выше регистров, причем в новом стеке в первую очередь со- храняются значения SS и ESP, указывающие на старый стек (рис. 6 5). Уровено привилегий не изменяется нет кода ошибки Уровень привилегии не изменяется, Рис. 6.5. Стек после вызова прерывания или особой ситуации в защищенном режиме При передаче управления в обработчик через шлюз прерывания или шлюз ловушки процессор сбрасывает флаги EFLAGS.TF, EFLAGS.RFm EFLAGS.NT, чтобы отключить трассировку прерываний и некоторые особенности обработки вложенных задач. Кроме того, при использовании шлюза прерывания сбрасывается также и флаг разрешения прерываний EFLAGS.1F. Стек процессора Intel 2X6 после вызова прерывания или особой ситуации заполняется аналогично, за исключением того, что сохра- няемые значения — 16-битные.
Процессоры Intel386 и Intel486 сохраняют код ошибки в стеке как 16-битное значение, а процессоры, начиная с Pentium, сохраняют его как 32-битное значение с нулевыми старшими битами. Режим с поддержкой виртуальных флагов прерываний В процессорах, начиная с Pentium, возможен специальный под- вид защищенного режима с поддержкой виртуальных флагов прерыва- ний (Protected-mode Virtual Interrupts), который включается уста- новкой флага CRA.PVI. В этом режиме процессор обеспечивает авто- матическую поддержку отслеживания запросов от внешних маскируемых источников прерываний для задач, выполняемых на уровне привилегий CPL = 3 при EFLAGS.IOPL < 3. Для обеспе- чения такой поддержки применяются специальные флаги VLF и VIP в регистре EFLAGS. Этот механизм во многом похож на режим £Р86, который, в свою очередь, предназначен для работать! с виртуаль- ными прерываниями в режиме И86. В обычном защищенном режиме (CR4.PVI = 0), когда EFLAGS. IOPL < CPL, все попытки изменения флага EFLAGS.IF командами STI, CL1 вызывают генерацию ошибки общей защиты (#GP). Когда же виртуальные прерывания инициализированы (CR4.PVI = = 1), команды CL1 и ST1 оказывают влияние на флаг EFLAGS. V1F, а флаг EFLAGS.//’при этом остается неизменным. При поступлении внешнего маскируемого прерывания процессор производит стан- дартное обращение к обработчику прерываний защищенного режима (процедура этого обращения описана выше). Обработчик прерыва- ния должен произвести анализ флага EFLAGS. VLF и в зависимости от его значения произвести следующие действия. • если в момент поступления запроса на прерывание EFLAGS. VIF= = 1, значит, прерывания были разрешены в программе уровня привилегий 3 — обработчик защищенного режима может либо сам обработать это прерывание, либо передать управление в со- ответствующий обработчик в прерванной задаче, эмулируя по- ступление соответствующего внешнего прерывания; • если в момент поступления запроса на прерывание EFLAGS. VIF= = 0, значит, прерывания были запрещены в программе уровня привилегий 3, обработчик защищенного режима может сам обра- ботать поступившее прерывание, но если это необходимо делать внутри программы уровня привилегий 3, обработчик защищен- ного режима устанавливает специальный флаг отложенного пре- рывания EFLAGS. V1P и возвращает управление в прерванную программу
Если при выполнении программы уровня привилегий 3 процес- сор разрешает прием внешних маскируемых прерываний, устанав- ливая флаг EFLAGS.VIF (например, командой STT), а флаг EFLAGS. VIP = = 1, то перед установкой флага EFLAGS. VIF срабатывает вызов отложенного прерывания и генерируется ошибка общей защиты (#GP). Обработчик ошибки общей защиты должен распознавать та- кие ситуации и соответствующим образом обрабатывать посту- пившие запросы на прерывание. Рекомендуемая последовательность его действий перед возвратом управления в прерванную программу: очистка флага EFLAGS. VLP и установка флага EFLAGS. VIF в сохра- ненном в стеке образе регистра EFLAGS', возврат управления в пре- рванную программу. В некоторых редких случаях флаги EFLAGS. VIP и EFLAGS. VLFмо- гут оказаться установленными одновременно (например, командой IRETD или на уровне привилегий, отличном от 3). Тогда перед вы- полнением очередной команды программы уровня привилегий 3 генерируется ошибка общей защиты (#GP). Таким образом, флаг EFLAGS. VLP никогда автоматически не из- меняется процессором, а должен устанавливаться и сбрасываться программным обеспечением самостоятельно. Текущие значения флагов EFLAGS. VIF и EFLAGS. VIP никак не влияют на работу процессора на уровне привилегий, отличном от 3. Команды POPF/POPFD и PUSHF/PUSHFD выполняются при ак- тивированном механизме виртуальных прерываний защищенного ре- жима (CRA.PVI= 1) точно также, как и без него (CRA.PVI= 0). Обработка прерываний в режиме V86 очень похожа на то, как это происходит в защищенном режиме. Однако сушествуют некоторые особенности, вызванные прежде всего спецификой режима /86 и стремлением достичь максимальной совместимости с программами процессора 8086. Специальный механизм виртуальных прерываний, управляемый битом CRA.VMEw реализуемый в процессорах, начиная с Pentium, дополняет возможные способы обработки прерываний в режиме /86. 6.3. Прямой цоступ к памяти Альтернативой программно управляемому обмену служит прямой доступ к памяти — способ быстродействующего подключения внеш- него устройства, при котором оно обращается к оперативной памяти, не прерывая работы процессора. Такой обмен происходит под управ-
лением отдельного устройства — контроллера прямого доступа к па- мяти (КПДП). Операция ПДП сводится к пересылке информации из устройства ввода/вывода в память или же из памяти в устройство ввода/вывода. Когда пересылка информации будет закончена, процессор вновь возвращается к прерванной программе, продолжая ее с той точки, где его прервали. Это похоже на режим обслуживания прерываний, но в данном случае процессор не участвует в обмене. Как и в случае прерываний, реакция на внешнее событие при ПДП существенно медленнее, чем при программном режиме. Контроллер прямого доступа к памяти должен осуществлять пол- ноценный обмен по системной магистрали без всякого участия про- цессора. Причем процессор предварительно должен сообщить этому контроллеру ПДП, откуда ему следует брать информацию и/или куда ее следует помещать. Контроллер ПДП может считаться специали- зированным процессором, который отличается тем, что сам не участ- вует в обмене, не принимает в себя информацию и не выдает ее (рис 6.6). Информационные потоки в режиме ПДП представлены на рис. 6.7. Выполнение команд Команда 1 Команда 2 Команда 3 Запрос ПДП Команда N Точка остановки на время ПДГ Команда /V + 1 Команда N + 2 Команда N + 3 Команда N + 4 Команда W + 5 > Программа Продолжение в п11 ioj । не н ия команд Рис. 6.6. Обслуживание ПДП В принципе контроллер ПДП может входить в состав устройства ввода/вывода, которому необходим режим ПДП, или даже в состав нескольких устройств ввода/вывода. Теоретически обмен с помощью прямого доступа к памяти может обеспечить более высокую скорость передачи информации, чем программный обмен, так как процессор передает данные медленнее, чем специализированный контроллер
Системная магистраль Рис. 6.7. Информационные потоки в режиме ПДП ПДП. Однако на практике это преимущество реализуется далеко не всегда. Скорость обмена в режиме ПДП обычно ограничена воз- можностями магистрали. К тому же необходимость программного задания режимов контроллера ПДП может свести на нет выигрыш от более высокой скорости пересылки данных в режиме ПДП. По- этому режим ПДП применяется редко. Если в системе уже имеется самостоятельный контроллер ПДП, то это может в ряде случаев существенно упростить аппаратуру устройств ввода/вывода, работающих в режиме ПДП. В этом, пожа- луй, состоит единственное бесспорное преимущество режима ПДП. Схема включения К.ПДП в состав микропроцессорной системы представлена на рис. 6 8. Рис. 6.8. Структура МПС с контроллером прямого доступа к памяти Перед началом работы контроллер ПДП необходимо инициали- зировать: занести начальный адрес области ОП, с которой произво- дится обмен, и длину передаваемого массива данных. В дальнейшем но сигналу запроса прямого доступа контроллер фактически выпол- няет все те действия, которые обеспечивал микропроцессор при программно управляемой передаче.
Последовательность действий КПДП при запросе на прямой до- ступ к памяти со стороны внешнего устройства следующая. 1. Принять запрос на ПДП (сигнал DRQ) от ВУ. 2. Сформировать запрос к МП на захват шин (сигнал HRQ). 3. Принять сигнал от МП HILDA), подтверждающий факт пере- вода микропроцессором своих шин в третье состояние 4. Сформировать сигнал, сообщающий устройству ввода/вывода о начале выполнения циклов прямого доступа к памяти (DACK). 5. Сформировать на шине адреса компьютера адрес ячейки па- мяти, предназначенной для обмена. 6. Выработать сигналы, обеспечивающие управление обменом (IOR, Л/Ждля передачи данных из ВУ в оперативную память и IOW, MR — для передачи данных из оперативной памяти в ВУ). 7. Уменьшить значение в счетчике данных на длину переданных данных. 8. Проверить условие окончания сеанса прямого доступа (обну- ление счетчика данных или снятие сигнала запроса на ПДП). Если условие окончания не выполнено, то изменить адрес в регистре те- кущего адреса на длину переданных данных и повторить шаги 5—8. Прямой доступ к памяти позволяет осуществлять обмен данными между внешним устройством и оперативной памятью параллельно с выполнением процессором программы. Структура КПДП пред- ставлена на рис. 6.9. Контроллер состоит из четырех идентичных каналов, позволя- ющих подключить к системе до четырех устройств, работающих в ре- жиме ПДП. В состав каждого канала входят следующие регистры: 1) MR (Mode Register) —регистррежима. Определяет следующие параметры передачи: • порядок изменения (увеличения или уменьшения) адреса ОП при передаче; • возможность автоинициализации; • режим обслуживания: • одиночная передача (контроллер возвращает магистраль процес- сору после каждого цикла ПДП); • блочная передача (контроллер владеет магистралью в течение пе- редачи всего массива); • по требованию (окончание передачи определяется снятием сиг- нала DRQ или подачей сигнала IEOP на внешний вход КПДП); • каскадирование; 2) CAR (Current Address Register) — регистр текущего адреса',
DRQO DACKO DROP DACKI DRQ2 DACK2 DRQ3 DACK3 Рис. 6.9. Структура контроллера прямого доступа к памяти 3) BAR (Base Address Register) — базовый регистр адреса'. 4) CWR (Current Word Register) — текущий счетчик данных', 5) WCR (Word Control Register) — базовый счетчик данных. Значения в регистрах BAR и WCR устанавливаются при инициа- лизации и в ходе циклов ПДП не меняются. В регистры CAR и CWR в начале выполнения ПДП заносятся значения из регистров BAR и WCR соответственно. При выполнении ПДП эти регистры изме- няются. Управляющие регистры, общие для всего контроллера: 1) CR (Command Register) — регистр команд, определяет: • режим память—память или обычный. В режиме память/память осуществляется обмен по схеме ПДП между двумя областями ОП (только для каналов 0 и 1) с использованием буферного регистра TR (Temporary Register); • запрет/разрешение ПДП; • порядок изменения приоритетов каналов. • фиксированный приоритет; • циклическое изменение приоритета после обработки запроса на ПДП по одному из каналов; • явное указание наиболее приоритетного канала; • уровень сигналов DRQ и DACK (настройка на активный уровень сигналов под особенности работы внешних устройств);
2) SR (Status Register) — регистр условий, используется для фик- сации признаков обмена по каждому из каналов и программных за- просов на ПДП. Во избежание ложных срабатываний внешних устройств, не ис- пользующих в данный момент режим прямого доступа, контроллер ПДП во время режима ПДП вырабатывает сигнал AEN, который блокирует работу остальных внешних устройств: AEN = 1 — шиной управляет контроллер ПДП; 2 — шиной управляет М П или другой задатчик. Для увеличения количества внешних устройств, которые могут быть подключены к микропроцессору в режиме ПДП, используется каскадное включение КПДП (рис. 6.10). канал О канал 1 канал 2 канал 3 Рис. 6.10. Каскадное включение контроллеров прямого доступа к памяти При этом ведомый КПДП подключается к одному из каналов ве- дущего контроллера по схеме подключения внешнего устройства, а непосредственно с микропроцессором связывается только ведущий контроллер. В стандартной конфигурации персональной ЭВМ при- меняются два КПДП (ведущий и ведомый), которые позволяют под- ключить до семи внешних устройств, причем два канала закреплены за накопителями на жестком и гибком дисках. В максимальной конфигурации при использовании ведущего и четырех ведомых КПДП, подключенных к каждому из каналов ве- дущего, к МП можно подключить до 16 внешних устройств, работа- ющих в режиме ПДП. 6.4. Функции устройств ввода/вывода Устройства ввода/вывода обмениваются информацией с маги- стралью по тем же принципам, что и память. Наиболее существенное
отличие с точки зрения организации обмена состоит в том, что мо- дуль памяти имеет в адресном пространстве системы много адресов (до нескольких десятков миллионов), а устройство ввода/вывода обычно имеет немного адресов (обычно до десяти), а иногда и всего один адрес. Но модули памяти системы обмениваются информацией только с магистралью, с процессором, а устройства ввода/вывода взаимо- действуют еше и с внешними устройствами, цифровыми или анало- говыми. Поэтому разнообразие устройств ввода/вывода неизмеримо больше, чем модулей памяти. Часто используются еще и другие на- звания для устройств ввода/вывода: устройства сопряжения, конт- роллеры, карты расширения, интерфейсные модули и т.д. Объединяют все устройства ввода/вывода общие принципы об- мена с магистралью и, соответственно, общие принципы организа- ции узлов, которые осуществляют сопряжение с магистралью. Упро- щенная структура устройства ввода/вывода (точнее, его интерфейс- ной части) приведена на рис. 6.11. Как и в случае модуля памяти, она обязательно содержит схему селектора адреса, схему управления для обработки стробов обмена и буферы данных. Нг внешнее С внешнего устройство устройства Шина адоеса Шина данных Шина угравгения Рис. 6.11. Структура простейшего устройства ввода/вывода Самые простейшие устройства ввода/вывода выдают на внешнее устройство код данных в параллельном формате и принимают из внешнего устройства код данных в параллельном формате. Такие устройства ввода/вывода часто называют параллельными портами ввода/вывода. Они наиболее универсальны, т.е. удовлетворяют по- требности сопряжения с большим числом внешних устройств, по-
этому их часто вводят в состав микропроцессорной системы в каче- стве стандартных устройств. Параллельные порты обычно имеются в составе микроконтроллеров. Именно через параллельные порты микроконтроллер связывается с внешним миром. Входной порт (порт ввода) в простейшем случае представляет со- бой параллельный регистр, в который процессор может записывать информацию. Выходной порт (порт вывода) обычно представляет собой просто однонаправленный буфер, через который процессор может читать информацию от внешнего устройства. Именно такие порты показаны для примера на рис. 6.11. Порт может быть и двуна- правленным (входным/выходным) В этом случае процессор пишет информацию во внешнее устройство и читает информацию из внеш- него устройства по одному и тому же адресу в адресном пространстве системы. Входные и выходные линии для связи с внешним устрой- ством при этом могут быть объединены поразрядно, образуя двуна- правленные линии. При обращении со стороны магистрали селектор адреса распо- знает адрес, приписанный данному устройству ввода/вывода. Схема управления выдает внутренние стробы обмена в ответ на магистраль- ные стробы обмена. Входной буфер данных обеспечивает электри- ческое согласование шины данных с этим устройством (буфер может и отсутствовать). Данные из шины данных записываются в регистр по сигналу С и выдаются на внешнее устройство. Выходной буфер данных передает входные данные с внешнего устройства на шину данных магистрали в цикле чтения из порта. Более сложные устройства ввода/вывода (устройства сопряжения) имеют в своем составе внутреннюю буферную оперативную память и даже могут иметь микроконтроллер, на который возложено выпол- нение функций обмена с внешним устройством. Каждому устройству ввода/вывода отводится свой адрес в адрес- ном пространстве микропроцессорной системы. Дублирование ад- ресов должно быть исключено, за этим должны следить разработчик и пользователь микропроцессорной системы. Устройства ввода/вывода, помимо программного обмена, могут также поддерживать режим обмена по прерываниям. В этом случае они преобразуют поступающий от внешнего устройства сигнал за- проса на прерывание в сигнал запроса прерывания, необходимый для данной магистрали (или в последовательность сигналов при вектор- ном прерывании). Если нужно использовать режим ПДП, устройство ввода/вывода должно выдать сигнал запроса ПДП на магистраль и обеспечить работу в циклах ПДП, принятых для данной магистрали.
В составе микропроцессорных систем, как правило, выделяются три специальные группы устройств ввода/вывода: • устройства интерфейса пользователя (ввода информации пользо- вателем и вывода информации для пользователя); • устройства ввода/вывода для длительного хранения информации; • таймерные устройства. К устройствам ввода для интерфейса пользователя относятся конт- роллеры клавиатуры, тумблеров, отдельных кнопок, мыши, трек- бола, джойстика и т.д. К устройствам вывода для интерфейса пользо- вателя относятся контроллеры светодиодных индикаторов, табло, жидкокристаллических, плазменных и электронно-лучевых экранов и т.д. В простейших случаях управляющих контроллеров или микро- контроллеров эти средства могут отсутствовать. В сложных микро- процессорных системах они есть обязательно. Роль внешнего устрой- ства в данном случае играет человек. Устройства ввода/вывода для длительного хранения информации обеспечивают сопряжение микропроцессорной системы с дисково- дами (компакт-диски или магнитные диски), а также с накопите- лями на магнитной ленте. Применение таких устройств существенно увеличивает возможности микропроцессорной системы в отношении хранения выполняемых программ и накопления массивов данных. В простейших контроллерах эти устройства отсутствуют Таймерные устройства отличаются от других устройств ввода/вы- вода тем, что они могут не иметь внешних выводов для подключения к внешним устройствам. Эти устройства предназначены для того, чтобы микропроцессорная система могла выдерживать заданные временные интервалы, следить за реальным временем, считать им- пульсы и т.д. В основе любого таймера лежат кварцевый тактовый генератор и многоразрядные двоичные счетчики, которые могут пе- резапускать друг друга. Процессор может записывать в таймер коэф- фициенты деления тактовой частоты, количество отсчитываемых импульсов, задавать режим работы счетчиков таймера, а читает про- цессор выходные коды счетчиков. В принципе выполнить практи- чески все функции таймера можно и программным путем, поэтому иногда таймеры в системе отсутствуют. Но включение в систему тай- мера позволяет решать более сложные задачи и строить более эффек- тивные алгоритмы. Еше один важный класс устройств ввода/вывода — это устройства для подключения к информационным сетям (локальным и глобальным). Эти устройства распространены не так широко, как устройства трех перечисленных ранее групп, но их значение с каждым годом стано-
вится все больше. Сейчас средства связи с информационными сетями вводятся иногда даже в простые контроллеры. Иногда устройства взода/вывода обеспечивают сопряжение с внешними устройствами с помощью аналоговых сигналов. Это бы- вает очень удобно, поэтому в состав некоторых микроконтроллеров даже вводят внутренние ЦАП и АЦП Назначение и функции чипсета е микропроцессорной системе Чипсет (chlPset) — это набор БИС (обычно 1—3 микросхемы), функционально эквивалентный микросхемам, входящим в стан- дартную конфигурацию микропроцессорной системы. Как правило, чипсет интегрирует в себе функции следующих устройств: • контроллера оперативной памяти; • контроллеров кэш-памяти 2-го и/или 3-го уровня; • контроллеров ПДП; • контроллеров приоритетных прерываний; • контроллера клавиатуры; • контроллера мыши PS/2', • контроллера инфракрасного порта; • таймера реального времени; • моста шины PCI; • моста шины ISA и др. Обычно в составе чипсета выделяют: • северный мост (North Bridge) — системный контроллер, в кото- рый входит контроллер системной шины, шин AGP и PCI, ОЗУ и кэш-памяти (для наборов под обычный Pentium); • южный мост (SOUTh Bridge) — периферийный контроллер, включающий контроллеры EIDE, клавиатуры, моста PCl-to-PCI, последовательных/параллельных портов, шины USB и других по- добных устройств. Выбор чипсета во многом определяет конфигурацию МПС и ее производительность. Если МП можно заменить, а емкость ОЗУ уве- личить, то замена чипсета однозначно связана с заменой системной платы, а ограничения чипсета также однозначно ограничивают воз- можности замены других элементов МПС: МП, ОЗУ, внешних устройств. Чипсет накладывает ограничения на следующие функциональные характеристики системы в целом: тип памяти, тип кэш-памяти 2-го и/или 3-го уровня, тип МП, максимальную частоту системной
шины, тип шины PCI(32- или 64-разрядная); поддержку многопро- цессорной конфигурации и некоторые другие характеристики. Практика показывает, что разница в производительности сис- темных плат разных фирм, построенных с применением одного и того же чипсета, составляет от силы несколько процентов, между тем как тот же параметр для различных чипсетов может отличаться на порядок. Рассмотрим использование чипсета на примере организации ми- кропроцессорной системы на базе МП Pentium III на ядре Katmai (рис. 6 12). Внутренняя шина ЦП Рис. 6.12. Структура микропроцессорной системы с использованием чипсета Частота шины РС7составляет 33 МГц при частоте системной шины и 66, и 100 МГц (используется деление частоты на 2 и 3 соответ- ственно). AGP (Accelerated Graphics Port) — 32-разрядная шина (так- товая частота всегда 66 МГц), используемая для подключения графи- ческого адаптера и позволяющая ускорить обмен данными между графическим адаптером и основной памятью. В режиме AGP 2х эф- фективная частота в 133 МГц обеспечивается использованием обоих фронтов импульсов частоты 66 МГц. Шина ISA работает на частоте 8 МГц. За ее функционирование отвечает мост PCI/ISA, являющийся обычным РС/-устройством (просто встроенным в чипсет).
Системная шина может работать на разной частоте, но все эти варианты совместимы по разводке и электрически, что создает почву для «разгона». Таким образом, при смене частоты системной шины, например, с 66 на 100 МГц замене подлежат лишь три устройства: процессор, чипсет и память. Никакие другие устройства не заметят подмены шины — ни Л6Р-видеоадаптеры, ни любой из РС/-контроллеров, ни старые /5/1-карты. В этом и заключается принципиальное отличие шины 100 МГц от шины 66 МГц, разогнанной до 75/83 МГц. В пер- вом случае новый чипсет обеспечивает работу PCI на частоте 33 (100/3) МГц, во втором — старый чипсет и не подозревает о «раз- гоне» и продолжает делить частоту системной шины на 2, а в итоге частота РСГ-шины равна 37,5 или 41,5 МГц, что может привести к не- правильной работе некоторых PC/-устройств. Контрольные вопросы и задания 1. Постройте структурную схему контроллера прямого доступа к памяти и опишите принцип его работы. 2. Постройте структурную схему микропроцессорной системы с исполь- зованием чипсета 3. Постройте структурную схему МПС с контроллером прямого доступа к памяти и опишите принцип его работы. 4. Опишите принцип работы стека после вызова прерывания или особой ситуации в реальном режиме работы. 5. Укажите основные правила функционирования механизма обработки прерываний и особых ситуаций. 6. Перечислите основные этапы обработки прерывания. Назначение и функции чипсета в микропроцессорной системе. 7. Укажите основные режимы обмена по магистрали. 8. Какие типы прерываний вы знаете? 9. Маскируемые прерывания. Способы реализации. 10. Укажите типы особых ситуаций и особенности их обработки. 11. Каковы особенности работы процессора при передаче управления об- работчику прерываний защищенного режима? 12. Какие типа контроллеров прерываний применяются в IBM PC- совместимых компьютерах? 13. Что такое режим с поддержкой виртуальных флагов прерываний? Ка- кие флаги применяются для обеспечения данного режима? 14. Что произойдет с системой, если одновременно поступили два преры- вания? 15. Какие устройства подлежат замене при смене частоты системной шины? 16. Программные прерывания, отличие от аппаратных прерываний. 17. Какие типы прерываний и особых ситуаций вы знаете?
Глава 7 УРОВЕНЬ ОПЕРАЦИОННОЙ системы Рассмотрим уровень операционной системы. В логической струк- туре типичной вычислительной системы операционная система за- нимает положение между устройствами с их микроархитектурой, машинным языком и, возможно, собственными (встроенными) ми- кропрограммами (драйверами), с одной стороны, и прикладными программами — с другой. Разработчикам программною обеспечения операционная система позволяет абстрагироваться от деталей реализации и функциониро- вания устройств, предоставляя минимально необходимый набор функций. 7.1. Назначение, структура и функции операционной системы Операционная система — это комплекс взаимосвязанных прог- рамм, кода и графического интерфейса, предназначенных для управ- ления ресурсами компьютера и взаимодействия машины с пользо- вателем. Любая операционная система представляет собой раздели- тельный барьер, посредника между разработчиками программного обеспечения и микроархитектуры. В большинстве вычислительных систем операционная система является основной, наиболее важной (а иногда и единственной) частью системного программного обеспечения. С 1990-х гг. наиболее распространенными операционными сис- темами являются системы семейства Windows, UNIX и UNIX- подобные системы. Хотя и уровень операционной системы, и уровень архитектуры команд абстрактны (в том смысле, что не являются реальными устройствами), между ними есть важное различие. Все команды уровня операционной системы доступны для прикладных програм- мистов. Это практически все команды более низкого уровня, а также новые команды, добавленные операционной системой. Новые ко-
манды называются системными вызовами. Они вызывают предопре- деленную службу операционной системы, в частности одну из ее команд. Обычный системный вызов считывает какие-нибудь данные из файла. Уровень операционной системы всегда интерпретируется Когда пользовательская программа вызывает команду операционной системы, например чтение данных из файла, операционная система выполняет эту команду шаг за шагом точно также, как микропрог- рамма выполняет команду ADZ). Однако, когда программа вызывает команду уровня архитектуры команд, эта команда выполняется не- посредственно уровнем микроархитектуры без участия операцион- ной системы. С точки зрения программиста, операционная система — это прог- рамма, добавляющая ряд команд и функций к командам и функ- циям, предлагаемым уровнем архитектуры команд [1]. Операционную систему определяют также как «набор программ, управляющих оборудованием» и как «набор программ, управляющих другими программами». Данные определения имеют свой точный технический смысл, который связан с вопросом, в каких случаях тре- буется операционная система. Немного истории. Предшественником операционных систем сле- дует считать служебные программы (загрузчики и мониторы), а также библиотеки часто используемых подпрограмм, начавшие разрабатываться с появлением универсальных компьютеров 1-го по- коления (конец 1940-х гг.). Служебные программы минимизировали физические манипуляции оператора с оборудованием, а библиотеки позволяли избежать многократного программирования одних и тех же действий (осуществления операций ввода/вывода, вычис- ления математических функций и т.п.). В 1950—60-х гг. сформировались и были реализованы основные идеи, определяющие функциональность ОС: пакетный режим, раз- деление времени и многозадачность, разделение полномочий, реаль- ный масштаб времени, файловые структуры и файловые системы. Пакетный режим. Необходимость оптимального использования дорогостоящих вычислительных ресурсов привела к появлению кон- цепции «пакетного режима» исполнения программ. Пакетный режим предполагает наличие очереди программ на исполнение, причем сис- тема может обеспечивать загрузку программы с внешних носителей данных в оперативную память, не дожидаясь завершения исполнения предыдущей программы, что позволяет избежать простоя процессора. Разделение времени и многозадачность Уже пакетный режим в своем развитом варианте требует разделения процессорного вре-
мени между выполнением нескольких программ. Необходимость в разделении времени (многозадачности, мультипрограммировании) проявилась еще сильнее при распространении в качестве устройств ввода/вывода телетайпов (а позднее — терминалов с электронно- лучевыми дисплеями) (1960-е гг.). Поскольку скорость клавиатур- ного ввода (и даже чтения с экрана) данных оператором много ниже, чем скорость обработки этих данных компьютером, использование компьютера в «монопольном» режиме (с одним оператором) могло привести к простою дорогостоящих вычислительных ресурсов. Разделение времени позволило создать «многопользовательские» системы, в которых один (как правило) центральный процессор и блок оперативной памяти соединялся с многочисленными терми- налами. При этом часть задач (таких как ввод или редактирование данных оператором) могла исполняться в режиме диалога, а другие задачи (такие как массивные вычисления) — в пакетном режиме Разделение полномочий. Распространение многопользовательских систем потребовало решения задачи разделения полномочий, позво- ляющей избежать возможности изменения исполняемой программы или данных одной программы в памяти компьютера другой програм- мой (намеренно или по ошибке), а также изменения самой системы прикладной программой. Реализация разделения полномочий в операционных системах была поддержана разработчиками процессоров, предложивших ар- хитектуры с двумя режимами работы процессора — «реальным» (в котором исполняемой программе доступно все адресное простран- ство компьютера) и «защищенным» (в котором доступность адрес- ного пространства ограничена диапазоном, выделенным при запуске программы на исполнение). Масштаб реального времени. Применение универсальных ком- пьютеров для управления производственными процессами потребо- вало реализации «масштаба реального времени» — синхронизации исполнения программ с внешними физическими процессами. Вклю- чение функции масштаба реального времени позволило создавать решения, одновременно обслуживающие производственные про- цессы и решающие другие задачи (в пакетном режиме и/или в ре- жиме разделения времени). Файловые системы и структуры. Постепенная замена носителей с последовательным доступом (перфолент, перфокарт и магнитных лент) накопителями произвольного доступа (на магнитных дисках). Файловая система — способ хранения данных на внешних запо- минающих устройствах.
Структура операционных систем Все компоненты операционной системы можно разделить на две группы — работающие в привилегированном режиме и работающие в пользовательском режиме, причем состав этих групп меняется от системы к системе. Современные процессоры имеют минимум два режима работы — привилегированный (supervisor mode) и пользовательский (user mode). Отличие между ними заключается в том, что в пользовательском режиме недоступны команды процессора, связанные с управлением аппаратным обеспечением, защитой оперативной памяти, переклю- чением режимов работы процессора. В привилегированном режиме процессор может выполнять все возможные команды. Приложения, выполняемые в пользовательском режиме, не могут напрямую обращаться к адресным пространствам друг друга — только посредством системных вызовов. Основным компонентом операционной системы является ядро (kernel). Функции ядра могут существенно отличаться в разных сис- темах, но во всех системах ядро работает в привилегированном ре- жиме (который часто называется режим ядра, kernel mode). Термин «ядро» также используется в разных смыслах. Например, в Windows термин «ядро» (NTOS kernel) обозначает совокупность двух компонентов — исполнительной системы (executive layer) и соб- ственно ядра (kernel layer). Существует два основных вида ядер — монолитные ядра (mono- lithic kernel) и микроядра (microkernel). В монолитном ядре реали- зуются все основные функции операционной системы, и оно яв- ляется, по сути, единой программой, представляющей собой сово- купность процедур 15J. В микроядре остается лишь минимум функций, который должен быть реализован в привилегированном режиме: планирование потоков, обработка прерываний, межпро- цессное взаимодействие. Остальные функции операционной сис- темы по управлению приложениями, памятью, безопасностью и пр. реализуются в виде отдельных модулей в пользовательском режиме. Ядра, которые занимают промежуточное положение между мо- нолитными и микроядрами, называют гибридными (hybrid kernel). Кроме ядра, в привилегированном режиме (в большинстве опе- рационных систем) работают драйверы (driver) — программные мо- дули, управляющие устройствами.
В состав операционной системы также входят: • системные библиотеки (system DLL — Dynamic Link Library, ди- намически подключаемая библиотека), преобразующие систем- ные вызовы приложений в системные вызовы ядра; • пользовательские оболочки (shell), предоставляющие пользова- телю интерфейс — удобный способ работы с операционной сис- темой. Пользовательские оболочки реализуют один из двух основных видов пользовательского интерфейса: • текстовый интерфейс (Text User Interface, TUI), другие назва- ния — консольный интерфейс (Console User Interface, CUL), ин- терфейс командной строки (Command Line Interface, CLI)\ • графический интерфейс (Graphic User Interface, GUI). Пример реализации текстового интерфейса в Windows — интер- претатор командной строки cmd.exe; пример графического интер- фейса — проводник Windows (explorer.exe). Функции операционной системы В зависимости от назначения операционную систему можно представить следующим образом. 1. Операционная система как виртуальная машина. Операционная система предоставляет пользователю виртуальную машину, которую легче программировать и с которой легче работать, чем непосред- ственно с аппаратурой, составляющей реальную машину. Использование вычислительных машин на уровне машинного языка затруднительно, особенно это касается ввода/вывода. Напри- мер, чтобы считать или записать информацию на дискету, надо: • запустить двигатель вращения дискеты; • управлять шаговым двигателем перемещения головки; • следить за индикатором присутствия дискеты; • выбрать номер блока на диске; • выбрать дорожку; • выбрать номер сектора на дорожке; • и.т.д. Все эти функции берет на себя операционная система. Операци- онная система предоставляет простой файловый интерфейс, освобо- ждает программиста от аппаратных проблем, связанных с организа- цией ввода/вывода, обработкой прерываний, управлением таймерами и оперативной памятью, а также других низкоуровневых проблем. 2. Операционная система как система управления ресурсами. В со- ответствии со вторым подходом функцией ОС является распределе-
ние процессоров, памяти, устройств и данных между процессами, конкурирующими за эти ресурсы. ОС должна управлять всеми ре- сурсами вычислительной машины таким образом, чтобы обеспечить максимальную эффективность ее функционирования. Критерием эффективности может быть, например, пропускная способность или реактивность системы. Управление ресурсами включает решение двух общих, независящих от типа ресурса задач: 1) планирование ресурса, те. определение, кому, когда, а для де- лимых ресурсов — и в каком количестве необходимо выделить дан- ный ресурс; 2) отслеживание состояния ресурса, т.е. поддержание оператив- ной информации о том, занят или не занят ресурс, а для делимых ресурсов — какое количество ресурса уже распределено, а какое сво- бодно. Для решения этих общих задач управления ресурсами разные ОС используют различные алгоритмы, что в конечном счете и опреде- ляет их облик в целом, включая характеристики производитель- ности, область применения и даже пользовательский интерфейс. Так, например, алгоритм управления процессором в значительной сте- пени определяет, является ли ОС системой разделения времени, си- стемой пакетной обработки или системой реального времени. 3. Операционная система как API (Application Programming Inter- face) — интерфейс прикладного программирования. Интерфейс между операционной системой и программами определяется набо- ром системных вызовов. Например, если пользовательскому про- цессу необходимо считать данные из файла, он должен выполнить команду системного вызова, т.е. выполнить прерывание с переклю- чением в режим ядра и активизировать функцию операционной сис- темы для считывания данных из файла. Функционирование компьютера после включения питания Функционирование компьютера после включения питания начи- нается с запуска программы первоначальной загрузки — Boot Track. Программа Boot Track инициализирует основные аппаратные блоки компьютера и регистры процессора (CPU), накопитель памяти, конт- роллеры периферийного оборудования, Затем загружается ядро ОС, те. Operating System Kernel. Дальнейшее функционирование ОС осуществляется как реакция на события, происходящие в компью- тере. Наступление того или иного события сигнализируется преры- ваниями — Interrupt. Источниками прерываний могут быть как ап- паратура (Hardware), так и программы (Software).
Аппаратура «сообщает» о прерывании асинхронно (в любой мо- мент времени) путем пересылки в CPU через общую шину сигналов прерываний. Программа «сообщает» о прерывании путем выполне- ния операции System Call. Примеры событий, вызывающих преры- вания: • попытка деления на ноль; • запрос на системное обслуживание; • завершение операции ввода/вывода; • неправильное обращение к памяти. Каждое прерывание обрабатывается соответственно обработчи- ком прерываний (Interrupt handler), входящим в состав ОС. Главные функции механизма прерываний — это: • распознавание или классификация прерываний; • передача управления соответственно обработчику прерываний; • корректное возвращение к прерванной программе. Переход от прерываемой программы к обработчику и обратно должен выполняться как можно быстрее. Одним из быстрых методов является использование таблицы, содержащей перечень всех допу- стимых для компьютера прерываний и адреса соответствующих об- работчиков. Такая таблица называется вектором прерываний (Interrupt vector) и хранится в начале адресного пространства основной памяти (UNIX/A/5 DOS). Для корректного возвращения к прерванной программе перед передачей управления обработчику прерываний содержимое реги- стров процессора запоминается либо в памяти с прямым доступом, либо в системном стеке — System Stack. Обычно запрещаются прерывания обработчика прерываний. Од- нако в некоторых ОС прерывания снабжаются приоритетами, т.е. ра- бота обработчика прерывания с более низким приоритетом может быть прервана, если произошло прерывание с более высоким прио- ритетом. 7.2. Операционная система как система управления ресурсами Понятия «процессы», «потоки» и «файберы» Не следует смешивать понятия «процесс» и «программа». Прог- рамма — это план действий, а процесс — это само действие. Например, когда вы открываете приложение MS Word, то запу- скаете процесс, исполняющий программу MS Word. Поэтому можно
сказать, что процесс — это выполнение вычислительной системой некоторой системной или прикладной программы или их фрагмента. Каждому процессу в операционной системе соответствует кон- текст процесса. Этот контекст включает в себя: • пользовательский контекст (соответствующий программный код, данные, размер виртуальной памяти, дескрипторы открытых фай- лов и пр.); • аппаратный контекст (содержимое регистра счетчика команд, регистра состояния процессора, регистра указателя стека, а также содержимое регистров общего назначения); • системный контекст (состояние процесса, идентификатор соот- ветствующего пользователя, идентификатор процесса и пр.). Важно, что из-за большого объема данных контекста процесса переключение процессора системы с выполнения одного процесса на выполнение другого процесса (смена контекста процесса) явля- ется относительно дорогостоящей операцией. Для уменьшения времени смены контекста процесса в совре- менных ОС (например, в ОС UNIX) наряду с понятием процесса широко используется понятие легковесного процесса (light-weight pro- cess) или понятие потока, нити (thread). Легковесный процесс можно определить как подпроцесс некоторого процесса, выполняемый в контексте этого процесса. Контекст процесса содержит общую для всех его легковесных процессов информацию — виртуальную па- мять, дескрипторы открытых файлов и т.д. Остальная информация из контекста процесса переходит в контексты его легковесных про- цессов. Простейшим процессом является процесс, состоящий из одного легковесного процесса. Поток — отдельное исполняемое задание внутри процесса. Про- цесс может содержать множество исполняемых потоков. После за- пуска приложения исполняется главный поток, который далее может порождать другие потоки. Принципиальным является то обстоятельство, что нити одного процесса выполняются в общей виртуальной памяти, т.е. имеют рав- ные права доступа к любым частям виртуальной памяти процесса. Операционной системой основной ресурс вычислительной сис- темы — процессорное время — выделяется не процессу, а легковес- ному процессу. На основе сказанного процесс можно определить как некоторый контекст, включающий виртуальную память и другие системные ре- сурсы, в котором выполняется по крайней мере один легковесный
процесс, обладающий своим собственным (более простым) контек- стом. ОС «знает» о существовании двух указанных уровней контек- стов и способна сравнительно быстро изменять контекст легковес- ного процесса, не изменяя общего контекста процесса. Заметим, что для синхронизации легковесных процессов, работающих в общем контексте процесса, можно использовать более дешевые средства, чем для синхронизации процессов. Понятие легковесного процесса направлено на организацию вы- числений в многопроцессорной вычислительной системе, в случае когда приложение, выполняемое в рамках одного процесса, обладает внутренним параллелизмом. Разумеется, параллельное выполнение приложения можно организовать и на пользовательском уровне — путем создания для одного приложения нескольких процессов для каждой из параллельных работ Однако при этом не учитывается тот факт, что эти процессы решают общую задачу, а значит, могут иметь много общего — общие данные, программные коды, права доступа к ресурсам системы и пр. Кроме того, как отмечалось выше, каждый процесс требует значительных системных ресурсов, которые при та- кой организации параллельных вычислений неоправданно дублиру- ются. На одном процессоре многопоточность обычно происходит путем временного мультиплексирования (как и в случае многозадачности): процессор переключается между разными потоками выполнения. Это переключение контекста обычно происходит достаточно часто, чтобы пользователь воспринимал выполнение потоков или задач как одновременное. В многопроцессорных и многоядерных системах потоки или задачи могут реально выполняться одновременно, при этом каждый процессор или ядро обрабатывает отдельный поток или задачу. Многие современные операционные системы поддерживают как временные нарезки от планировщика процессов, так и многопро- цессорные потоки выполнения. Ядро операционной системы позво- ляет программистам управлять потоками выполнения через интер- фейс системных вызовов. Некоторые реализации ядра называют потоком ядра, другие же — легковесным процессом (англ, light-weight process, LWP), представляющим собой особый тип потока выполне- ния ядра, который совместно использует одни и те же состояния и данные. Файберы являются еще более «легкими» блоками планирования, относящимися к кооперативной многозадачности: выполняющийся файбер должен явно «уступить» право другим файберам на выпол-
нение, что делает их реализацию гораздо легче, чем реализацию по- токов выполнения ядра или пользовательских потоков выполнения. Файберы могут быть запланированы для запуска в любом потоке выполнения внутри того же процесса. Это позволяет приложениям получить повышение производительности за счет управления пла- нированием самого себя, вместо того чтобы полагаться на планиров- щика ядра, который может быть не настроен на такое применение. Параллельные среды программирования, такие как ОрепМР, обычно реализуют свои задачи посредством файберов. Системный вызов (англ, system call) в программировании и вычис- лительной технике — обращение прикладной программы к ядру опе- рационной системы для выполнения какой-либо операции Современные операционные системы (ОС) предусматривают раз- деление времени между выполняющимися вычислительными про- цессами (многозадачность) и разделение полномочий, препятству- ющее обращению исполняемых программ к данным других прог- рамм и оборудованию. Ядро ОС исполняется в привилегированном режиме работы процессора. Для выполнения межпроцессной опе- рации или операции, требующей доступа к оборудованию, прог- рамма обращается к ядру, которое в зависимости от полномочий вызывающего процесса исполняет либо отказывает в исполнении такого вызова. С точки зрения программиста, системный вызов обычно выгля- дит как вызов подпрограммы или функции из системной библио- теки. Однако системный вызов как частный случай вызова такой функции или подпрограммы следует отличать от более общего обра- щения к системной библиотеке, поскольку последнее может и не требовать выполнения привилегированных операций. Большинство современных операционных систем позволяют формировать и прерывать процессы динамически. Для формирова- ния нового процесса требуется системный вызов. Этот системный вызов может просто создать клон вызывающей программы или по- зволить исходному процессу задать начальное состояние нового про- цесса, включая его программу, данные и начальный адрес В одних случаях исходный (родительский) процесс может сохра- нять частичный или даже полный контроль над порожденным (до- черним) процессом. Виртуальные команды позволяют родитель- скому процессу останавливать и снова запускать, проверять и завер- шать дочерние процессы. В других случаях исходный процесс никак не контролирует дочерний процесс: после того как новый процесс сформирован, исходный процесс не может его остановить, запустить
заново, проверить или завершить. Таким образом, эти два процесса работают независимо друг от друга. Управление процессами Операционная система контролирует следующую деятельность, связанную с процессами: 1) создание и удаление процессов; 2) планирование процессов; 3) синхронизация процессов; 4) коммуникация процессов; 5) разрешение тупиковых ситуаций. За время существования процесс многократно изменяет свое со- стояние. Различают следующие состояния процесса: 1) новый (new, процесс только что создан); 2) выполняемый (running, команды программы выполняются в CPU) ', 3) ожидающий (waning, процесс ожидает завершения некоторого события, чаще всего операции ввода/вывода); 4) готовый (ready, процесс ожидает освобождения CPU)', 5) завершенный (terminated, процесс завершил свою работу). Переход из одного состояния в другое не может выполняться про- извольным образом. Во многих операционных системах вся информация о каждом процессе, дополнительная к содержимому его собственного адрес- ного пространства, хранится в таблице процессов операционной системы (табл. 7.1). Каждый процесс представлен в операционной системе набором данных, называемых process control block. В process control block про- цесс описывается набором значений, параметров, характеризующих его текущее состояние и используемых операционной системой для управления прохождением процесса через компьютер. Вычислительный процесс создается либо непосредственно вве- денной с клавиатуры командой, либо через командный файл. Созда- ние вычислительного процесса включает в себя как минимум за- грузку программы и создание управляющих блоков. В результате создания в системе появляется новый процесс, ко- торый включается в мультипрограммную смесь, и ОС начинает его видеть. Таким образом, процесс находится в состоянии готовности. Процесс может быть диспетчеризован. Диспетчсризаиия — это действие, в результате которого один из готовых процессов становится активным. Выбор одного процесса,
Таблица 7.1 Поля таблицы процессов операционной системы Управление процессом Управление памятью Управление файлами Регистры Счетчик команд Указатель стека Состояние процесса Приоритет Параметры планирова- ния Идентификатор про- цесса Родительский процесс Группа процесса Время начала процесса Использованное про- цессорное время Указатель на текстовый сегмент Указатель на сегмент данных Указатель на сегмент стека Корневой каталог Рабочий каталог Дескрипторы файла Идентификатор поль- зователя Идентификатор группы который станет активным, из нескольких основан на правиле, назы- ваемом дисциплиной диспетчеризации. Диспетчер просматривает спи- сок готовых процессов и применяет алгоритм: • LIFO — Last In First Out; • FIFO — First In First Out; • SJF— Shon Job First. Приоритеты бывают: • относительными; • абсолютными. Эти дисциплины особенно важны в системах оперативной обра- ботки, когда критерием является время ответа. Все дисциплины можно использовать с квантованием и без кван- тования. Квантование — прием, при котором время обслуживания делят на части постоянной или переменной длины, называемые квантами. Если обслуживание за один квант не закончено, то оно искусственно прерывается и ресурс отдается следующей работе. Та- кая дисциплина называется циклическим обслуживанием. Диспетчеризация является составной частью каждого цикла пе- реключения при реализации процессов. Когда процесс находится в активном состоянии, выполняются команды процесса. Фундаментальная проблема — взаимная блокировка. Существует два подхода: 1) файлы распределяются предварительно;
2) ресурсы распределяются динамически (в момент, когда они нужны). Тупиковая ситуация, взаимная блокировка, тупик (deadlock) — си- туация, возникающая при параллельной обработке, когда несколько процессов, использующих общие ресурсы, не позволяют друг другу продолжить работу Например, пусть есть два процесса А и Б, кото- рым требуются ресурсы Аи Y. Пусть процесс А сначала запрашивает ресурс Xи захватывает его, а процесс Б параллельно захватывает ре- сурс У, который в это время еще свободен. В результате возникает ситуация, когда ни один из двух процессов не может продолжать работу: процесс А ждет, когда процесс Б закончит свою работу и ос- вободит ресурс У, а процесс Б ждет, когда процесс А закончит свою работу и освободит ресурс X. Если процессы, развивающиеся динамически, например, пыта- ются обратиться к одним и тем же файлам, то они блокируют друг друга — это и называется полной блокировкой или тупиком. Активное состояние может быть прервано: 1. По особому состоянию. Особое состояние — ошибка в прог- рамме. Происходит аварийное завершение. При этом ОС пытается сохранить информацию для последующего анализа причины особого состояния. Объем этой информации может быть разным (dump). Dump — распечатка содержимого ОП или файла, обычно без учета внутренней структуры данных. Копия содержимого регистров, нуж- ного участка ОП, блока данных или файла выводится на печать по- следовательно в форме двоичного, восьмеричного или шестнадцате- ричного кода. Дамп применяется для анализа работы программных средств. Например, дамп, полученный после аварийного завершения программы, служит материалом для выявления причин аварийного завершения. 2. Естественное завершение. Процесс остается в памяти и полу- чает флаг — завершенный процесс. 3 По прерыванию. При этом процесс переводится в состояние ожидания. Логика обработки прерывания зависит от архитектуры процес- сора. При этом учитываются следующие обстоятельства. Необходим некий механизм связи между процессом, находя- щимся в состоянии ожидания, и ОС, который должен устанавливать тот факт, что событие наступило. Для связи с процессом создается таблица ожиданий. Обращение к ОС не всегда может быть реализовано немедленно. ОС пытается выполнить функцию, которую у нее запросили, напри-
мер обращение к устройству. Если оно свободно, то это возможно. Если же устройство занято, то должна возникнуть очередь к устрой- ству. Е1роцесс уже попал в состояние ожидания, и повторное обра- щение со стороны процесса невозможно. Поэтому необходим меха- низм ведения очередей отложенных запросов. При выполнении за- проса ОС создает соответствующую структуру, которая описывает этот запрос (Request Contro] Block). Эту структуру и ставят в очередь. Очередь к БУ обслуживается по определенным дисциплинам (диспетчеризация). Из состояния ожидания процесс выходит по прерыванию от ВУ. Можно организовать синхронное ожидание. Для этого должен рабо- тать таймер. В состоянии завершения может находиться много процессов. Если завершение аварийное, то надо сделать дамп. Необходимо освободить ресурсы, имеющиеся у процессора. В этот момент: • файлы становятся доступными (после CLOSE) ; • уничтожаются временные файлы; • освобождается физическая память; • уничтожаются управляющие структуры, предварительно все сис- темы формируют файлы хронологии. Для выполнения отложенного ввода/вывода существует два спо- соба: • использование выделенного ВУ; • спулинг. В многозадачной системе реальный процессор переключается с процесса на процесс, но для упрощения модели рассматривается набор процессов, идущих параллельно (псевдопараллельно). Рассмотрим схему с четырьмя работающими процессами. На рис. 7.1, а представлена схема многозадачного компьютера с че- тырьмя программами в памяти, на рис. 7.1, б — четыре независимых друг от друга процесса, каждый со своей управляющей логикой (ло- гическим счетчиком команд). На рис. 7.2 представлена иллюстрация четырех работающих процессов во времени. В каждый момент вре- мени активен только один процесс. На самом деле существует только один физический счетчик ко- манд, в который загружается логический счетчик команд текущего процесса Когда время, отведенное текущему процессу, заканчива- ется, физический счетчик команд сохраняется в логическом счетчике команд, т.е. в памяти процесса.
Один счетчик команд Рис. 7.1. Иллюстрация многозадачности: а — четыре программы в многозадачном режиме; б — параллельная модель четырех независимых работающих процессов Рис. 7.2. Временная схема с четырьмя работающими процессами, идущими параллельно Средства создания и завершения процессов Рассмотрим основные средства создания и завершения процессов на примере операционной системы UNIX. Системный вызов fork. Для создания нового процесса использу- ется системный вызов fork Все процессы ОС UNIX, кроме началь- ного, запускаемого при «раскрутке» системы, образуются при по- мощи системного вызова/ог£. После создания процесса-потомка процесс-предок и процесс-потомок начинают «жить» своей соб- ственной жизнью, произвольным образом изменяя свой контекст. Например, и процесс-предок, и процесс-потомок могут выполнить
системный вызов exec (см. ниже), приводящий к полному измене- нию контекста процесса. Системный вызов wait. Системный вызов wait исполвзуется для синхронизации процесса-предка и процессов-потомков. Выполне- ние этого системного вызова приводит к приостановке выполнения процесса-предка до тех пор, пока не завершится выполнение какого- либо из процессов, являющегося его потомком. Сигналы. Сигнал — это способ информирования процесса со сто- роны ядра операционной системы о происшествии некоторого со- бвзтия (event) в системе, например: • исключительная ситуация (выход за допустимые границы вирту- альной памяти, попытка записи в область виртуальной памяти, которая доступна только для чтения, и т.д.); • ошибка в системном вызове (несуществующий системный вызов, ошибки в параметрах системного вызова и т.д.); • прием сообщения от другого процесса; • нажатие пользователем определенных клавиш на клавиатуре тер- минала, связанного с процессом. Все возможные в системе сигналы имеют уникальные номера и идентификаторы. С помощью системного вызова signal пользовательская программа может осуществить «перехват» указанного в вызове сигнала — вы- звать соответствующую функцию, которая выполнит обработку этого сигнала. Например, вызов signal (SIGFPE. error) вызовет выполнение функции error при переполнении или делении на ноль во время вы- полнения операции с плавающей запятой. ОС UNIX предоставляет возможность пользовательским процес- сам направлять сигналы другим процессам. Например, системный вызов kill (PID, signum) посылает процессу с идентификатором PID сигнал с номером signum. Системный вызов ехес. При выполнении системного вызова ехес {filename, .), где filename — имя выполняемого файла, операционная система производит реорганизацию виртуальной памяти вызыва- ющего процесса, уничтожая в ней сегменты старого программного кода и образуя новые сегменты, в которые загружается программный код из файла filename. Управление памятью Память является важнейшим ресурсом, требующим тщательного управления со стороны мультипрограммной GC. Особая роль памяти
объясняется тем, что процессор может выполнять инструкции прог- раммы только в том случае, если они находятся в памяти. В ранних ОС управление памятью сводилось просто к загрузке программы и ее данных из некоторого внешнего накопителя (пер- фоленты, магнитной ленты или магнитного диска) в память. С по- явлением мультипрограммирования перед ОС были поставлены новые задачи, связанные с распределением имеющейся памяти между несколькими работающими программами. Функции ОС по управлению памятью в мультипрограммной сис- теме: • отслеживание свободной и занятой памяти; • выделение памяти процессам и освобождение памяти при завер- шении процессов; • вытеснение кодов и данных процессов из ОП на диск (полное или частичное), когда размеры основной памяти недостаточны для размещения в ней всех процессов, и возвращение их в ОП, когда в ней освобождается место; • настройка адресов программы на конкретную область физиче- ской памяти. Дополнительные функции: • динамическое распределение памяти, т.е. выполнение запросов приложений на выделение им дополнительной памяти на время выполнения; • создание новых служебных информационных с трук тур (описате- лей процессов и потоков, буферов и др.); • защита памяти, которая состоит в том, чтобы не позволить вы- полняемому процессу записывать или читать данные из памяти, назначенной другому процессу. В связи с тем что оперативной памяти часто не хватает, для вы- полнения процессов приходится использовать внешнюю память (дисковую). Основные способы использования диска: • свопинг (подкачка) — процесс целиком загружается в память для работы; • виртуальная память — процесс может быть частично загружен в память для работы. С вопинг (подкачка). При нехватке памяти процессы могут быть выгружены на диск (рис. 7.3). Так как процесс С очень большой, процесс А был выгружен вре- менно на диск, после завершения процесса С он снова был загружен в память.
Рис. 7.3. Свопинг (подкачка) — процесс целиком загружается в память Как мы видим, процесс А второй раз загрузился в другое адресное пространство, должны создаваться такие условия, которые не повли- яют на работу процесса. Свопер — планировщик, управляющий перемещением данных между памятью и диском. Этот метод был основным для UNIX до версии 3BSD. Виртуальная память. Одним из наиболее популярных способов управления памятью в современных ОС является так называемая виртуальная память. Наличие в ОС виртуальной памяти позволяет программисту писать программу так, как будто в его распоряжении имеется однородная ОП большого объема, часто существенно пре- вышающего объем имеющейся физической памяти. В действитель- ности все данные, используемые программой, хранятся на диске и при необходимости частями (сегментами или страницами) отобра- жаются в физические адреса ячеек ОП. Типы адресов Для идентификации переменных и команд на разных этапах цикла программы используются символьные номера (метки), вирту- альные адреса и физические адреса (рис. 7.4). Символьные номера присваивает пользователь при написании программы на алгоритмическом языке или ассемблере (имена пере- менных и входных точек программных модулей). Физические адреса соответствуют номерам ячеек ОП, где в дей- ствительности будут расположены переменные и команды. Физиче- ская память представляет собой упорядоченное множество ячеек, и все они пронумерованы, т.е. к каждой из них можно обратиться, указав ее порядковый номер (адрес). Количество ячеек физической памяти ограничено и фиксировано.
Рис. 7.4. Идентификация переменных и команд Виртуальные адреса (математические или логические) вырабаты- вает транслятор, переводящий программу на математический язык. Поскольку во время трансляции в общем случае неизвестно, в какое место ОП будет загружена программа, транслятор присваивает пере- менным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что начальным адресом будет нулевой адрес. ОС должна связать каждое указанное пользователем имя с физи- ческой ячейкой памяти, т.е. осуществить отображение пространства имен на физическую память компьютера. В общем случае это ото- бражение осуществляется в два этапа: сначала системой программи- рования, а затем ОС (с помощью специальных программных модулей управления памятью и использования соответствующих аппаратных средств вычислительной системы). Между7 этими этапами обращения к памяти имеют форму виртуального адреса. Переход от виртуальных адресов к физическим может осуще- ствляться двумя способами. Первый способ. Замену виртуальных адресов на физические делает специальная системная программа — перемещающий загрузчик. Пе- ремещающий загрузчик на основании имеющихся у него исходных данных о начальном адресе физической памяти, в которую предстоит загружать программу, и информации, предоставленной транслятором об адресно-зависимых константах программы, выполняет загрузку программы и одновременно заменяет виртуальные адреса на физи- ческие. Второй способ. Программа загружается в память в неизмененном виде в виртуальных адресах, при этом операционная система фик- сирует смещение действительного расположения программного кода относительно виртуального адресного пространства. Во время вы- полнения программы при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический.
Второй способ является более гибким, он допускает перемещение программы во время ее выполнения, в то время как перемещающий загрузчик жестко привязывает программу к первоначально выделен- ному ей участку памяти Вместе с тем использование перемеща- ющего загрузчика уменьшает накладные расходы, так как преобра- зование каждого виртуального адреса происходит только один раз во время загрузки, а во втором случае — каждый раз при обращении по данному адресу. В некоторых случаях (обычно в специализированных системах), когда заранее точно известно, в какой области оперативной памяти будет выполняться программа, транслятор выдает исполняемый код сразу в физических адресах. Виртуальное адресное пространство Диапазон виртуальных адресов определяется программно-аппа- ратным обеспечением компьютера, в частности разрядностью его схем адресации. Совокупность всех возможных адресов из этого диа- пазона называется виртуальным адресным пространством (ВАП). Так, 32-разрядный процессор семейства х86 дает возможность адресовать до 2' байт, т.е. до 4 Гбайт памяти с диапазоном виртуаль- ных адресов от 00000000А до FFFFFFFFh. Реальные процессы используют только часть доступного вирту- ального пространства (на 1—2 порядка меньше максимума). Совпадение виртуальных адресов переменных и команд различ- ных программ не приводит к конфликтам, так как, в случае когда эти переменные или команды одновременно присутствуют в памяти, операционная система отображает совпадающие виртуальные адреса на разные физические (если эти переменные или команды не должны разделяться соответствующими процессами) адреса. Образ процесса — термин, обозначающий содержимое назначен- ного процессу виртуального адресного пространства, т.е. коды ко- манд и данные (исходные, промежуточные и результаты). Таким образом, основная идея виртуальной памяти заключается в разбиении программы на части, и в память эти части загружаются по очереди. Программа при этом общается с виртуальной памятью, а не с физической. Диспетчер памяти преобразует виртуальные ад- реса в физические. Страничная организация памяти Страницы — это части, на которые разбивается пространство вир- туальных адресов.
Страничные блоки — единицы физической памяти. Страницы всегда имеют фиксированный размер. Передача дан- ных между ОЗУ и диском всегда происходит в страницах. Странич- ная организация памяти представлена на рис. 7.5. Виртуальное адресное пространство Рис. 7.5. Страничная организация памяти X — обозначает неотображаемую страницу в физической памяти. Страничное прерывание происходит, если процесс обратился к странице, которая не загружена в ОЗУ (т.е. X). Процессор переда- ется другому процессу, и параллельно страница загружается в память. Таблица страниц используется для хранения соответствия адресов виртуальной страницы и страничного блока. Таблица может быть размещена: • в аппаратных регистрах (преимущество: более высокое быстро- действие, недостаток — высокая стоимость); • в ОЗУ. На рис. 7.6 представлена типичная запись в таблице страниц. Присутствие/отсутствие — загружена или не загружена в память. Защита — виды доступа, например чтение/запись. Изменение — изменилась ли страница; если да, то при выгрузке записывается на диск; если нет, просто уничтожается. Изменение Присутствие/отсутствие Номер виртуальной страницы Номер страничного блока Обращение Защита Рис. 7.6. Типичная запись в таблице страниц
Обращение — было ли обращение к странице; если нет, то это лучший кандидат на освобождение памяти. Информация об адресе страницы, когда она хранится на диске, в таблице не размещается Для ускорения доступа к страницам в диспетчере памяти создают буфер быстрого преобразования адреса, в котором хранится информа- ция о наиболее часто используемых страницах. Страничная организация памяти используется и в UNIX, и в Win- dows. Способы структуризации виртуального адресного пространства в ОС Структура адреса или модель адресации определяется в совокуп- ности компилятором, операционной системой и аппаратным обес- печением. Компилятор должен обеспечить простоту работы с адре- сом, но с минимальным разрывом между программистом и ОС. По- этому в языке программирования отображается та модель, которая используется в ОС. Эта модель, в свою очередь, определяется зало- женной в ОС идеей адресации с учетом необходимости реализации этой идеи на конкретной аппаратной платформе. Таким образом, ОС «сверху» должна обеспечить достаточно простую модель адресации для компилятора, а «снизу» уметь преобразовать эту модель в модель, навязанную аппаратурой. Рассмотрим две наиболее характерные модели структуризации адресного пространства — плоскую и двухуровневую модель «сег- мент-смещение». Эти модели представлены на рис. 7.7. Сегмент к . у/////////////. ////// (р, q) — двух компонентный адрес Се, мен г р Сегмент 1 Рис. 7.7. Типы виртуальных адресных пространств. а — плоское, б — сегментированное
Плоская (flat) структура. Виртуальное адресное пространство представлено в виде непрерывной линейной последовательности адресов. Линейный виртуальный адрес — число, представляющее со- бой смещение относительно начала виртуального адресного про- странства (обычно это нулевое значение). Сегментированная структура. Виртуальное адресное пространство представляется разделенным на сегменты, а адрес любого объекта в памяти определяется номером сегмента и смещением относительно начала этого сегмента, т.е. парой сегмент—смещение Более конкретно способы структуризации виртуального адрес- ного пространства рассмотрены в [5]. Важно отметить следующее. Использование и реализация уни- версального принципа сегментирования структуры адресного про- странства в разные периоды развития вычислительной техники были принципиально различными и менялись по крайней мере трижды. В ранних ОС на сегменты фиксированного размера делилась фи- зическая память, о чем пользователь должен был знать и что при необходимости учитывал в программе. Необходимость структуриза- ции адреса диктовалась архитектурой процессора и памяти. Так, мо- дель памяти «сегмент—смещение» была реализована в 32-разрядной архитектуре IBM-360 (объем памяти оказывался меньше потенци- ально адресуемого, но тем не менее была реализована модель «сег- мент-смещение») и в 16-разрядной архитектуре х86 (по причине сугубо аппаратного свойства: процессор использовал 20-разрядную шину адреса, располагая 16-разрядными регистрами, и для форми- рования адреса использовалось два регистра). Для программы адресное пространство представляется плоским. Подходы к преобразованию виртуальных адресов в физические Загрузка программы с совместной заменой виртуальных адресов фи- зическими адресами. Замена адресов выполняется один раз. Прог- рамма перемещающий загрузчик, имея начальный адрес загрузки (т.е. адрес оперативной памяти, начиная с которого будет размещена программа) и код в относительных (виртуальных) адресах, выполняет загрузку с одновременным увеличением виртуальных адресов на ве- личину начального адреса загрузки. Динамическое преобразование виртуальных адресов. Программа загружается в память в виртуальных адресах. Начальный адрес за- грузки ОС фиксирует в специальном регистре. Преобразование вир- туальных адресов в физические (также путем прибавления началь-
ного адреса загрузки) производится во время выполнения прог- раммы при обращении к памяти. Таким образом, некоторый виртуальный адрес пересчитывается в физический столько раз, сколько обращений по нему производится Этот способ более гибок, так как позволяет перемещать прог- раммный код процесса во время выполнения, но менее экономичен из-за многократных преобразований одних и тех же адресов. 7.3. Интерфейс прикладного программирования API (англ. Application Programming Interface, интерфейс приклад- ного программирования) — набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (биб- лиотекой, сервисом) или операционной системой для использования во внешних программных продуктах. Практически все операционные системы (UNIX, Windows, OS X и т.д.) имеют API, с помощью которого программисты могут созда- вать приложения для этой операционной системы. Главный API опе- рационных систем — это множество системных вызовов. Например, если пользовательскому процессу необходимо считать данные из файла, он должен выполнить команду системного вызова, те. выполнить прерывание с переключением в режим ядра и акти- визировать функцию операционной системы для считывания данных из файла. В POSIXсуществует более 100 системных вызовов. Ниже приве- дены примеры наиболее часто применяемых системных вызовов стандарта POSIX. • fork — создание нового процесса; • exit — завершение процесса; • open — открывает файл; • close — закрывает файл; • read — читает данные из файла в буфер; • write — пишет данные из буфера в файл; • stat — получает информацию о состоянии файла; • mkdir — создает новый каталог; • rmdir — удаляет каталог; • link — создает ссылку; • unlink — удаляет ссылку; • mount — монтирует файловую систему; • amount — демонтирует файловую систему; • chdir — изменяет рабочий каталог.
В UNIX вызовы почти один к одному идентичны библиотечным процедурам, которые используются для обращения к системным вы- зовам. Рассмотрим интерфейс прикладного программирования для Win- dows — Win32 API. Win32 API отделен от системных вызовов. Это позволяет в разных версиях менятв системные ввтзовы, не перепи- сывая программв!. Поэтому непонятно, является ли вызов систем- ным (выполняется ядром) или он обрабатывается в пространстве полвзователя. В Win32 API существует более 1000 вызовов Такое количество связано и с тем, что графический интерфейс пользователя UNIX запускается в пользовательском режиме, а в Windows — встроен в ядро. Поэтому Win32 API имеет много вызовов для управления ок- нами, текстом, шрифтами т.д. Вызовы Win32 API подобны вызовам стандарта POSIX. Примеры вызовов Win32API. • CreatProcess {fork) — создание нового процесса; • Exit Process (exif) — завершение процесса; • CreatFile (open) — открывает файл; • CloseHandle (close) — закрывает файл; • ReadFile (read) — читает данные из файла в буфер; • WriteFile (write) — пишет данные из буфера в файл; • CreatDirectory (inkdir) — создает новый каталог; • Remove Di rectory (rmdir) — удаляет каталог; • SeiCurrentDirectory (chdir) — изменяет рабочий каталог. Интерфейс И7/132 API позволяет программам работать почти на всех версиях W'indows. В индустрии программного обеспечения общие стандартные API для стандартной функциональности имеют важную роль, так как они гарантируют, что все программы, использующие общий API, будут работать одинаково хорошо или, по крайней мере, типичным при- вычным образом. В случае API графических интерфейсов это озна- чает, что программы будут иметь похожий пользовательский интер- фейс, что облегчает процесс освоения новых программных продук- тов. С другой стороны, отличия в API различных операционных систем существенно затрудняют перенос приложений между плат- формами. Существуют различные методы обхода этой сложности — написание «промежуточных» API (API графических интерфейсов WxWidgets, Qt, GT К и т.п.), написание библиотек, которые отобра- жают системные вызовы одной ОС в системные вызовы другой ОС
(такие среды исполнения, как Wine, cygwin и т.п.), введение стандар- тов кодирования в языках программирования (например, стан- дартная библиотека языка С), написание интерпретируемых языков, реализуемых на разных платформах (sh, python, perl, php, tel, Java ИТ.Д.). Также необходимо отметить, что в распоряжении программиста часто находится несколько различных API, позволяющих добиться одного и того же результата. При этом каждый API обычно реализо- ван с использованием API программных компонент более низкого уровня абстракции. Например, для того чтобы увидеть в браузере строчку «Hello, world!», достаточно лишь создать HTML-документ с минимальным заголовком и простейшим телом, содержащим данную строку. Когда браузер откроет этот документ, программа-браузер передаст имя файла (или уже открытый дескриптор файла) библиотеке, обрабаты- вающей //ГЛ/Л-докумсн1ы; та, в свою очередь, при помощи API опе- рационной системы прочитает этот файл и разберется в его устрой- стве, затем последовательно вызовет через API библиотеки стан- дартных графических примитивов операции типа «очистить окошко», «написать “Hello, world!” выбранным шрифтом». Во время выполнения этих операций библиотека графических примитивов обратится к библиотеке оконного интерфейса с соответствующими запросами, уже эта библиотека обратится к API операционной сис- темы, чтобы записать данные в буфер видеокарты. При этом практически на каждом из уровней реально существует несколько возможных альтернативных API Например, мы могли бы писать исходный документ не на HTML, а на LaTeX, для о тображения могли бы использовать любой браузер. Различные браузеры, вообще говоря, используют различные //ГЛ/А-библиотски; и кроме того, все это может быть собрано с использованием различных библиотек примитивов и на различных операционных системах. Основными сложностями существующих многоуровневых систем API, таким образом, являются: • сложность портирования программного кода с одной системы API на другую (например, при смене ОС); • потеря функциональности при переходе с более низкого уровня на более высокий. Грубо говоря, каждый «слой» API создается для облегчения выполнения некоторого стандартного набора опера- ций. Но при этом реально затрудняется либо становится принци- пиально невозможным выполнение некоторых других операций, которые предоставляет более низкий уровень API.
7.4. Аппаратные средства защиты информации в микропроцессоре Рассмотрим основные механизмы защиты памяти, поддержива- емые аппаратурой микропроцессора. Если в памяти одновременно могут находиться несколько неза- висимых программ, необходимы специальные меры по предотвра- щению или ограничению обращений одной программы к областям памяти, используемым другими программами. Программы могут содержать такие ошибки, которые, если этому не воспрепятствовать, приводят к искажению информации, принадлежащей другим прог- раммам. Последствия таких ошибок особенно опасны, если разру- шению подвергнутся программы операционной системы. Другими словами, надо исключить несанкционированное воздействие прог- раммы пользователя на работу программ других пользователей и программ операционной системы. Чтобы воспрепятствовать разрушению одних программ другими, достаточно защитить область памяти данной программы от попыток записи в нее со стороны других программ, а в некоторых случаях — и своей программы (защита от записи)', при этом допускается обра- щение других программ к этой области памяти для считывания дан- ных. В других случаях, например при ограничениях на доступ к инфор- мации, хранящейся в системе, необходимо иметь возможность за- прещать другим программам производить как запись, так и считы- вание в данной области памяти. Такая защита от записи и считыва- ния помогает отладке программы, при этом осуществляется контроль каждого случая выхода за область памяти своей программы. Для облегчения отладки программ желательно выявлять и такие характерные ошибки в программах, как попытки использования дан- ных вместо команд или команд вместо данных в собственной прог- рамме, хотя эти ошибки могут и не разрушать информацию. Средства защиты памяти должны предотвращать: • неразрешенное взаимодействие пользователей друг с другом; • несанкционированный доступ пользователей к данным; • повреждение программ и данных из-за ошибок в программах; • намеренные попытки разрушить целостность системы; • случайные искажения данных. Средства защиты микропроцессора делятся на две группы: • защиту при управлении памятью; • защиту по привилегиям.
Средства управления памятью обнаруживают большинство прог- раммных ошибок. До загрузки селектора в сегментный регистр и кэширования де- скриптора осуществляется несколько контрольных проверок: • процессор проверяет, что поле Index селектора находится в пре- делах таблицы, определяемой его битом 77; • при загрузке селектора в сегментный регистр данных (DS, FS, FS, GS) тип дескриптора должен разрешать считывание из сегмента. Только выполняемые сегменты для этих регистров не допуска- ются, но сегменты с разрешенными операциями выполнения/счи- тывания допустимы; • в случае сегментного регистра стека (55) в сегменте должны быть разрешены операции считывания и записи; • при загрузке регистра CS сегмент должен быть обязательно ис- полняемым; • в регистр LDTR можно загружать только селектор, указывающий на дескриптор сегмента типа LDI\ • в регистр TR можно загружать только селектор, указывающий на дескриптор сегмента состояния задачи. Если хотя бы одна проверка дала отрицательный результат, то формируется особый случай и загрузка селектора не производится. После загрузки селектора при фактическом обращении к памяти процессор контролирует, чтобы запрашиваемая операция (чтение/ запись) для этого сегмента была разрешена. На этом этапе обнару- живаются и отвергаются попытки записи в сегмент кода или в только считываемые сегменты данных, а также считывание из сегмента кода, для которого разрешено только выполнение. Здесь же прово- дится проверка превышения сформированного смещения в сегменте длины сегмента, указанной в поле предела дескриптора. Такие си- туации невозможно выявить при загрузке селектора. Защита по привилегиям фиксирует более тонкие ошибки и наме- ренные попытки нарушить целостность системы. Под привилегиями понимается свойство, определяющее, какие операции и обрашения к памяти разрешается производить процес- сору при выполнении текущей задачи. На аппаратном уровне в процессоре поддерживаются четыре уровня привилегий. Распознаваемым процессором объектам назна- чается значение от 0 до 3, причем 0 соответствует высшему, а 3 — низшему уровню привилегий. С помощью указания уровня приви- легий и правил защиты обеспечивается управляемый доступ к про- цедурам и данным операционной системы и других задач.
Привилегии устанавливаются значениями соответствующих по- лей в следующих основных системных объектах микропроцессора: • DPL — уровень привилегий сегмента (находится в байте доступа дескриптора сегмента); • PPL — биты <0, 1> селектора, хранящегося в сегментном ре- гистре; • текущий уровень привилегий программы CPL задается полем RPL селектора, хранящегося з сегментном регистре CS, • IOPL — поле регистра флагов, которое указывает, на каком уровне привилегий разрешено выполнять операции ввода/вывода, а также в некоторых других объектах, используемых, например, при переключении задач и обработке прерываний. Так как число программ, которые могут выполняться на более высоком уровне привилегий, уменьшается к уровню 0 и так как прог- раммы уровня 0 действуют как ядро системы, уровни привилегий обычно изображаются в виде четырех колец защиты (Protection Rings) (рис. 7 8). Рис. 7.S. Кольца защиты Типовое распределение программ по кольцам защиты выглядит следующим образом. • уровень О’. ядро ОС, обеспечивающее инициализацию работы, управление доступом к памяти, защиту и ряд других жизненно важных функций, нарушение которых полностью выводит из строя процессор; • уровень Г. основная часть программ ОС (утилиты); • уровень 2'. служебные программы ОС (драйверы, СУБД, специа- лизированные подсистемы программирования и т.д.); • уровень 3: прикладные программы пользователя.
Аппаратные средства процессора, работающего в защищенном режиме, постоянно контролируют, что текущая программа доста- точно привилегированна для того, чтобы: • выполнять некоторые команды, называемые привилегирован- ными; • выполнять операции ввода/вывода на том или ином внешнем устройстве; • обращаться к данным других программ; • передавать управление внешнему (по отношению к самой прог- рамме) коду командами межсегментной передачи управления. Привилегированные команды — это те команды, которые влияют на механизмы управления памятью, защиты и некоторые другие жизненно важные функции. Это, например, команды загрузки таблиц дескрипторов GDT, IDT, LDT, команды обмена с регистрами управления CRi. Они могут выполняться только программами, име- ющими наивысший (нулевой) уровень привилегий. Это приводит к тому, что простую незащищенную систему можно целиком реали- зовать только в кольце 0, так как в других кольцах защиты не будут доступны все команды Операции ввода/вывода разрешено выполнять программам, уро- вень привилегий которых не ниже значения, установленного в поле IOPL регистра флагов. То есть должно выполняться соотношение CPL<IOPL. Обращение к данным других программ разрешается только на своем и менее привилегированном уровнях защиты (рис. 7.9). Рис. 7.9. Порядок взаимодействия программ и данных на разных уровнях привилегий Передачи управления между программами ограничиваются только текущим кольцом защиты. В го же время в процессе выпол- нения любой программы необходимо обращаться к программам, находящимся на более высоком уровне привилегий, например
к драйверам или СУБД. Для этих целей используются специально установленные точки входа в эти программы (шлюзы). Передача управления на более низкий уровень привилегий осуществляется с помощью механизма подчиненных сегментов. При передаче управления подчиненному сегменту действует пра- вило DPL >- max (CPL. RPL). Однако при этом подчиненный код будет выполняться на том же уровне привилегий, что и вызвавший его код (CPL не изменится). Ограничивая передачу управления в пре- делах одного кольца зашиты, процессор предотвращает произволь- ное изменение уровней привилегий. Если бы значение CPL можно было легко изменить, все остальные средства защиты по привиле- гиям потеряли бы смысл. 7.5. Использование шлюзов вызова В процессе работы программам постоянно приходится обращаться к программам, находящимся на более высоком уровне привилегий, например к драйверам внешних устройств, системам программиро- вания. Прямой бесконтрольный вызов таких программ запрещается средствами защиты. Однако если к какой-либо системной программе предусматривается обращение со стороны менее привилегированных программ, то для нее создается специальный объект — шлюз вызова. Здесь наиболее интересный момент связан с реализацией этого шлюза. С одной стороны, пользователю необходимо предоставить возможность выполнить необходимую ему более привилегирован- ную программу. Но, с другой стороны, бесконтрольный вызов таких программ, например запуск драйвера с его середины вследствие ошибок программирования или злого умысла, может привести к не- предсказуемым последствиям. Таким образом, необходимо дать воз- можность обращаться к системным программам, но обращаться, только начиная с определенной фиксированной точки кода. Шлюзы вызова — это некоторые системные объекты, которые обеспечивают вход в строго определенную точку программы, находящейся на более высоком уровне привилегий. Шлюз должен быть предварительно помещен в таблицу дескрип- торов. Дескрипторы шлюзов не определяют никакого адресного про- странства, поэтому в них нет полей базы и предела, т.е. они факти- чески не являются дескрипторами. Обращение к более привилеги- рованным программам производится командами, аналогичными командам обращения к подпрограммам в другом кодовом сегменте (команды типа PAR CALL).
То есть нельзя перейти в более привилегированный сегмент ко- мандой с полной передачей управления: «пришел на уровень с более высокими привилегиями и там остался», а переход возможен только с помощью команд с возвратом. Эти команды должны адресовать шлюз вызова, а не сегмент кода назначения. Шлюз вызова опреде- ляет сегмент кода, которому передается управление, и точное сме- щение в этом сегменте, где начинается выполнение процедуры. Формат шлюза вызова представлен на рис. 7.10. Селектор Смещение Р DPL WC |б 32 , 5 64 бита Рис. 7.10. Формат шлюза вызова Шлюз вызова содержит селектор того сегмента, куда передается управление, и смещение в этом сегменте. Это, с одной стороны, по- зволяет найти данную программу, но, с другой стороны, строго опре- деляет точку входа в протрамму, чтобы можно было запустить ее только со строго определенного места. Другими важными параметрами, определяемыми шлюзом вызова, являются: Р — бит присутствия; WC — количество параметров, пе- редаваемых из стека текущей программы в стек вызываемой прог- раммы; DPL — уровень привилегий. При использовании шлюза вызова проводится следующий анализ уровней привилегий: • значение DPL шлюза вызова должно быть больше или равно зна- чению текущего уровня привилегий CPL и значению RPL селек- тора, вызывающего шлюз; • значение DPL шлюза вызова должно быть больше или равно зна- чению DPL целевого сегмента кода; • значение DPL целевого сегмента кода должно быть меньше или равно значению текущего уровня привилегий CPL. Порядок использования шлюза вызова представлен на рис. 7.11. 1. Как любая команда межсегментного перехода команда, FAR CALL содержит селектор сегмента и смещение в этом сегменте. Сме- щение, которое указано в команде, микропроцессор игнорирует: по- ложение вызываемого кода в более привилегированном сегменте определяется не им, а шлюзом вызова. По селектору, определенному в команде, идет обращение к таблице дескрипторов. По типу дескрип- тора определяется, что это системный объект типа «шлюз вызова».
Рис. 7.11. Использование шлюза вызова для обращения к программам на более высоком уровне привилегий 2. Селектор из шлюза вызова заносится в регистр CS микропро- цессора, а смешение — в регистр указателя команд EIP. 3. По полученному селектору обращаемся к дескриптору сег- мента более привилегированной программы. 4. Из дескриптора извлекается базовый адрес нового сегмента. Его суммирование со значением смещения из шлюза вызова, занесенного в EIP, определяет физический адрес начала новой программы. Иначе говоря, с помощью такой многоступенчатой обработки ко- манды перехода мы получаем доступ к более привилегированной прог- рамме. Но для этого поле DPL шлюза должно быть установлено таким, чтобы к нему могла обратиться менее привилегированная программа. То есть если мы хотим, чтобы пользовательские программы могли вы- зывать некоторую программу, находящуюся, например, на уровне при- вилегий 1, то DPL шлюза этой программы должен быть равен 3. Предположим теперь, что пользователь хочет воспользоваться некоторыми системными утилитами. Пусть пользовательская прог- рамма имеет уровень привилегий 3, ядро ОС — уровень 0, утилиты ОС — уровень 1 (рис. 7.12). В этом случае шлюз утилиты должен иметь DPL-3. Это позволит пользовательской программе вызвать утилиты ОС, но не ее ядро. При необходимости к ядру операционной системы могут обратиться утилиты. Механизм вызова: • шлюзу утилит присваивается уровень привилегий 3, обеспечивая его доступность пользовательским программам;
Шлюз с DpL = 1 Рис. 7.12. Последовательное обращение к более привилегированным программам • шлюзу ядра присваивается уровень привилегий 1, что делает его доступным для программ-утилит, но обращение пользовательских программ к шлюзу ядра невозможно. Таким образом, программа может последовательно обратиться к ряду более привилегированных программ. Конкретная ОС не обязательно должна поддерживать все четыре уровня привилегий. Так, ОС UNIX работает с двумя кольцами за- щиты: супервизор (уровень 0) и пользователь (уровни 1, 2, 3). Опера- ционная система OS/2 поддерживает три уровня: код ОС работает в кольце 0, специальные процедуры для обращения к устройствам ввода/вывода действуют в кольце 1, а прикладные программы выпол- няются в кольце 3. В Windows NT используются только два уровня привилегий: нулевое и третье кольца. В нулевом кольце работает ядро системы и системные драйверы, а в третьем — все запущенные при- ложения. Привилегированные команды и ввод/вывод для третьего кольца запрещены. Для взаимодействия с аппаратной частью ком- пьютера пользовательские программы вызывают системные сервисы ядра ОС. обращение к которым оформлено как шлюзы. При вызове такого шлюза процесс переходит в нулевое кольцо, и там ядро ОС и драйверы обрабатывают запрос и возвращают результаты приложе- нию. После перехода в нулевое кольцо приложение не может как- либо контролировать свое исполнение, пока управление не будет возвращено коду третьего кольца. Это является необходимым усло- вием защиты, обеспечивающим безопасность всей системы. Защита по привилегиям начинает работать уже на этапе загрузки селектора в сегментные регистры. При загрузке селектора в сегмент-
ные регистры данных должно выполняться соотношение DPL < < maxiCPL. RPL), а при загрузке селектора в сегментный регистр стека 55 должно быть выполнено соотношение DPL = CPL. При страничном преобразовании адреса применяется простой двухуровневый механизм защиты по привилегиям: пользователь (со- ответствует уровню 3 привилегий сегмента) и супервизор (уровни О, 1,2), указываемый в бите U/S ЭТС. При сегментно-страничной организации памяти производится объединение защиты сегментов и страниц: сначала реализуется за- щита сегментов, а затем — защита страниц. Например, допускается определить большой сегмент данных, в котором некоторые части будут только считываемые, а другие допускают считывание и запись. В такой ситуации элементы каталога таблиц страниц и/или элементы таблиц страниц должны иметь соответствующие значения атри- бута R/W. Контрольные вопросы и задания 1. Составьте алгоритм действий для считывания или записи информации на дискету. 2. Постройте схему работы процессора в многозадачной системе с тремя работающими параллельно процессами 3. Опишите процедуру загрузки программы с совместной заменой вирту- альных адресов физическими адресами. 4. Опишите процедуру динамического преобразования виртуальных ад- ресов. 5. Что такое виртуальный адрес, виртуальное адресное пространство? 6. Функции ОС по управлению памятью в мультипрограммной среде. 7. Типы виртуальных адресных пространств. 8. Виды алгоритмов распределения памяти. 9. Подходы к преобразованию виртуальных адресов в физические. 10. Страничная организация памяти. 11. Динамическое преобразование виртуальных адресов. 12. Назначение перемещающего загрузчика. 13. Понятие процессов, потоков и файберов. 14 Приведите примеры наиболее часто применяемых системных вызовов стандарта POS1X. 15. Средства создания и завершения процессов. 16. Основные средства создания и завершения процессов на примере опе- рационной системы UNIX. 17. Примеры вызовов Win32 API. 18. Укажите основные сложности существующих многоуровневых систем API
19. Какие основные требования предъявляются к средствам защиты па- мяти? 20. В чем заключается механизмы защиты, используемый при управлении памятью? 21. 22. Что такое защита по привилегиям? Преимущество использования шлюзов вызова.
Глава 8 УРОВЕНЬ АССЕМБЛЕРА Мы рассмотрели три уровня архитектуры вычислительных ма- шин В этой главе речь пойдет о еще одном уровне, который также присутствует в архитектуре практически всех современных машин. Это уровень ассемблера, который существенно отличается от трех предыдущих уровней, поскольку он реализуется путем трансляции, а не интерпретации. Па этом уровне рассмотрим описание ассемб- лера и архитектуры MIPS с использованием примеров для разных архитектур ЭВМ, логику работы компьютера с памятью, а также не- которые особенности режимов адресации. 8.1. Язык ассемблера. Начальные сведения Ассемблер — транслятор исходного текста программы, написан- ной на языке ассемблера, в программу на машинном языке. Язык ассемблера (англ, assembly language) — машинно-ориенти- рованный язык низкого уровня с командами, не всегда соответству- ющими командам машины, коюрый может обеспечить дополнитель- ные возможности вроде макрокоманд; автокод, расширенный кон- струкциями языков программирования высокого уровня, такими как выражения, макрокоманды, средства обеспечения модульности протрамм. Данный тип языков получил свое название от названия трансля- тора (компилятора) с этих языков — ассемблера (англ, assembler — сборщик). Название обусловлено тем, что программа «автоматически собиралась», а не вводилась вручную покомандно непосредственно в кодах. При этом наблюдается путаница терминов: ассемблером нередко называют не только транслятор, но и соответствующий язык программирования («программа на ассемблере»). Использование термина «язык ассемблера» также может вызвать ошибочное мнение о существовании некоего единого языка низкого уровня или хотя бы стандартов на такие языки. При именовании языка ассемблера желательно уточнять, ассемблер для какой архи- тектуры имеется в виду.
Язык ассемблера — система обозначений, используемая для пред- ставления в удобочитаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфа- витными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и дает возможность помечать строки программы метками с символическими именами, с тем чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления). Перевод программы на языке ассемблера в исполнимый машин- ный код (вычисление выражений, раскрытие макрокоманд, замена мнемоник собственно машинными кодами и символьных адресов на абсолютные или относительные адреса) производится ассембле- ром — программой-транслятором, которая и дала языку ассемблера его название. Команды языка ассемблера один к одному соответствуют коман- дам процессора. Фактически они и представляют собой более удоб- ную для человека символьную форму записи — мнемокоды — ко- манд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора. Кроме того, язык ассемблера позволяет использовать символиче- ские метки вместо адресов ячеек памяти, которые при ассемблиро- вании заменяются на вычисляемые ассемблером или компоновщи- ком абсолютные или относительные адреса, а также так называемые директивы (команды ассемблера, не переводимые в машинные ко- манды процессора, а выполняемые самим ассемблером). Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами. Каждая модель (или семейство) процессоров имеет свой набор — систему — команд и соответствующий ему язык ассемблера. Наи- более популярные синтаксисы языков ассемблера — Intel-синтаксис и AT&T-синтаксис. Достоинства'. Язык ассемблера позволяет писать самый быстрый и компактный код, какой вообще возможен для данного процессора. Если код программы достаточно большой — данные, которыми он оперирует, не помещаются целиком в регистрах процессора,
т.е. частично или полностью находятся в оперативной памяти, то искусный программист, как правило, способен значительно оп- тимизировать программу по сравнению с транслятором с языка вы- сокого уровня по одному или нескольким параметрам и создать код, близкий к оптимальному по Парето (как правило, быстродействие программы достигается за счет удлинения кода, и наоборот): • скорость работы — за счет оптимизации вычислительного алго- ритма и/или более рационального обращения к оперативной па- мяти (ОП) (например, если все исходные данные хранятся в ре- гистрах процессора, то можно исключить излишние обращения к ОП), перераспределения данных, табличного вычисления функций; • объем кода (в том числе за счет эффективного использования промежуточных результатов). Сокращение объема кода также не- редко повышает скорость выполнения программы. Обеспечение максимального использования специфических воз- можностей конкретной платформы, что также позволяет создавать более эффективные программы, в том числе менее ресурсоемкие. При программировании на языке ассемблера возможен непосред- ственный доступ к аппаратуре, в частности портам ввода/вывода, регистрам процессора и др. Во многих операционных системах пря- мое обращение из прикладных программ для записи в регистры пе- риферийного оборудования блокировано для надежности работы системы и исключения «зависаний». Язык ассемблера часто применяется для создания драйверов обо- рудования и ядра операционной системы (или машинно-зависимых подсистем ядра ОС), тогда, когда важно временное согласование работы периферийных устройств с центральным процессором. Язык ассемблера используется для создания «прошивок» BIOS. С помощью языка ассемблера часто создаются машинно-зависи- мые подпрограммы компиляторов и интерпретаторы языков высо- кого уровня, а также реализуется совместимость платформ. С помощью программы дизассемблера можно понять алгоритмы работы исследуемой программы при отсутствии листинга на высо- коуровневом языке, изучая только машинные коды, но в сложных нетривиальных программах это очень и очень трудоемко. Недостатки'. В силу машинной ориентации («низкого» уровня) языка ассемб- лера человеку сложнее читать и понимать программу на нем по срав- нению с языками программирования высокого уровня; программа состоит из слишком «мелких» элементов — машинных команд; со-
ответственно, усложняются программирование и отладка, растут трудоемкость и вероятность внесения ошибок. Требуется повышенная квалификация программиста для получе- ния качественного кода: код, написанный средним программистом на языке ассемблера, обычно оказывается не лучше или даже хуже кода, порождаемого оптимизирующим компилятором для сравни- мых программ, написанных на языке высокого уровня [5]. Программа на языке высокого уровня может быть перекомпили- рована с автоматической оптимизацией под особенности новой це- левой платформы, программа же на языке ассемблера на новой плат- форме может потерять свое преимущество в скорости без ручного переписывания кода. Как правило, меныпее количество доступных библиотек по срав- нению с современными индустриальными языками программиро- вания. Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд. Применение языка ассемблера Исторически если первым поколением языков программиро- вания считать машинные коды, то язык ассемблера можно рассмат- ривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нем больших прог- раммных комплексов привели к появлению языков третьего поко- ления — языков программирования высокого уровня (таких как Фортран, Лисп, Кобол, Паскаль, Си и др.). Именно языки прог- раммирования высокого уровня и их наследники в основном исполь- зуются в настоящее время в индустрии информационных техноло- гий. Однако языки ассемблера сохраняют свою нишу, обусловленную их уникальными преимуществами в части эффективности и возмож- ности полного использования специфических средств конкретной платформы. На языке ассемблера пишут программы или их фрагменты в тех случаях, когда критически важны: • быстродействие (драйверы, игры); • объем используемой памяти (загрузочные секторы, встраиваемое (англ, embedded) программное обеспечение, программы для ми- кроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты). С использованием программирования на языке ассемблера про- изводятся.
• оптимизация критичных к скорости участков программ в про- граммах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фик- сированную производительность, и для мультимедийных кодеков, которые стремятся делать менее ресурсоемкими и более быст- рыми; • создание операционных систем (ОС) или их компонентов. В на- стоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си — языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (hardware abstraction layer) и ядро, часто пишутся на языке ассемблера Фактически ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надежность, но, тем не менее, он там присутствует. Некоторые любительские ОС, такие как MenuetOS и KolibriOS, целиком написаны на языке ассемблера. При этом MenuetOS и KolibriOS помещаются на дискету и содержат графи- ческий многооконный интерфейс; • программирование микроконтроллеров (МК) и других встраива- емых процессоров По мнению профессора Таненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени [9]. Сейчас для программирования МК весьма часто при- меняют язык ассемблера (хотя и в этой области широкое распро- странение получают языки вроде Си) В МК приходится переме- щать отдельные байты и биты между различными ячейками па- мяти. Программирование МК весьма важно, так как, по мнению Таненбаума, в автомобиле и квартире современного цивилизован- ного человека в среднем содержится 50 микроконтроллеров [1]; • создание драйверов. Драйверы (или их некоторые программные модули) программируют на языке ассемблера. Хотя в настоящее время драйверы также стремятся писать на языках высокого уровня (на высокоуровневом языке много проще написать на- дежный драйвер) в связи с повышенными требованиями к надеж- ности и достаточной производительностью современных процес- соров (быстродействие обеспечивает временное согласование процессов в устройстве и процессоре) и достаточным совершен- ством компиляторов с языков высокого уровня (отсутствие не- нужных пересылок данных в сгенерированном коде), подавля- ющая часть современных драйверов пишется на языке ассемб-
лера. Надежность для драйверов играет особую роль, поскольку в Windows NT и UNIX (в том числе в Linux) драйверы работают в режиме ядра системы. Одна тонкая ошибка в драйвере может привести к краху всей системы; • создание антивирусов и других защитных программ; • написание трансляторов языков программирования. Связывание программ на разных языках Поскольку уже давно на языке ассемблера часто кодируют только фрагменты программ, их необходимо связывать с остальными ча- стями программной системы, написанными на других языках прог- раммирования. Это достигается двумя основными способами. 1. На этапе компиляции — вставка в исходный код программы на языке высокого уровня ассемблерных фрагментов (англ, inline assembler) с помощью специальных директив языка. Способ удобен для несложных преобразований данных, но полноценного ассем- блерного кода с данными и подпрограммами, включая подпрог- раммы со множеством входов и выходов, не поддерживаемые языком высокого уровня, с его помощью сделать невозможно. 2. На этапе компоновки при раздельной компиляции. Для взаи- модействия компонуемых модулей достаточно, чтобы импортиру- емые функции (определенные в одних модулях и используемые в других) поддерживали определенное соглашение о вызове (англ, calling conventions). Написаны же отдельные модули могут быть на любых языках, в том числе и на языке ассемблера. 8.2. Основы программирования на языке ассемблера Программируя на ассемблере, необходимо хорошо представлять, как данные размещены в памяти компьютера. Команды, исполня- емые компьютером, могут быть записаны в безадресном (операнд включен в код команды), одноадресном, двухадресном и трехадрес- ном форматах. Иными словами, с помощью адресации определяются адреса размещения операндов в памяти компьютера. Перечислим режимы адресации, которые чаще всего использу- ются при программировании компьютеров семейства Intel х86, а также могут быть применены на платформе MIPS. При программи- ровании важно учитывать, что предлагаемый список доступных режимов требуется уточнять в зависимости от того, какова архитек- тура целевой вычислительной системы.
В непосредственном режиме адресации (immediate addressing mode) сведения, необходимые для доступа к данным, включаются в ко- манду процессора. К примеру, если мы хотим инициализировать ре- гистр, поместив туда ноль, разумнее всего будет не указывать адрес, откуда можно прочитать ноль, а использовать непосредственный режим адресации, указав ноль в качестве операнда команды Иными словами, при непосредственной адресации значение в формате байта, слова или двойного слова (машинное слово — это количество данных, которое процессор может обработать за одну операцию) передается в регистр-приемник или в память. Обычно машинное слово по длине равно размеру регистра общего назначе- ния процессора. На рынке широко доступны процессоры, опериру- ющие словами по 4 байта (х86-32, MIPS32) и по 8 байт (х86-64, MIPS64). Непосредственный операнд может бытв задан в различных сис- темах счисления (шестнадцатеричной, двоичной, десятичной). Сим- волы ASCII непосредственно задаются числовым кодом или буквой в кавычках. В режиме регистровой адресации (register addressing mode) команда содержит имя регистра, в котором хранятся числа для обработки. Копия байта, слова или двойного слова из регистра-источника пе- редается в регистр-приемник. Размерность регистров источника и приемника должна быть одинаковой. Прямой режим адресации (direct addressing mode) подразумевает указание адреса памяти в качестве операнда команды (адрес данных в памяти образуется совокупностью значения, содержащегося в сег- ментном регистре, и смещения, заданного в команде). Данные пере- сылаются между памятью и регистром. К примеру, можно сказать: «Компьютер, загрузи, пожалуйста, в регистр данные, содержащиеся в памяти по адресу 2002.». Среагировав на наши слова, компьютер перейдет к байту номер 2002 и скопирует его содержимое в нужный регистр. В режиме индексной адресации (indexed addressing mode) команда содержит в качестве операнда базовый адрес, а также имя индексного регистра, содержащего значение смещения от базового адреса. К примеру, если базовый адрес равен 2002, а смещение равно 4, то адрес, по которому обратится команда, будет равен 2006. С помощью индексной адресации можно организовывать циклы, в которых происходит последовательное обращение к ячейкам па- мяти, имеющим адрес, находящийся с разным смещением от базо- вого адреса (базово-индексная адресация).
Процессоры х86 поддерживают использование множителя (mul- tiplier), записываемого в индексный регистр (индексная адресация с масштабированием). Это позволяет получать доступ к участкам па- мяти по байту или по машинному слову за один проход цикла, а также переходить к нужному участку памяти. Операндами команды могут являться: • данные, которые явно либо неявно задаются машинной командой и которые должны быть обработаны либо выработаны в ходе ис- полнения машинной команды; • явная ссылка в машинной команде на такие данные; • место, где находятся или должны быть помещены такие данные: позиции в оперативной, внешней, внутренней или управляющей памяти, общие и специальные регистры, флаги, поля признаков, входы и выходы управляющих сигналов. Работа с регистрами процессора выполняется намного быстрее, чем с ячейками оперативной памяти, поэтому регистры активно ис- пользуются как в программах на языке ассемблера, так и компиля- торами языков высокого уровня. Регистр — это функциональный узел, осуществляющий прием, хранение и передачу информации Регистры состоят из группы триг- геров, обычно D. По типу приема и выдачи информации различают два типа регистров: • с последовательным приемом и выдачей информации — сдвиго- вые регистры; • с параллельным приемом и выдачей информации — параллель- ные регистры. Сдвиговые регистры представляют собой последовательно соеди- ненную цепочку триггеров. Основной режим работы — сдвиг разря- дов кода от одного триггера к другому на каждый импульс тактового сигнала. По назначению регистры разделяются: • на аккумулятор — используется для хранения промежуточных результатов арифметических и логических операций и ин- струкций ввода/вывода; • флаговые — хранят признаки результатов арифметических и ло- гических операций; • общего назначения — хранят операнды арифметических и логи- ческих выражений, индексы и адреса; • индексные — хранят индексы исходных и целевых элементов мас- сива;
• указательные — хранят указатели на специальные области памяти (указатель текущей операции, указатель базы, указатель стека); • сегментные — хранят адреса и селекторы сегментов памяти; • управляющие — хранят информацию, управляющую состоянием процессора, а также адреса системных таблиц. В табл. 8.1 показано количество регистров общего назначения в нескольких распространенных архитектурах микропроцессоров. Стоит отметить, что в некоторых архитектурах использование от- дельных регистров может быть осложнено. Так, в SPARC и MIPS ре- гистр номер ноль не сохраняет информацию и всегда считывается как 0, а в процессорах х86 с регистром ESP (указатель на стек) могут работать лишь некоторые команды. Таблица 8.1 Количество регистров общего назначения в архитектурах микропроцессоров Архитектура Целочисленных регистров FP регистров Примечание х86-32 8 8 х86-64 16 16 IBM Systcm/360 16 4 z/Architecture 16 16 Itanium 128 128 SPARC 31 32 Регистр 0 (глобальный) всегда занулен IBM Cell 4~16 1~4 IBM POWER 32 32 Power Architecture 32 32 Alpha 32 32 6502 3 0 W65C816S 5 0 PIC 1 0 AVR 32 0 ARM 32-bit[ 16 varies ARM 64-bit[ 31 32 MIPS 31 32 Регистр 0 всегда занулен Регистры архитектуры х86. IP (англ. Instruction Pointer) — регистр, указывающий на смещение (адрес) инструкций в сегменте кода (1234:01 ОО/г сегмент/смещение)' • IP — 16 - битный (младша я часть EIP);
• EIP — 32-битный аналог (младшая часть RIP)', • RIP — 64-битный аналог. Сегментные регистры — регистры, указывающие на сегменты: CS (англ. Code Segment), DS (англ. Data Segment), SS (англ. Stack Seg- ment), ES (англ. Extra Segment), FS, GS. В реальном режиме работы процессора сегментные регистры со- держат адрес начала 64 Кбайт сегмента, смещенный вправо на 4 бита. В защищенном режиме работы процессора сегментные регистры содержат селектор сегмента памяти, выделенного ОС. CS — указатель на кодовый сегмент. Связка CS IP (CS'. EIP/CS'. RIP — в защищенном/64-битном режиме) указывает на адрес в па- мяти следующей команды. Регистры данных — служат для хранения промежуточных вычис- лений. RAX RCX RDX RBX | ЕАХ 1 ЕСХ EDX ЕВХ АХ сх DX ВХ АН\AL CH CL DH\ DL вн\ BL Регистр флагов FLAGS (16 бит)/EFLAGS (32 бита)/RFLAGS (64 бита) — содержит текущее состояние процессора. Системные регистры GDTR, LDTR и IDFR введены в процессорах, начиная с 1 nte!286, и предназначены для хранения базовых адресов таблиц дескрипторов — важнейших составляющих системной архи- тектуры при работе в защищенном режиме. Регистр GDTR содержит 32-битный (24-битный для Intel286) ба- зовый адрес и 16-битный предел глобальной таблицы дескрипторов (GDT). Видимая часть регистра LDTR содержит только селектор дескрип- тора локальной таблицы дескрипторов (LDT). Сам дескриптор LDT автоматически загружается в скрытую часть LDTR из глобальной таблицы дескрипторов. Регистр IDTR содержит 32-битный (24-битный для Intel286) ба- зовый адрес и 16-битный предел таблицы дескрипторов прерываний (IDT). В реальном режиме может быть использован для изменения местоположения таблицы векторов прерываний. Видимая часть регистра TR содержит селектор дескриптора сег- мента состояния задачи (TSS). Сам дескриптор TSS автоматически загружается в скрытую часть TR из глобальной таблицы дескрипто- ров.
Счетчик команд. Счетчик команд (также PC — program counter, IP — instruction pointer, I AR — instruction address register, СЧАК — счетчик адресуемых команд) — регистр процессора, содержащий адрес текущей выполняемой команды. В зависимости от архитектуры содержит либо адрес инструкции, которая будет ввшолняться, либо той, которая выполняется в данный момент. В большинстве процессоров после выполнения команды, если она не нарушает последовательности команд (например, команда перехода), счетчик автоматически увеличивается (постинкремент). Понятие счетчика команд сильно связано с фон-неймановской ар- хитектурой, одним из принципов которой является выполнение ко- манд друг за другом в определенной последовательности. IP (англ. Instruction Pointer) — регистр, содержащий адрес-сме- щение следующей команды, подлежащей исполнению, относительно кодового сегмента CS в процессорах семейства х86. Регистр IP связан с CS в виде С S '. IP, где CS является текущим кодовым сегментом, а 1Р — текущим смещением относительно этого сегмента. Регистр IP является 16-разрядным регистром-указателем. Кроме него, в состав регистров этого типа входят SP (англ Stack Pointer — указатель стека) и ВР (англ. Base Pointer — базовый указатель). Принцип работы. Например, CS содержит значение 2С85[0]Я, в регистре IP хранится смещение 123Я. Адрес следующей инструкции, подлежащей исполнению, вычи- сляется путем суммирования адреса в CS (сегменте кода) со смеще- нием в регистре IP'. 2СВ50Н+ 123Я= 2СС73Я. Таким образом, адрес следующей инструкции для исполнения равен 2СС73/7 При выполнении текущей инструкции процессор автоматически изменяет значение в регистре IP, в результате чего регистровая пара CS : IP всегда указывает на следующую подлежащую исполнению инструкцию. EIP. Начиная с процессора 80386, была введена 32-разрядная вер- сия регистра-указателя — Е1Р (англ. Extended Instruction Pointer). В данном случае IP является младшей частью этого регистра (первые 16 разрядов). Принцип работы EIP к целом схож с работой регистра IP. Основная разница состоит в том, что в защищенном режиме в от- личие от реального режима регистр CS является селектором (селск-
тор указывает не на сам сегмент в памяти, а на дескриптор сегмента в таблице дескрипторов). RIP. В 64-разрядных процессорах используется свой регистр-ука- затель инструкций — RIP Младшей частью этого регистра является регистр EIP. На основе RIP в 64-разрядных процессорах введен новый метод адресации RIP-relative. В остальном работа RIP аналогична работе регистра EIP Основные понятия языка ассемблера Синтаксис. Синтаксис языка ассемблера определяется системой команд конкретного процессора. Набор команд. Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры х86): • команды пересылки данных (mov и др.); • арифметические команды (add, sub, imul и др.); • логические и побитовые операции (or, and, xor, shr и др.); • команды управления ходом выполнения программы (jmp, loop, ret и др.); • команды вызова прерываний (иногда относят к командам управ- ления): inf, • команды ввода/вывода в порты (in, out). Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например: • cjne — перейти, если не равно; • djnz — декрементировать, и если результат ненулевой, то перейти; • cfsneq — сравнить, и если не равно, пропустить следующую ко- манду. Инструкции. Типичный формат записи команд: [метка:] [[префикс] мнемокод [операнд {, операнд}]] [; комментарий], где мнемокод — непосредственно мнемоника инструкции процес- сору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.). В качестве операндов могут выступать константы, адреса реги- стров, адреса в оперативной памяти и пр Различия между синтакси- сом Intel и AT&T касаются в основном порядка перечисления опе- рандов и указания различных методов адресации. Используемые мнемоники обычно одинаковы для всех процес- соров одной архитектуры или семейства архитектур (среди широко
известных — мнемоники процессоров и контроллеров х86, ARM, SPARC, PowerPC, М68к). Они описываются в спецификации процес- соров. Возможные исключения: • если ассемблер использует кроссплатформенный AT&Т-синтаксис (оригинальные мнемоники приводятся к синтаксису AT&T); • если изначально существовало два стандарта записи мнемоник (система команд была наследована от процессора другого произ- водителя). Например, процессор Zilog Z80 наследовал систему команд Intel 8080, расширил ее и поменял мнемоники (и обозначения регистров) на свой лад. Процессоры Motorola Fireball наследовали систему ко- манд Z80, несколько ее урезав. Вместе с тем, «Motorola» официально вернулась к мнемоникам «Intel», и в данный момент половина ас- семблеров для Fireball работает с мнемониками «Intel», а половина — с мнемониками Zilog Директивы. Программа на языке ассемблера может содержать ди- рективы — инструкции, не переводящиеся непосредственно в ма- шинные команды, а управляющие работой компилятора Набор и синтаксис их значительно разнятся и зависят не от аппаратной платформы, а от используемого транслятора (порождая диалекты языков в пределах одного семейства архитектур). В качестве основ- ного набора директив можно выделить следующие: • определение данных (констант и переменных); • управление организацией программы в памяти и параметрами выходного файла; • задание режима работы компилятора; • всевозможные абстракции (т.е. элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования); • макросы. Использование стека Напомним, что стеком называется область памяти, предназна- ченная для временного хранения данных. Для этой области в прог- рамме выделяется сегмент объемом 64 Кбайт, который называется сегментом стека. Для работы со стеком предназначены следующие регистры: • S5 — сегментный регистр стека; • SP — регистр указателя базы.
Доступ к содержимому стека осуществляется также с помощью регистра ВР. Команды работы со стеком организованы в соответствии с прин- ципом LIFO (последним пришел — первым ушел): • РСАУЯ-операнд, запись операнда в стек; • Т’О/’-операнд; чтение операнда из стека Команда PUSH сначала вычитает из регистра SP число 2, умень- шая тем самым адрес начала стека на 2, а затем записывает операнд в начало стека. Команда POP, напротив, сначала считывает слово из начала стека и записывает его в операнд, а затем увеличивает зна- чение регистра SP на 2. Если операндом является двойное слово, то команда PUSH вычи- тает из SP число 4, а команда POP увеличивает SP на 4. Пример. Команды push ICO; записать число 1СС з стек pop Ьх; извлечь из стека установят Ьх = 100. При разработке подпрограмм рекомендуется в начале подпрог- раммы сохранять значения всех используемых в ней регистров в стек, а в конце — восстанавливать. Сохранение делается с помощью ко- манды pusha; сохранить в стек АХ, СХ, DX, ВХ, SP, ВР, SI, DI Регистры сохраняются в стек в указанном порядке. Восстановление: рора Слова, выбираемые из стека, размещаются в регистрах DI, SI. ВР, *, ВХ, DX, СХ, АХ, где символом * обозначено слово, которое игно- рируется, вместо того чтобы быть помещенным в регистр SP. Команды работы со стеком можно использовать для установки флагов: pushf; запомнить регистр FL в стек popf; слово извлекается из стека и записывается в FL Команда PUSHF не изменяет разряды регистра FL, a POPF, на- против, записывает в FL новое слово и, значит, воздействует на все флаги. Пример программы Примеры программы Hello, world! для разных платформ и разных диалектов:
Пример СОМ-программы для MS-DOS на диалекте TASM\ .MODEL TINY CODE SEGMENT ASSUME CS: CODE, DS: CODE ORG 10Oh START: mov ah,9 mov dx, OFFSET Msg int 21h int 2 Ch Msg DE 'Hello World',13,10,'$' CODE ENDS END START Пример EXE-программы для MS-DOS на диалекте TASM\ .MODEL SMALL • DATA msg DB 'Hello World',13,10,'$' .CODE START: mov ax, @DATA mov ds ax mov ax, C9C0h lea dx, msg int 21h mov ax, 4CC0h int 21h El® START Пример программы для Linux/x86 на диалекте NASM. SECTION.data msg: db "Hello, world",10 len: equ $-msg SECTION.text global _start _start: mov edx, ler. mov ecx, msg mov ebx, 1; stdout mov eax, 4; wrice(2) int 0x80 mov ebx, C mov eax, 1; exit(2) int 0x80
Пример программы для FreeBSD/x86 на диалекте NASM'. SECTION.daга msg: db "Hello, world",IC len: equ $-msg SECTION.text global _start syscall: int 0x80 ret _start: push len push msg push 1; stdout mov eax, 4; write(2) call syscall add esp, 3*4 push 0 mov eax, 1; exit(2) call syscall Пример программы для Microsoft Windows на диалекте MASM\ .386 .model flat, stdcall option casemap: none include \masm32\include\wir.dows,inc include \masm32\include'kerne!32.inc incluaelib \masm32\lib\kernel32.lib .data msg db "Eello, world". 13, 10 len equ $-msg .data? written dd? .code start: push -11 call GetStdEandle push 0 push OFFSET written push len push OFFSET msg
push eax call WriteFile push C call Exitprocess end scare Пример консольной программы для Windows на диалекте FASM'. format РЕ console entry start include 'include\win32a.inc' section '.data' data readable writeable message db 'Hello, world!',0 section '.code' code readable executable scart; ; CINVOKE макрос: в составе FASM. ; Позволяет везевэть CPECL-фучкции. cinvoke printf, message cinvoke gecch ; INVOKE аналогичный макрос для STDCALL функций. invoke Exit?rocess,0 section '.idata' import data readable library kernel,'kernel32.dll',\ msvert,'msvert.dll' import kernel,\ ExicProcess,'ExicProcess' import msvcrt,\ prinef,'prinef',\ gecch,'_gecch' Пример 64-битной программы для Windows на диалекте YASM (с использованием линковщика от Microsoft): ; yasm-1 C.C-win32.exe -f win64 HelloWorld_Yasm.asm ; setenv /Release /х64 /xp ; link HelloWorld_Yasm.obj Kernel32.1ib Use.r32.lib /entry: main / subsystem: windows /LARCEADDRESsAWARE: NO bits 64 global main extern MessageBoxA extern ExitProcess
section.data mytit db 'The 64-bit world of Windows & assembler...', C mymsg db 'Hello World!', C section.text main: mov r9d, 0 mov r8, mytit mov rdx, mymsg mov rex, C call MessageBoxA mov ecx, eax call ExitProcess ; uType = MB_OK ; LPCSTR IpCaption ; LPCSTR lpText ; hwnd = HWND_DESKTOP ; uExitCode = MessageBox(...) ret Пример программы для Solaris и архитектуры SPARC. .section ".data" hello: .asciz "Hello World!\n" .section ".text" .align 4 .global main main: save %sp, --96,%sp ! выделяем память mov 4,%gl ! 4 - WRITE (системный вызов) mov 1,%оС ! 1 = STDOUT sec heJlo,%ol mov 14,%o2 ! количество символов ta 3 ! вызов системы ! выход из программы mov l,%gl ! move 1(exit() syscall) inco%gl mov C,%oC ! move 0(return address) into%oO ca 3 ! вызов системы Пример программы, выдающей сообщение при считывании за- грузочного сектора дискеты IBM PC-совместимого компьютера. org 7C0Ch uselP jmp code nop db 'hellowrd'
SeccSize dw 00200h ClustSize db OOlh ResSecs dw OOCOlh FatCnt db 002h RootSiz dw GGGEGh TotSecs dw 00B40h Media db CFCh FatSize dw 0CCC9h TrkSecs dw 00012h Header, r dw 00002h Hidr.Sec dw OOCCCh code: cli mov ax, cs mov ds, ax mov ss, ax mov sp, 7c00h sti mov ax,Ub8C0h mov es. ax mov di,200 mov ah,2 mov bx, MessStr msg_print: mov al,[cs: bx] mov [es: di], ax inc bx add di,2 cmp bx, MessEnd jnz msg_print loo: jmp loo MessStr equ $ Message db 'Hello, World1,' MessEnd equ $ Приведем примеры программ (с использованием режимов адре- сации) для процессоров Intel х86 и MIPS'.
Программа для as (процессор х8б) .section.data .section.text .globl „start „start: # Воспользуемся непосредственной адресацией для указания того, # что программа будет осуществлять запись в стандартное # устройство ввода-вывода. Логика работы Linux подразумевает, # что цифра четыре в регистре еах говорит компьютеру произвести # запись по адресу файлового дескриптора (он находится в регистре # ebx). Цифра один в регистре ebx сообщает ядру, что запись будет # осуществлена на стандартное устройство вывода (обычно это экран # терминала). Согласно стандарту POSIX цифра 1 соответствует # стандартном!’ устройству вывода (scdouo). movl S4,%еах movl $l,%ebx # Прямая адресация. Согласно логике работы ядра в регистр есх должна # быть помещена переменная, содержащая текст, который надо записать # в стандартное устройство вывода. В нашей программе этот текст # хранится по адресу переменной $text. movl $text,%ecx * Далее, согласно логике работы Linux (ядра операционной системы # GNU/Linux), в регистр edx необходимо занести длину печатаемого # сообщения (число байт, которое оно занимает в памяти). Учитывая, # что мы решили вывести на экран надпись на русском языке в кодировке # UTF-8, каждый из кириллических символов требует по два байта для # хранения. В свою очередь, пробел, восклицательный знак и символ г новой строки занимают по одном!’ байту. Отсюда получаем: # (1С кириллических символов * 2) + 5 « 25 байт. movl $25,%edx # Теперь можно осуществить системный вызов, то есть обращение # за помощью к ядру операционной системы. int $0x8С # Завершение работы программы также требует занесения в регистры # служебной информации. В частности, в еах должна быть единица # (соответствует выхода' из программы), а в ebx должен быть внесен код # завершения (возврата). Обычно успешному завершению соответствует # код возврата равный нулю, а единица в коде возврата сообщает
it об ошибке. movl SI,%eax # Для разнообразия, прибегнув к регистровой адресации, # внесем код возврата, равный единице. movl %eax,%ebx # Снова выполним системный вызов 0x80. int $0x80 text: .ascii «Всем привет!!!\п» Теперь произведем компиляцию и компоновку этой программы: as hello.s о hello.о Id hello.о -о hello ./hello Убедиться в том, что код возврата нашей программы равен еди- нице, можно, выполнив (сразу после завершения работы программы hello) в терминале следующую команду: echo $? Более подробную информацию о логике работы системных вы- зовов Linux можно посмотреть на сайте syscalls.kernelgrok.com Теперь обсудим адресацию памяти в контексте особенностей про- цессоров MIPS. Напомним, что MIPS — это представитель архитек- туры с сокращенным набором команд (RISC). Представленная ниже программа для spim (процессор MIPS, эму- лируемый программно) иллюстрирует один из вариантов использо- вания временных регистров (temporary registers) $tQ и 5/1. Сначала в регистр 5/1 загружается единица (непосредственная адресация), потом к единице прибавляется число 2 и результат записывается в ре- гистр 5/0: main: li $tl, 1 # непосредственная адресация aad $t0, $tl, 2 # трехадрссный формат команды li $v0, 10 syscall По инструкции syscall выполняется тот или иной системный вы- зов. Какой именно — зависит от содержимого регистров. Страница
MIPS System Calls подробно рассказывает об этом. Б частности, на- личие в регистре 5v0 числа 4 соответствует выводу на печать строки. Если же в 5v0 записать число 10, будет выполнен системный вызов, ответственный за выход из программы. Spim является эмулятором процессора MIPS32. Сохранив приве- денный выше фрагмент кода в файле с именем mips32addr.asm, его можно загрузить в эмулятор и проверить содержимое нужных реги- стров: # spim load I'mips32addr.asm’ run print $tC Для наглядности приведем пример программы на языке ассемб- лера MIPS, печатающей фразу «Доброе утро!»: .text main: la $а0, uhetext fr прямая адресация li $vC, 4 # непосредственная адресация syscall li SvO, 10 syscall • data thetexu: .asciiz "Доброе утро!\n" Как видно, исходный код программы, представленной выше, со- держит две секции: .textw .data. В .text размещаются инструкции, ко- торые нельзя изменить в ходе выполнения программы. Секция .data содержит записи, которые линкер (компоновщик) может занести в память, перед тем как программа будет исполнена. MIPS поддерживает три формата команд: регистровый (Register type, R-type), непосредственный (Immediate, I-type) и формат перехода (Jump type, J-type). В рамках одного и того же формата доступно ис- пользование различных режимов адресации. Напомним, что под режимом адресации понимается метод определения адреса хранения нужной информации. В документации о режимах адресации MIPS часто используются следующие обозначения: • op (operation code) — код операции (6 бит); • rs (source register) — регистр-источник (5 бит); • rd (destination register) — регистр-приемник (5 бит); • rt (target register or branch condition) — целевой регистр или условие перехода (5 бит);
• immediate — непосредственное смещение перехода или адреса (16 бит); • target — цель перехода (26 бит); • shamt (shift amount) — размер сдвига (5 бит); • fund (function field) — поле функции (6 бит). Ассемблер MIPS поддерживает несколько способов работы с опе- рандами при адресации (подробнее см. [Ellard 1994, 66]): • регистр — обращение к содержимому регистра; • константа — постоянный адрес в числовой форме; • константа (регистр) — сумма постоянного адреса и содержимого регистра; • символ — адрес размещения символа; • символ + константа — адрес символа + постоянный адрес в чис- ловой форме; • символ + константа (регистр) — адрес символа + постоянный адрес в числовой форме + содержимое регистра. Контрольные вопросы и задания 1. Опишите процедуру связывания программ на разных языках прог- раммирования. 2. Напишите программу на языке ассемблера, в регистр АХ поместите число 1234, в регистр ВХ поместите число ТЮТЮ, в регистр СУ поместите команду логического сложения (код команды О9ТТ8), запишите команду в ОЗУ по адресу 1 ОТ). 3. Напишите программу для процессора семейства Intel, которая увели- чивает число, находящееся в регистре АХ, в 10 раз. 4. Опишите последовательность действия процессора на примере времен- ного сохранения трех целочисленных 2-байтовых переменных У1, N2, N3 в стековую память и их восстановление. Указатель стека содержит адрес 4012. 5. Язык ассемблера. Достоинства и недостатки. 6. Основные команды языка ассемблера. 7. Регистры общего назначения. 8. Понятие счетчика команд. 9. Сегментные регистры процессора. Какую информацию содержат сег- ментные регистры в реальном и защищенном режимах работы процес- сора? 10. Приведите примеры логических и побитовых операций. 11. Команды работы со стеком. 12 Приведите примеры команд вызова прерываний команд ввода/вывода в порты. 13. Какие команды работы со стеком можно использовать для установки флагов?
Глава 9 МНОГОПРОЦЕССОРНЫЕ И МНОГОМАШИННЫЕ ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ В настоящее время тенденция в развитии микропроцессоров и систем, построенных на их основе, направлена на все большее по- вышение их производительности. Вычислительные возможности любой системы достигают своей наивысшей производительности благодаря двум факторам: • использованию высокоскоростных элементов; • параллельному выполнению большого числа операций. Направления, связанные с повышением производительности от- дельных микропроцессоров, мы рассматривали в предыдущих главах, а в этой главе остановимся на вопросах распараллеливания обра- ботки информации. 9.1. Классификация систем параллельной обработки данных Существует несколько вариантов классификации систем парал- лельной обработки данных. По-видимому, самой ранней и наиболее известной является классификация архитектур вычислительных систем, предложенная в 1966 г. М. Флинном. Классификация бази- руется на понятии потока, под которым понимается последователь- ность элементов, команд или данных, обрабатываемая процессором. На основе числа потоков команд и потоков данных выделяются че- тыре класса архитектур: SISD, MISD. SIMD, MIMD. SISD (Single Instruction Stream / Single Data Stream) — одиночный поток команд и одиночный поток данных. К этому классу относятся прежде всего классические последовательные машины или, иначе, машины фон-неймановского типа. В таких машинах есть только один поток команд, все команды обрабатываются последовательно друг за другом и каждая команда инициирует одну операцию с одним потоком данных. Не имеет значения тот факт, что для увеличения скорости обработки команд и скорости выполнения арифметических
операций процессор может использовать конвейерную обработку. В таком понимании машины данного класса фактически не отно- сятся к параллельным системам. SIMD (Single Instruction Stream / Multiple Data Stream) — одиноч- ный поток команд и множественный поток данных. Применительно к одному микропроцессору этот подход реализован в ММХ- и SSE- расширениях современных микропроцессоров. Микропроцессорные системы типа SIMD состоят из большого числа идентичных процес- сорных элементов, имеющих собственную память. Все процессорные элементы в такой машине выполняют одну и ту же программу. Это позволяет выполнять одну арифметическую операцию сразу над многими данными — элементами вектора. Очевидно, что такая сис- тема, составленная из большого числа процессоров, может обеспе- чить существенное повышение производительности только на тех задачах, при решении которых все процессоры могут делать одну и ту же работу. MISD (Multipe Instruction Stream / Single Data Stream) — множе- ственный поток команд и одиночный поток данных Определение подразумевает наличие в архитектуре многих процессоров, обраба- тывающих один и тот же поток данных. Ряд исследователей к дан- ному классу относят конвейерные машины. MIMD (Multipe Instruction Stream / Multiple Data Stream) — множественный поток команд и множественный поток данных. Базовой моделью вычислений в этом случае является совокупность независимых процессов, эпизодически обращающихся к разделя- емым данным. В такой системе каждый процессорный элемент выполняет свою программу достаточно независимо от других про- цессорных элементов. Архитектура MIMD дает большую гибкость: при наличии адекватной поддержки со стороны аппаратных средств и программного обеспечения MIMD может работать как однопользовательская система, обеспечивая высокопроизводи- тельную обработку данных для одной прикладной задачи, как мно- гопрограммная машина, выполняющая множество задач парал- лельно, и как некоторая комбинация этих возможностей. К тому же архитектура MIMD может использовать все преимуще- ства современной микропроцессорной технологии на основе стро- гого учета соотношения стоимость/производительность. В дей- ствительности практически все современные многопроцессорные системы строятся на тех же микропроцессорах, которые можно найти в персональных компьютерах, рабочих станциях и неболь- ших однопроцессорных серверах.
Как и любая другая, приведенная выше классификация несовер- шенна: существуют машины, прямо в нее не попадающие; имеются также важные признаки, которые в этой классификации не учтены. Рассмотрим вычислительные системы, которые по классификации М. Дж. Флинна относятся к группе MIMD (Multiple Instruction, Mul- tiple Data), — системы с множественным потоком команд и множе- ственным потоком данных. К подобному классу относится большин- ство параллельных многопроцессорных вычислительных систем. По архитектурным особенностям вычислительные системы можно классифицировать по следующим направлениям, заложен- ным в их архитектуру: • векторно-конвейерные суперкомпьютеры; • симметричные мультипроцессорные системы (SMP): • системы с массовым параллелизмом (МРРу, • кластерные системы. Векторно-конвейерные компьютеры. Название этому семейству компьютеров дали два принципа, заложенные в архитектуре процес- соров: конвейерная организация обработки потока команд и введение в систему команд набора векторных операций, которые позволяют оперировать с целыми массивами данных. В отличие от традицион- ного подхода векторные команды оперируют целыми массивами не- зависимых данных, что позволяет эффективно загружатв доступные конвейерв!, т.е. команда вида А - В + С может означать сложение двух массивов, а не двух чисел. Длина одновременно обрабатываемвгх векторов в современнвщ векторнв!х компвютерах составляет, как правило, 128 или 256 эле- ментов. Очевидно, что векторные процессорв! должны иметв гораздо более сложную структуру и, по сути, содержатв множество арифме- тических устройств. Основное назначение векторнвхх операций со- стоит в распараллеливании ввшолнения операторов цикла, в которвм в основном и сосредоточена большая часть вычислительной работы. Как правило, несколько специальных векторно-конвейерных процессоров работают одновременно над общей памятвю (анало- гично SMP) в рамках многопроцессорных конфигураций. Несколвко таких узлов могут бытв объединенв! с помощвю коммутатора (анало- гично МРРу Представителями этого класса являются компвютеры Cray J90/ Т90, Cray SV1, NEC SX-4/SX-5. Симметричные мультипроцессорные системы (Symmetric Multi- processing, SMP). Характерной чертой многопроцессорнвк систем ХМР-архитектурв! является то, что все процессорв! имеют прямой
и равноправный доступ к любой точке общей памяти. Первые SMP- системы состояли из нескольких однородных процессоров и массива общей памяти, к которой процессоры подключались через общую системную шину. Однако очень скоро обнаружилось, что такая ар- хитектура непригодна для создания каких-либо масштабных систем. Первая возникшая проблема — большое число конфликтов при об- ращении к общей шине. Остроту этой проблемы удалось частично снять разделением памяти на блоки, подключение к которым с по- мощью коммутаторов позволило распараллелить обращения от раз- личных процессоров. Однако и в таком подходе неприемлемо боль- шими казались накладные расходы для систем более чем с 32 про- цессорами. Современные системы SMP-архитектуры состоят, как правило, из нескольких однородных серийно выпускаемых микро- процессоров и массива общей памяти, подключение к которой про- изводится либо с помощью общей шины, либо с помощью коммута- тора Наличие общей памяти значительно упрощает организацию взаимодействия процессоров между собой и упрощает программи- рование, поскольку параллельная программа работает в едином адресном пространстве. Этот класс ВС представлен компьютерами SUN StarFire 15К, SGI Origin 3000, HP Superdome. Системы с массовым параллелизмом (Massively Parallel Processing, МРР). Проблемы, присущие многопроцессорным системам с общей памятью, простым и естественным образом устраняются в системах с массовым параллелизмом. Компьютеры этого типа представляют собой многопроцессорные системы с распределенной памятью, в ко- торых с помощью некоторой коммуникационной среды объединя- ются однородные вычислительные узлы. Каждый из узлов состоит из одного или нескольких процессоров, собственной оперативной памяти, коммуникационного оборудования, подсистемы ввода/вы- вода, т.е. обладает всем необходимым для независимого функциони- рования. При этом на каждом узле может функционировать либо полноценная операционная система, либо урезанный вариант, под- держивающий только базовые функции ядра, а полноценная ОС работает на специальном управляющем компьютере. Процессоры в таких системах имеют прямой доступ только к своей локальной памяти. Доступ к памяти других узлов реализуется обычно с по- мощью механизма передачи сообщений. Этот класс ВС может быть представлен следующими компьютерами: Cray T3D/T3E, nCUBE2, Intel Paragon. Кластерные системы. Кластерные технологии стали логическим продолжением развития идей, заложенных в архитектуре МРР-
систем. Если процессорный модуль в /И/3/3-с и стам с представляет собой законченную вычислительную систему, то следующий шаг напрашивается сам собой: почему бы в качестве таких вычисли- тельных узлов не использовать обычные серийно выпускаемые ком- пьютеры. Развитие коммуникационных технологий, а именно появ- ление высокоскоростного сетевого оборудования и специального программного обеспечения, реализующего механизм передачи со- общений над стандартными сетевыми протоколами, сделали кла- стерные технологии общедоступными. Сегодня не составляет боль- шого труда создать небольшую кластерную систему, объединив вы- числительные мощности компьютеров отдельной лаборатории или учебного класса. Привлекательной чертой кластерных технологий является то, что они позволяют для достижения необходимой про- изводительности объединять в единые вычислительные системы компьютеры самого разного типа, начиная от персональных ком- пьютеров и заканчивая мощными суперкомпьютерами. 9.2. Векторные и векторно-конвейерные вычислительные системы В средствах векторной обработки под вектором понимается одно- мерный массив однотипных данных (обычно в форме с плавающей запятой), регулярным образом размещенных в памяти ВС. Если об- работке подвергаются мноюмерные массивы, их также рассматри- вают как векторы. Такой подход допустим, если учесть, каким обра- зом многомерные массивы хранятся в памяти ВМ. Пусть имеется массив данных А, представляющий собой прямоугольную матрицу размерности 4x5 (рис. 9.1). ^12 °13 #14 а,5 °21 <>22 °23 °24 а25 а31 Щ3 $34 °35 а41 °42 °43 °44 °45 Рис. 9 1. Прямоугольная матрица данных При размещении матрицы в памяти все ее элементы заносятся в ячейки с последовательными адресами, причем данные могут быть записаны строка за строкой или столбец за столбцом (рис. 9.2). С учетом такого размещения многомерных массивов в памяти вполне допустимо рассматривать их как векторы и ориентировать
Размещение матрицы в памяти по строкам Перемещение по строке (шаг по индексу - 1) Перемещение по столбцам (шаг по индексу = 5) Размещение матрицы в памяти по столбцам Перемещение по столбцу Перемещение по ст рокам (шаг по индексу = 1) (шаг по индексу - 4) Рис. 9.2. Способы размещения в памяти матрицы 4x5 соответствующие вычислительные средства на обработку одномер- ных массивов данных (векторов). Действия над многомерными массивами имеют свою специфику, В двумерном массиве обработка может вестись как по строкам, так и по столбцам. Это выражается в том, с каким шагом должен ме- няться адрес очередного выбираемого из памяти элемента. Если рас- смотренная в примере матрица расположена в памяти построчно, то адреса последовательных элементов строки различаются на еди- ницу, а для элементов столбца шаг равен пяти. При размещении мат- рицы по столбцам единице будет равен шаг по столбцу, а шаг по строке — четырем. В векторной концепции для обозначения шага, с которым элементы вектора извлекаются из памяти, применяется термин «шаг по индексу» (stride). Еще одной характеристикой вектора является число составля- ющих его элементов — длина вектора. Векторно-конвейерные вычислительные системы относятся к классу SIM/2-систем Основные принципы, заложенные в архитек- туру векторно-конвейерных систем: • конвейерная организация обработки потока команд; • введение в систему команд набора векторных операций, которые позволяют оперировать с целыми массивами данных. Длина обрабатываемых векторов в современных векторно-кон- вейерных системах составляет, как правило, 128 или 256 элементов. Основное назначение векторных операций состоит в распараллели-
вании выполнения операторов цикла, в которых обычно сосредото- чена большая часть вычислительной работы. Первый векторно-конвейерный компьютер Сгау-1 появился в 1976 г Архитектура этого компьютера оказалась настолько удачной, что он положил начало целому семейству компьютеров. Обсбшенная структура векторного процессора приведена на рис. 9.3. На схеме показаны основные узлы процессора без дета- лизации некоторых связей между ними. Рис. 9.3. Упрощенная структура векторного процессора Обработка всех п компонентов векторов-операндов задается од- ной векторной командой. Элементы векторов представляются чис- лами в форме с плавающей запятой (ПЗ) АЧУ векторного процес- сора может быть реализовано в виде единого конвейерного устрой- ства, способного выполнять все предусмотренные операции над числами с ПЗ. Однако более распространена иная структура, в кото- рой АЛУ состоит из отдельных блоков сложения и умножения, а иногда и блока для вычисления обратной величины, когда опера- X ( 1 'I ция деления — реализуется в видеА | — . Каждый из таких блоков
также конвейеризирован. Кроме того, в состав векторной вычисли- тельной системы обычно включается и скалярный процессор, что позволяет параллельно выполнять векторные и скалярные команды. Для хранения векторов-операндов вместо множества скалярных регистров используются векторные регистры, представляющие собой совокупность скалярных регистров, объединенных в очередь типа FIFO, способную хранить 50—100 чисел с плавающей запятой. Набор векторных регистров (Va, Vb, V, ...) имеется в любом векторном про- цессоре. Система команд векторного процессора поддерживает ра- боту с векторными регистрами и обязательно включает в себя ко- манды: • загрузки векторного регистра содержимым последовательных ячеек памяти, указанных адресом первой ячейки этой последова- тельности; • выполнения операций над всеми элементами векторов, находя- щихся в векторных регистрах; • сохранения содержимого векторного регистра в последователь- ности ячеек памяти, указанных адресом первой ячейки этой по- следовательности . Примером одной из наиболее распространенных операций, воз- лагаемых на векторный процессор, может служить операция пере- множения матриц. Рассмотрим перемножение двух матриц А и В размерности 3x3: С11 «12 «13 «И «12 «13 >1 ^13 «21 С22 «23 = «21 «22 «23 х />21 ^22 «23 _С31 «32 «33 _ _«31 «32 «33 _ /.И ^32 />зз_ Элементы матрицы результата С связаны с соответствующими элементами исходных матриц А и В операцией скалярного произве- дения: з си = ^а,к bkj. к=\ Так, элемент с1 , вычисляется как С11 ~ а! 1 Х b\J + «12 х ^21 + «13 Х ^31- Это требует трех операций умножения и после инициализации си нулем — трех операций сложения. Общее число умножений и сло- жений для рассматриваемого примера составляет 9 • 3 = 27. Если рас- сматривать связанные операции умножения и сложения как одну
кумулятивную операцию с + а Ь, то для умножения двух матриц п х п необходимо п операций типа «умножение—сложение». Вся проце- 2 дура сводится к получению п скалярных произведении, каждое из которых является итогом п операций «умножение—сложение», учитывая, что перед вычислением каждого элемента его необхо- димо обнулить. Таким образом, скалярное произведение состоит из к членов: С - AjB, + А2В2 +• А3В3 + А^ -г +А;ВЛ. Векторный процессор с конвейеризированными блоками обра- ботки для вычисления скалярного произведения показан на рис. 9.4. Векторные Рис. 9.4. Векторный процессор для вычисления скалярного произведения Векторы А и В, хранящиеся в памяти начиная с адресов adrA и adrB, загружаются в векторные регистры VA и VB соответственно. Предполагается, что конвейерные умножитель и сумматор состоят из четырех сегментов, которые вначале инициализируются нулем, поэтому в течение первых восьми циклов, пока оба конвейера не за- полнятся, на выходе сумматора будет ноль. Пары (А,-, В,) подаются на вход умножителя и перемножаются в темпе одна пара за цикл. После первых четырех циклов произведения начинают суммиро- ваться с данными, поступающими с выхода сумматора. В течение следующих четырех циклов на вход сумматора поступают суммы произведений из умножителя с нулем. К концу восьмого цикла в сег- ментах сумматора находятся четыре первых произведения AjBb ..., А4В4, а в сегментах умножителя — следующие четыре произведения: А3В3,..., A8Bs. К началу девятого цикла на выходе сумматора будет AjB], а на выходе умножителя — А5В5 Таким образом, девятый цикл
начнется со сложения в сумматоре А.В( и А<;В5. Десятый цикл нач- нется со сложения А2В2 + АЬВ6 и т.д. Процесс суммирования в четы- рех секциях выглядит так: С =А]В, + А3В3 + А9В; + А13В1з + А2В2 + АбВ6 + А10В1и + А14Ви + + А3В3 + А7В7 + АцВц + А15В15 + А4В4 + А8В8 + А.2В|2 + А16В16 + Когда больше не остается членов для сложения, система заносит в умножитель четыре нуля. При этом в четырех сегментах конвейера сумматора содержатся четыре скалярных произведения, соответству- ющие четырем суммам, приведенным в четырех строках показанного выше уравнения. Далее четыре частичных суммы складываются для получения окончательного результата. Программа для вычисления скалярного произведения векторов А и В, хранящихся в областях памяти с начальными адресами adrA и adrB, имеет вид V_load VA, adrA V_lcad VB, adr3 Vjnultiply Vc, VA, VB Первые две векторные команды V load загружают векторы из па- мяти в векторные регистры УА и VB. Векторная команда умножения V multiply вычисляет произведение для всех пар одноименных эле- ментов векторов и записывает полученный вектор в векторный ре- гистр Vc. Важным элементом векторного процессора (ВП) является регистр длины вектора. Этот регистр определяет, сколько элементов факти- чески содержит обрабатываемый в данный момент вектор, т.е. сколько индивидуальных операций с элементами нужно сделать. В некоторых ВП присутствует также регистр максимальной длины век- тора, определяющий максимальное число элементов вектора, кото- рое может быть одновременно обработано аппаратурой процессора. Этот регистр используется при разделении очень длинных векторов на сегменты, длина которых соответствует максимальному числу элементов, обрабатываемых аппаратурой за один прием. Часто приходится выполнять такие операции, в которых участ- вуют не все элементы векторов. Векторный процессор обеспечивает данный режим с помощью регистра маски вектора. В этом регистре каждому элементу вектора соответствует один бит. Установка бита в единицу разрешает запись соответствующего элемента вектора результата в выходной векторный регистр, а сброс в ноль — запре- щает.
Элементы векторов в памяти расположены регулярно, и при вы- полнении векторных операций достаточно указать значение шага по индексу. Существуют случаи, когда необходимо обрабатывать только ненулевые элементы векторов. Для поддержки подобных опе- раций в системе команд ВП предусмотрены операции упаковки/рас- паковки (gather/scatter). Операция упаковки формирует вектор, со- держащий только ненулевые элементы исходного вектора, а опера- ция распаковки производит обратное преобразование Обе эти задачи векторный процессор решает с помощью вектора индексов, для хранения которого используется регистр вектора индексов, по структуре аналогичный регистру маски. В векторе индексов каж- дому элементу исходного вектора соответствует один бит. Нулевое значение бита свидетельствует, что соответствующий элемент исход- ного вектора равен нулю Применение векторных команд окупается по двум причинам. Во- первых, вместо многократной выборки одних и тех же команд доста- точно произвести выборку только одной векторной команды, что позволяет сократить издержки за счет устройства управления и уменьшить требования к пропускной способности памяти. Во-вто- рых, векторная команда обеспечивает процессор упорядоченными данными. Когда инициируется векторная команда, ВС знает, что ей нужно извлечь п пар операндов, расположенных в памяти регуляр- ным образом. Таким образом, процессор может указать памяти на необходимость начать извлечение таких пар. Если используется память с чередованием адресов, эти пары могут быть получены со скоростью одной пары за цикл процессора и направлены для об- работки в конвейеризированный функциональный блок. При отсут- ствии чередования адресов или других средств извлечения операндов с высокой скоростью преимущества обработки векторов суще- ственно снижаются. Структуры типа «память—память» и «регистр—регистр» Принципиальное различие архитектур векторных процессоров проявляется в том, каким образом осуществляется доступ к операн- дам. При организации «память—память» элементы векторов пооче- редно извлекаются из памяти и сразу же направляются в функцио- нальный блок. По мере обработки получающиеся элементы вектора результата сразу же заносятся в память. В архитектуре типа «ре- гистр-регистр» операнды сначала загружаются в векторные ре- гистры, каждый из которых может хранить сегмент вектора (напри-
мер, 64 элемента). Векторная операция реализуется путем извлече- ния операндов из векторных регистров и занесения результата в векторный регистр. Преимущество ВП с режимом «память—память» состоит в воз- можности обработки длинных векторов, в то время как в процессо- рах типа «регистр—регистр» приходится разбивать длинные векторы на сегменты фиксированной длины. К сожалению, за гибкость ре- жима «память—память» приходится расплачиваться относительно большим временем запуска, представляющим собой временной ин- тервал между инициализацией команды и моментом, когда первый резулвтат появится на выходе конвейера. Большое время запуска в процессорах типа «память—память» обусловлено скоростью до- ступа к памяти, которая намного меньше скорости доступа к вну- треннему регистру. Однако, когда конвейер заполнен, результат фор- мируется в каждом цикле. Модель времени работы векторного про- цессора имеет вид Т - s + а N, где 5 — время запуска; а — константа, зависящая от команды (обычно 1/2,1 или 2); N — длина вектора. Архитектура типа «память—память» реализована в векторно-кон- вейерных ВС Advanced Scientific Computer фирмы «Texas Instruments Inc.», семействе вычислительных систем фирмы «Control Data Cor- poration», прежде всего Star 100 серии Cyber 200, и ВС типа ЕТА-10. Все эти вычислительные системы появились в середине 70-х гг. про- шлого века после длительного цикла разработки, но к середине 80-х гг. от них отказались. Причиной послужило слишком большое время запуска — порядка 100 циклов процессора. Это означает, что операции с короткими векторами выполняются очень неэффек- тивно, и даже при длине векторов в 100 элементов процессор дости- гал только половины потенциальной производительности. В вычислительных системах типа «регистр—регистр» векторы имеют сравнительно небольшую длину (в ВС семейства Сгау-64), но время запуска значительно меньше, чем в случае «память—па- мять». Этот тип векторных систем гораздо более эффективен при обработке коротких векторов, но при операциях над длинными век- торами векторные регистры должны загружаться сегментами не- сколько раз. В настоящее время ВП типа «регистр—регистр» доми- нируют на компьютерном рынке.
Обработка длинных векторов и матриц Аппаратура векторных процессоров типа «регистр—регистр» ори- ентирована на обработку' векторов, длина которых совпадает с дли- ной векторных регистров (ВР), поэтому обработка коротких векто- ров не вызывает проблем — достаточно записать фактическую длину вектора в регистр длины вектора. Если размер векторов превышает емкость ВР, используется тех- ника разбиения исходного вектора на сегменты одинаковой длины, совпадающей с емкостью векторных регистров (последний сегмент может быть короче), и последовательной обработки полученных сег- ментов В английском языке этот прием называется strip-mining. Процесс разбиения обычно происходит на стадии компиляции, но в ряде ВП данная процедура производится по ходу вычислений с помощью аппаратных средств на основе информации, хранящейся в регистре максимальной длины вектора. Ускорение вычислений Для повышения скорости обработки векторов все функцио- нальные блоки векторных процессоров строятся по конвейерной схеме, причем так, чтобы каждая ступень любого из конвейеров справлялась со своей операцией за один такт (число ступеней в раз- ных функциональных блоках может быть различным). С этой целью в некоторых векторных ВС (например, Cray С90) конвейеры во всех функциональных блоках продублированы (рис. 9.5). На конвейер 0 всегда подаются элементы векторов с четными но- мерами, а на конвейер 1 — с нечетными В начальный момент на первую ступень конвейера 0 из ВР и V2 поступают нулевые эле- менты векторов. Одновременно первые элементы векторов из этих регистров подаются на первую ступень конвейера 1. На следующем такте на конвейер 0 подаются вторые элементы из V\ и V2, а на кон- вейер 1 — третьи элементы и т.д Аналогично происходит распреде- ление результатов в выходном векторном регистре И3. Б итоге функ- циональный блок при максимальной загрузке в каждом такте выдает не один результат, а два. В скалярных операциях работает только конвейер 0. Интересной особенностью некоторых ВП типа «регистр—ре- гистр» (например, ВС фирмы «Cray Research Inc.») является сцепление векторов (vector chaining или vector linking), когда ВР результата од- ной векторной операции используется в качестве входного регистра для последующей векторной операции. Для примера рассмотрим
Регистр Регистр V3 Регистр l/2 Рис- 9.5, Выполнение векторных операций при двух конвейерах последовательность из двух векторных команд, предполагая, что длина векторов равна 64 v2=v0xvi;v4=v2+v3. Результат первой команды служит операндом для второй. Первая векторная команда должна послать в конвейерный умножитель до 64 пар чисел. Примерно в середине выполнения команды скла- дывается ситуация, когда несколько начальных элементов вектора V2 будут уже содержать недавно вычисленные произведения; часть эле- ментов V2 все еще будет находиться в конвейере, а оставшиеся эле- менты операндов Vo и V\ еще остаются во входных векторных ре- гистрах, ожидая загрузки в конвейер. Такая ситуация показана на рис. 9.6, где элементы векторов Vo и Vb находящиеся в конвейер- ном умножителе, имеют темную закраску. В этот момент система извлекает элементы V0[A?] и V, |/с |, с тем чтобы направить их на первую ступень конвейера, в то время как V2[j] покидает конвейер. Сцепление векторов иллюстрирует линия, обозначенная звездоч- кой. Одновременно с занесением V2 [/] в ВР этот элемент направля- ется и в конвейерный сумматор, куда также подается и элемент V3[/]. Как видно из рисунка, выполнение второй команды может начаться до завершения первой; и поскольку одновременно выполняются две команды, процессор формирует два результата за цикл (V4[/] и V2 [/])
Рис. 9.6. Сцепление векторов вместо одного. Без сцепления векторов пиковая производительность Сгау-1 была бы 80 MFLOPS (один полный конвейер производит ре- зультат каждые 12,5 нс). При сцеплении трех конвейеров теоретиче- ский пик производительности — 240 MFLOPS. В принципе сцеп- ление векторов можно реализовать и в векторных процессорах типа «память—память», но для этого необходимо повысить пропускную способность памяти. Без сцепления необходимы три «канала»: два для входных потоков операндов и один — для потока результата. При использовании сцепления требуется обеспечить пять каналов: три входных и два выходных. С середины 90-х гг. прошлого века векторно-конвейерные ВС стали уступать свои позиции другим, более технологичным видам систем. 9.3. Симметричные мультипроцессорные системы Симметричная мультипроцессорная система (SMP, Symmetric Mul- tiprocessor) — это вычислительная система, обладающая следующими характеристиками. 1. Имеется два или более процессоров сопоставимой производи- тельности. 2. Процессоры совместно используют основную память и рабо- тают в едином виртуальном и физическом адресном пространстве. 3. Все процессоры связаны между собой посредством шины или по иной схеме, так что время доступа к памяти для любого из них одинаково. 4. Все процессоры разделяют доступ к устройствам ввода/вывода либо через одни и те же каналы, либо через разные каналы, обеспе- чивающие доступ к одному и тому же внешнему устройству.
5. Все процессоры способны выполнять одинаковые функции. 6. Любой из процессоров может обслуживать внешние прерыва- ния. 7. Вычислительная система управляется интегрированной опе- рационной системой, которая организует и координирует взаимо- действие между процессорами и программами на уровне заданий, задач, файлов и элементов данных. В отличие от слабо связанных мультипроцессорных систем (клас- теров), где в качестве физической единицы обмена информацией выступает сообщение или полный файл, в SMP допустимо взаимо- действие на уровне отдельного элемента данных. Благодаря этому достигается высокий уровень связности между процессами. Хотя технически 5Л/Р-системы симметричны, в их работе при- сутствует небольшой фактор перекоса, который вносит программное обеспечение. На время загрузки системы один из процессоров полу- чает статус ведущего (master). Это не означает, что позже во время работы какие-то процессоры будут ведомыми, — все они в SMP- системе равноправны. Термин «ведущий» относится к тому процес- сору, который по умолчанию будет руководить первоначальной за- грузкой ВС. Операционная система планирует процессы или нити процессов (threads) сразу по всем процессорам, скрывая при этом от пользова- теля многопроцессорный характер SMP-архитектуры. По сравнению с однопроцессорными схемами 5МР-системы имеют преимущество по следующим показателям. Производительность. Если подлежащая решению задача поддается разбиению на несколько частей так, что отдельные части могут вы- полняться параллельно, то множество процессоров дает выигрыш в производительности относительно одиночного процессора того же типа (рис. 9.7). Готовность. В симметричном мультипроцессоре отказ одного из компонентов не ведет к отказу системы, поскольку любой из про- цессоров в состоянии выполнять те же функции, что и другие. Расширяемость. Производительность системы может быть увели- чена добавлением дополнительных процессоров. Масштабируемость. Варьируя число процессоров в системе, можно создать системы различной производительности и стоимости. На рис. 9.8 в самом общем виде показана архитектура симмет- ричной мультипроцессорной ВС Как уже отмечалось, МТЛ/Л-система содержит много процессо- ров, которые (как правило, асинхронно) выполняют разные команды
| ~ Процесс блокирован | ~| Процесс выполняется Рис. 9.7. Мультипрограммирование и мультипроцессорная обработка: а — мультипрограммирование; б — мультипроцессорная обработка Рис. 9.8. Организация симметричной мультипроцессорной системы над разными данными. Подавляющее большинство современных высокопроизводительных ЭВМ на верхнем уровне иерархии имеют архитектуру MIMD. Для М/Л/Д-систем в настоящее время обшепризнана классифи- кация, основанная на используемых способах организации опера- тивной памяти в этих системах. По этой классификации прежде всего различают мультипроцессорные вычислительные системы (или мультипроцессоры) или вычислительные системы с разделяемой па- мятью (multiprocessors, common memory systems, shared-memory sys- tems) и мультикомпьютерные вычислительные системы (мультиком- пьютеры) или вычислительные системы с распределенной памятью (multicomputers, distributed memory systems). Структура мультипро- цессорной и мультикомпьютерной систем приведена рис. 9.9, где Pj — процессор, Mt — модуль памяти.
а) б) Рис. 9.9 Структура мультипроцессорной (а) и мультикомпьютерной (б) систем Мультипроцессоры. В мультипроцессорах адресное пространство всех процессоров является единым. Это значит, что если в програм- мах нескольких процессоров мультипроцессора встречается одна и та же переменная, то для получения или изменения значения этой переменной эти процессоры будут обращаться в одну физическую ячейку общей памяти. Это обстоятельство имеет как положительные, так и отрицательные последствия С одной стороны, не нужно физически перемещать данные между коммутирующими программами, что исключает затраты времени па межпроцессорный обмен. С другой стороны, так как одновре- менное обращение нескольких процессоров к общим данным может привести к получению неверных результатов, необходимы системы синхронизации параллельных процессов и обеспечения когерентно- сти памяти. Поскольку процессорам необходимо очень часто обра- щаться к общей памяти, требования к пропускной способности ком- муникационной среды чрезвычайно высоки. Последнее обстоятельство ограничивает число процессоров в мультипроцессорах несколькими десятками Остроту проблемы доступа к общей памяти частично удается снять разделением памяти на блоки, которые позволяют распараллелить обращения к памяти от различных процессоров. Отметим еще одно преимущество мультипроцессоров — мульти- процессорная система функционирует под управлением един- ственной копии операционной системы (обычно UNIX-подобной) и не требует индивидуальной настройки каждого процессорного узла Однородные мультипроцессоры с равноправным (симмет- ричным) доступом к обтцей оперативной памяти принято называть б'МР-системами (системами с симметричной мультипроцессорной
архитектурой). SMP-системы появились как альтернатива дорогим мультипроцессорным системам на базе векторно-конвейерных про- цессоров и векторно-параллельных процессоров. Мультикомпьютеры. Вследствие простоты своей архитектуры наибольшее распространение в настоящее время получили мульти- компьютеры. Мультикомпьютеры не имеют общей памяти. По- этому межпроцессорный обмен в таких системах осуществляется обычно через коммуникационную сеть с помощью передачи сооб- щений. Каждый процессор в мультикомпьютере имеет независимое адресное пространство. Поэтому наличие переменной с одним и тем же именем в программах разных процессоров приводит к об- ращению к физически разным ячейкам собственной памяти этих процессоров. Это обстоятельство требует физического перемещения данных между коммутирующими программами в разных процессо- рах. Чаще всего основная часть обращений производится каждым процессором к собственной памяти. Поэтому требования к комму- тационной среде ослабляются. В результате число процессоров в мультикомпьютерных системах может достигать нескольких тысяч, десятков тысяч и даже сотен тысяч Пиковая производительность крупнейших систем с общей па- мятью ниже пиковой производительности крупнейших систем с рас- пределенной памятью; стоимость систем с общей памятью выше стоимости аналогичных по производительности систем с распреде- ленной памятью. Однородные мультикомпьютеры с распределенной памятью на- зываются вычислительными системами с массивно-параллельной архитектурой (МРР-системами). Нечто среднее между ЛИР-системами и МРР-системами пред- ставляют собой АЧ/М4-системы. 9.4. Кластерные вычислительные системы Одно из самых современных направлений в области создания вы- числителвных систем — это кластеризация. По производительности и коэффициенту готовности кластеризация представляет собой аль- тернативу симметричным мультипроцессорным системам. Как мы уже отмечали, вычислительный кластер — это M1MD- система (мультикомпьютер), состоящая из множества отдельных компьютеров (узлов вычислительного кластера), объединенных еди- ной коммуникационной средой.
В качестве узла кластера может выступать как однопроцессорная ВМ, так и ВС типа SMP или МРР. Каждый узел в состоянии функ- ционировать самостоятельно и отдельно от кластера. Каждый узел имеет свою локальную оперативную память. При этом общей физической оперативной памяти для узлов, как правило, не существует. Коммуникационная среда вычислительных кластеров обычно позволяет узлам взаимодействовать между собой только по- средством передачи сообщений. В целом вычислительный кластер следует рассматривать как единую аппаратно-программную систему, имеющую единую коммуникационную систему, единый центр управ- ления и планирования загрузки. Архитектура кластерных вычислений сводится к объединению нескольких узлов высокоскоростной сетью. Наряду с термином «кла- стерные вычисления», часто применяются такие названия, как кнастер рабочих станций (workstation cluster), гипервычисления (hy- percomputing), параллельные вычисления на базе сети (network-based concurrent computing). Перед кластерами ставятся две задачи: • достичь большой вычислительной мощности; • обеспечить повышенную надежность ВС Первый коммерческий кластер создан корпорацией «DEC» в на- чале 80-х гг. прошлого века. В качестве узлов кластеров могут исполь- зоваться как одинаковые ВС (гомогенные кластеры), так и разные (гетерогенные кластеры). По своей архитектуре кластерная ВС яв- ляется слабосвязанной системой. Преимущества, достигаемые с помощью кластеризации: • абсолютная масштабируемость. Возможно создание больших кластеров, превосходящих по вычислительной мощности даже самые производительные одиночные ВМ. Кластер в состоянии содержать десятки узлов, каждый из которых представляет собой мультиплексор; • наращиваемая масштабируемость. Кластер строится так, что его можно наращивать, добавляя новые узлы небольшими порци- ями; • высокий коэффициент готовности. Поскольку каждый узел клас- тера — самостоятельная ВМ или ВС, отказ одного из узлов не приводит к потере работоспособности кластера. Во многих системах отказоустойчивость автоматически поддерживается программным обеспечением; • превосходное соотношение цена/производительность. Кластер любой производительности можно создать, соединяя стандартные
ВМ, при этом его стоимость будет ниже, чем у одиночной ВМ с эквивалентной вычислительной мощностью. На уровне аппаратного обеспечения кластер — это просто сово- купность независимых вычислительных систем, объединенных сетью. При соединении машин в кластер почти всегда поддерживаются пря- мые межмашинные связи. Решения могут быть простыми, основы- вающимися на аппаратуре Ethernet, или сложными с высокоскорост- ными сетями с пропускной способностью в сотни мегабайт з секунду (система РУ/6000 SP компании «1ВМ», системы фирмы «Digital» на основе Memory Channel, ServerNet корпорации «Compaq»). Узлы кластера контролируют работоспособность друг друга и об- мениваются специфической информацией. Контроль работоспособ- ности осуществляется с помощью специального сигнала, называ- емого heartbeat («сердцебиение»). Этот сигнал передается узлами кластера друг другу, чтобы подтвердить их нормальное функциони- рование. Неотъемлемой частью кластера является специализированное программное обеспечение (ПО), на которое возлагается задача обес- печения бесперебойной работы при отказе одного или нескольких узлов Такое ПО производит перераспределение вычислительной нагрузки при отказе одного или нескольких узлов кластера, а также восстановление вычислений при сбое в узле. Кроме того, при нали- чии в кластере совместно используемых дисков кластерное прог- раммное обеспечение поддерживает единую файловую систему. Узлы вычислительного кластера могут функционировать под управлением разных операционных систем. Однако чаще всего ис- пользуются стандартные UNIX-подобные системы Заметим, что с точки зрения разработки прикладных параллельных программ нет каких-либо принципиальных различий между однород ными вычи- слительными кластерами и МРР-системами. Классификация вычислительных кластеров по типу узловых процессоров Вычислительные кластеры классифицируются прежде всего по характеру узловых процессоров (рис. 9.10). В качестве узлов вычислительного кластера обычно используют персональные компьютеры, рабочие станции и ХЛ/Р-серверы. Если в качестве узла кластера используется 5Л/Р-система, то такой вычи- слительный кластер называется 5Л/Р-кластером. Если в качестве узлов вычислительного кластера используются персональные ЭВМ или рабочие станции, то обычной является си-
Рис. 9.10. Классификация узлов вычислительных кластеров туация, когда вс время решения задачи на кластере на узлах этого кластера продолжают выполняться последовательные задания поль- зователей. В результате относительная производительность узлов кластера меняется случайным образом и в широких пределах. Реше- нием проблемы было бы написание самоадаптирующейся пользова- тельской программы. Однако эффективное решение этой задачи представляется весьма проблематичным. Ситуация усугубляется, если среди узловых компьютеров вычислительного кластера имеются файловые серверы. При этом во время решения задачи на кластере в широких пределах может меняться загрузка коммуникационной среды, что делает непредсказуемыми коммуникационные расходы задачи. Классификация вычислительных кластеров по однородности узлов Как и всякие М/МЛ-системы, вычислительные кластеры разде- ляются на однородные кластерные системы (однородные вычисли- тельные кластеры) и разнородные кластерные системы (гетероген- ные вычислительные кластеры). Обычно, когда говорят о вычислительных кластерах, подразуме- вают однородные вычислительные кластеры. Однако часто при на- ращивании кластера приходится использовать процессоры, отлича- ющиеся не только по производительности, но и по архитектуре от уз- ловых процессоров кластера. Поэтому постепенно однородный вычислительный кластер может стать неоднородным. Эта неодно- родность создает следующие проблемы: различие в производитель- ности процессоров усложняет задачу распределения работ между
процессорами; различие в архитектуре процессоров требует подго- товки разных выполняемых файлов для разных узлов, а в случае раз- личий в представлении данных может потребовать и преобразования их форматов при передаче сообщений между узлами. Классификация вычислительных кластеров по функциональности узлов Узлы вычислительного кластера могут представлять собой полно- функциональные компьютеры, которые могут работать и как само- стоятельные единицы. Производительность такого кластера обычно невысока. Для создания высокопроизводительных вычислительных клас- теров системные блоки узловых компьютеров делают значительно более простыми, чем в первом случае (неполнофункциональными). Здесь нет необходимости снабжать компьютеры узлов графическими картами, мониторами, дисковыми накопителями и другим перифе- рийным оборудованием. Периферийное оборудование устанавлива- ется только на одном или немногих управляющих компьютерах (HOS1 -компьютерах). Такой поход позволяет значительно умень- шить стоимость системы. При классификации кластеров используется и ряд других клас- сификационных признаков (рис. 9.11). Рис. 9.11. Классификация вычислительных кластеров Рассмотрим два из них: • классификация по стандартности комплектующих; • кл ассификация по функционал ьной направл енности. Классификация вычислительных кластеров по стандартности ком- плектующих. С точки зрения стандартности комплектующих можно выделить два класса кластерных систем: 1) вычислительный кластер строится целиком из стандартных комплектующих;
2) при построении кластера используются эксклюзивные или нешироко распространенные комплектующие. Вычислительные кластеры первого класса имеют низкие цены и простое обслуживание. Широкое распространение кластерные тех- нологии получили как средство создания именно относительно де- шевых систем суперкомпьютерного класса из составных частей мас- сового производства. Кластеры второго класса позволяют получить очень высокую про- изводительность, но являются, естественно, более дорогими. Классификация вычислительных кластеров по их функциональной направленности. С функциональной точки зрения кластерные сис- темы можно разделить: • на высокоскоростные кластерные системы (High Performance) — HP- кластеры; • кластерные системы высокой готовности (High Availability) — НА- кластеры. Высокоскоростные кластеры используются в областях, которые требуют значительной вычислительной мощности. Кластеры высокой готовности используются везде, где стоимость возможного простоя превышает стоимость затрат, необходимых для построения отказо- устойчивой системы. Производительность вычислительного высокоскоростного клас- тера, очевидно, зависти от производительности его узлов. С другой стороны, производительность кластера, как и всякой системы с рас- пределенной памятью, сильно зависит от производительности ком- муникационной среды. Обычно при построении вычислительных кластеров используют достаточно дешевые коммуникационные среды Такие среды обеспечивают, на один — два порядка более низ- кую производительность чем производительность коммуникацион- ных сред суперкомпьютеров. Поэтому находится не так много задач, которые могут достаточно эффективно решаться на больших клас- терных системах. Влияние производительности коммуникационной среды на об- щую производительность кластерной системы зависит от характера выполняемой задачи. Если задача требует частого обмена данными между подзадачами, которые решаются на разных узлах вычисли- тельного кластера, то быстродействию коммуникационной среды следует уделить максимум внимания. Соответственно, чем меньше взаимодействуют части задачи между собою, тем меньше внимания можно уделить быстродействию коммуникационной среды
Разработано множество технологий соединения компьютеров в кластер. Для того чтобы вычислительная система обладала высокими по- казателями готовности, необходимо, чтобы ее компоненты были максимально надежными, чтобы система была отказоустойчивой, а также чтобы была возможной «горячая» замена компонентов (без останова системы). Благодаря кластеризации при отказе одного из компьютеров системы задачи могут быть автоматически (опера- ционной системой) перераспределены между другими (исправными) узлами вычислительного кластера. Таким образом, отказоустойчи- вость кластера обеспечивается дублированием всех жизненно важ- ных компонентов вычислительной системы. Самыми популярными коммерческими отказоустойчивыми системами в настоящее время являются двухузловые кластеры. Выделяется еще один класс вычислительных кластеров — вычис- лительные сети (GRID), объединяющие ресурсы множества клас- теров, многопроцессорных и однопроцессорных ЭВМ. которые мо- гут принадлежать разным организациям и быть расположенными в разных странах. Разработка параллельных программ для вычислительных сетей усложняется из-за следующих проблем. Ресурсы (количество узлов, их архитектура, производительность), которые выделяются задаче, определяются только в момент обработки сетью заказа на выполне- ние этой задачи. Поэтому программист не имеет возможности раз- работать программу для конкретной конфигурации вычислительной сети. Программу приходится разрабатывать так, чтобы она могла динамически (без перекомпиляции) самонастраиваться на выделен- ную конфигурацию сети. Кроме того, к неоднородности коммуни- кационной среды добавляется изменчивость ее характеристик, вы- зываемая изменениями загрузки сети В лучшем случае программа должна разрабатываться с учетом этой неоднородности коммуника- ционной среды, что представляет собой весьма непростую задачу. Как мы отмечали выше, подобная проблема имеет место и для вы- числительных кластеров, построенных на основе персональных ком- пьютеров или рабочих станций. Эффективная производительность кластерных вычислительных систем (real applications performance, RAP) оценивается как 5—15% от их пиковой производительности (Peak Advertised Performance, PAP). Для сравнения: у лучших малопроцессорных систем из вектор- ных процессоров это соотношение оценивается как 30—50%.
9.5. Тенденции развития вычислительных систем Перспективы развития суперкомпьютерных технологий В последнее время суперкомпьютерные технологии в России объ- явлены как один из приоритетов государственной политики. Сегодня критические (прорывные) технологии в государствах, строящих экономику, основанную на знаниях, исследуются и разра- батываются на базе широкого использования суперкомпьютерных технологий. Без серьезной суперкомпьютерной инфраструктуры не- возможно развивать перспективные технологии (биотехнологии, нанотехнологии, решения для энергетики будущего и т.п.), создать современные изделия высокой сложности (аэрокосмическая тех- ника, суда, энергетические блоки электростанций различных типов). Суперкомпьютерные технологии ио праву считаются важнейшим фактором обеспечения конкурентоспособности экономики страны, а единственным способом победить конкурентов объявляют возмож- ность обогнать их в расчетах. В развитии суперкомньютерной отрасли можно выделить два слоя. 1 . Технологии уровня N — это суперкомпьютерные технологии будущего, которые еще не вполне освоены, а только-только разра- батываются. 2 Инновационные технологии — это совершенно новые техни- ческие решения, недоступные на рынке. На базе инновационных технологий создают суперкомпьютеры, которые сильно вырываются вперед. Как правило, это машины, соответствующие первым 10 местам списка Тор500. Эти вычисли- тельные системы сверхвысокой производительности обладают мощ- ностью, которая радикально отличает их от всех других машин. И на платформе таких систем можно выполнить расчеты, которые невозможно повторить (ни за какое разумное время) на суперком- пьютерах более низкого класса. На базе таких расчетов можно со- здать в разных отраслях принципиально новые материалы, новые технологические решения, новые изделия, которые позволят обла- дающей ими стороне быть вне конкуренции и существенно ото- рваться от друтих игроков в соответствующей отрасли, — технологии уровня N- 1, технологии более низкого уровня, отработанные реше- ния, широкодоступные на рынке. Суперкомпьютеры на их базе до- ступны (и даже могут быть воспроизведены) во многих странах. Со- ответственно, расчеты, выполняемые на таких машинах, могут быть
воспроизведены многими. На базе таких расчетов можно создать в разных отраслях конкурентоспособные материалы, технологиче- ские решения, изделия, достичь нормального качества, заурядной конкурентоспособности. С такими изделиями можно выходить на мировой рынок, но на нем придется вести изнурительную конку- рентную борьбу с десятком подобных товаров, созданных на базе подобных расчетов. Таким образом: • для того чтобы страна победила в конкуренции, ей необходимо победить в вычислениях; • для того чтобы победить в вычислениях, необходимо создавать свои собственные вычислительные системы сверхвысокой про- изводительности; • необходимые для этого ключевые технические решения относятся к суперкомпьютериым технологиям уровня N. Они недоступны на рынке по двум причинам: многие из них еше не доведены до «продуктовой готовности», и никто не заинтересован отдавать з чужие руки «оружие победы» в конкуренции; • таким образом, для того чтобы страна победила в конкуренции, ей предстоит создать свои собственные суперкомпьютерные тех- нологии уровня N — по крайней мере, в части ключевых техни- ческих решений, необходимых для разработки вычислительных систем сверхвысокой производительности. На сегодняшний день и ближайшую перспективу в составе систем сверхвысокой производительности можно выделить: 1. Аппаратные средства: • вычислительные узлы — процессоры, оперативная память, воз- можно, ускорители вычислений и локальные диски; • системная сеть — связывает вычислительные узлы и используется для организации вычислительного процесса (синхронизация и обмен данными между вычислительными фрагментами); • системы хранения данных (СХД); • подсистемы ввода/вывода данных; • подсистемы визуализации; • инфраструктура системы: — вспомогательная сеть (управление задачами, передача фай- лов); — подсистема мониторинга и управления аппаратурой; — подсистемы охлаждения и электропитания; 2. Базовое и системное программное обеспечение, в том числе: • операционная система;
• системы низкоуровневой поддержки эффективного и отказо- устойчивого использования аппаратных средств и реализации перспективных подходов к программированию; • средства поддержки программирования — языки, инструменты и системы программирования. Системы сверхвысокой производительности — это всегда сис- темы на пределе существующих технических возможностей: процес- соров и спецпроцессоров (ускорителей вычислений), системной сети, подсистем охлаждения и электропитания и т.д. В таких сис- темах новые оригинальные разработки используются гораздо чаще, чем коммерчески доступные решения. И для этого есть несколько причин, в том числе: часто используются самые свежие разработки, которые только что созданы и еще не успели выйти на рынок как коммерчески доступные решения. Для вывода их на рынок потребу- ется несколько лет. Причем задержка может быть и умышленной — сохранение отрыва от конкурентов; системы строятся как уникаль- ные объекты в единичных экземплярах — для многих коммерческих компаний единичные проекты неинтересны. Процессоры и сопроцессоры. Сегодня в системах сверхвысокой про- изводительности используются как традиционные 186-совместимые процессоры Intel и AMD (пять систем из десяти), так и эксклюзив- ные решения — процессоры IBM Power BQC (четыре системы) и SPARC64 Vlllfx (одна система). Графические процессоры как уско- рители вычислений используются в двух случаях из десяти. Системная сеть. Технические характеристики системной сети — темп выдачи сообщений, задержка, пропускная способность — са- мым серьезным образом влияют на реальную производительность суперкомпьютера. Это влияние тем больше, чем больше размер сис- темы. Для систем сверхвысокой производительности требуется сис- темная сеть с рекордными техническими характеристиками. Вот почему в этих системах чаще всего используются для системной сети либо решения собственной разработки, либо дорогие и самые высо- кокачественные коммерчески доступные решения. Инфраструктура. Приходится разрабатывать оригинальные ре- шения и для инфраструктуры: подсистем охлаждения, энергоснаб- жения, управления. Например, именно в настоящее время происхо- дит перелом в используемых подходах в подсистеме охлаждения. Инженерная логика здесь весьма простая: • системы сверхвысокой производительности имеют высокие по- казатели электропотребления — как правило, от десятка мегаватт и выше. А значит, они имеют очень высокий уровень выделения
тепла в вычислителе. И общая тенденция связана с ростом элект- ропотребления (и соответственно — тепловыделения); • стремление к максимальной производительности ведет к увели- чению плотности расположения электроники вычислителя: меньше длина проводников — значит, меньше задержки на пере- дачу сигналов, выше производительность; • как результат мы имеем все большее и большее тепловыделение, приходящееся на единицу объема; • значит, технологии охлаждения вычислителя должны непрерывно совершенствоваться. В результате в последние годы мы наблюдаем смену технологий охлаждения электроники вычислителей. Рассмотрим основные направления развитие процессоров. 1. Повышение тактовой частоты. Для повышения тактовой частоты при выбранных материалах используются: более совершенный технологический процесс с мень- шими проектными нормами; увеличение числа слоев металлизации; более совершенная схемотехника меныпей каскадности и с более совершенными транзисторами, а также более плотная компоновка функциональных блоков кристалла. Так, все производители микропроцессоров перешли на техноло- гию КМОП, хотя «Intel», например, использовала БиКМОП для первых представителей семейства Pentium. Известно, что биполяр- ные схемы и КМОП на высоких частотах имеют примерно одинако- вые показатели тепловыделения, но КМОП-схемы более техноло- гичны, что и определило их преобладание в микропроцессорах. Уменьшение размеров транзисторов, сопровождаемое снижением напряжения питания с 5 до 2,5—3 В и ниже, увеличивает быстродей- ствие и уменьшает выделяемую тепловую энергию. Все производи- тели микропроцессоров перешли с проектных норм 0,35—0,25 мкм на 0,18 и 0,12 мкм и стремятся использовать уникальную 0,07 мкм- технологию (табл. 9.1). Таблица 9.1 Основные параметры вычислительной техники с 2005 г. Год производства 2005 2006 2007 2010 2013 2016 DRAM, нм 80 70 65 45 32 32 МП, нм 80 70 65 45 32 32 Цтит, В 0,9 0,9 0,7 0,6 0,5 0,4 Р, Вт 170 180 190 218 251 288
При минимальном размере деталей внутренней структуры интег- ральных схем 0,1—0,2 мкм достигается оптимум, ниже которого все характеристики транзистора быстро ухудшаются. Практически все свойства твердого тела, включая его электропроводность, резко из- меняются и «сопротивляются» дальнейшей миниатюризации, воз- растание сопротивления связей происходит экспоненциально. По- тери даже на кратчайших линиях внутренних соединений такого размера «съедают» до 90% сигнала по уровню и мощности. При этом начинают проявляться эффекты квантовой связи, в ре- зультате чего твердотельное устройство становится системой, дей- ствие которой основано на коллективных электронных процессах. Проектная норма 0,05—0,1 мкм (50—100 нм) — это нижний предел твердотельной микроэлектроники, основанной на классических принципах синтеза схем. Уменьшение длины межсоединений актуально для повышения тактовой частоты работы, так как существенную долю длительности такта занимает время прохождения сигналов по проводникам внутри кристалла. Например, в Alpha 21264 предприняты специальные меры по кластеризации обработки, призванные локализовать взаимодей- ствующие элементы микропроцессора. Проблема уменьшения длины межсоединений на кристалле при использовании традиционных технологий решается путем увеличе- ния числа слоев металлизации. 2. Увеличение объема и пропускной способности подсистемы па- мяти. Возможные решения по увеличению пропускной способности подсистемы памяти включают создание кэш-памяти одного или нескольких уровней, а также увеличение пропускной способности интерфейсов между процессором и кэш-памятью и конфликтующей с этим увеличением пропускной способности между процессором и основной памятью. Совершенствование интерфейсов реализуется как увеличением пропускной способности шин (путем увеличения частоты работы шины и/или ее ширины), так и введением допол- нительных шин, расшивающих конфликты между процессором, кэш-памятью и основной памятью. В последнем случае одна шина работает на частоте процессора с кэш-памятью, а вторая — на час- тоте работы основной памяти. При этом частоты работы второй шины, например, равны 66, 66, 166 МГц для микропроцессоров Pen- tium Pro-200, Power РС604Е-225, Alpha 21164—500, работающих на тактовых частотах 300, 225, 500 МГц соответственно. При ширине шин 64, 64, 128 разрядов это обеспечивает пропускную способность
интерфейса с основной памятью 512, 512, 2560 Мбайт/с соответ- ственно. Общая тенденция увеличения размеров кэш-памяти реализуется по-разному: • внешние кэш-памяти данных и команд с двухтактовым временем доступа объемом от 256 Кбайт до 2 Мбайт со временем доступа 2 такта в HP РА-8000; • отдельный кристалл кэш-памяти второго уровня, размещенный в одном корпусе в Pentium Pro; • размещение отдельных кэш-памяти команд и кэш-памяти данных первого уровня объемом по 8 Кбайт и общей для команд и данных кэш-памяти второго уровня объемом 96 Кбайт в Alpha 21164. Наиболее используемое решение состоит в размещении на крис- талле отдельных кэш-памятей первого уровня для данных и команд с возможным созданием внекристальной кэш-памяти второго уровня. Например, в Pentium II использованы внутрикристальные кэш-памяти первого уровня для команд и данных по 16 Кбайт каждая, работающие на тактовой частоте процессора, и внекристаль- ный кэш второго уровня, работающий на половинной тактовой час- тоте. 3. Увеличение количества параллельно работающих исполнитель- ных устройств. Каждое семейство микропроцессоров демонстрирует в следу- ющем поколении увеличение числа функциональных исполнитель- ных устройств и улучшение их характеристик, как временных (со- кращение числа ступеней конвейера и уменьшение длительности каждой ступени), так и функциональных (введение ЛШХ-расшире- ний системы команд и т.д.). В настоящее время процессоры могут выполнять до шести опера- ций за такт. Однако число операций с плавающей точкой в такте ограничено двумя для R10000 и Alpha 21164, а четыре операции за такт делает HP РА-8500. Для того чтобы загрузить функциональные исполнительные устройства, используются переименование регистров и предсказание переходов, устраняющие зависимости между командами по данным и управлению, буферы динамической переадресации. Широко используются архитектуры с длинным командным сло- вом — VLIW. Так, архитектура Z4-64, развиваемая Intel и HP, исполь- зует объединение нескольких инструкций в одной команде (EPIC). Это позволяет упростить процессор и ускорить выполнение команд. Процессоры с архитектурой Z4-64 могут адресоваться к 4 Гбайт па-
мяти и работать с 64-разрядными данными. Архитектура //1-64 ис- пользуется в микропроцессоре Merced, обеспечивая производитель- ность до 6 Гфлоп при операциях с одинарной точностью и до 3 Гфлоп — с повышенной точностью на частоте 1 ГГц. 4. Системы на одном кристалле и новые технологии. В настоящее время получили широкое развитие системы, выпол- ненные на одном кристалле, — SOC (System On Chip). Сфера приме- нения SOC — от игровых приставок до телекоммуникаций. Такие кристаллы требуют применения новейших технологий. Основной технологический прорыв в области SOC удалось сде- лать корпорации «1ВМ», которая в 1999 г. смогла реализовать срав- нительно недорогой процесс объединения на одном кристалле ло- гической части микропроцессора и оперативной памяти. В новой технологии, в частности, используется так называемая конструкция памяти с врезанными ячейками (trench cell). В этом случае конден- сатор, хранящий заряд, помещается в некое углубление в кремние- вом кристалле. Это позволяет разместить на нем свыше 24 тыс. эле- ментов, что почти в 8 раз больше, чем на обычном микропроцессоре, и в 2—4 раза больше, чем в микросхемах памяти для ПК. Следует отметить, что, хотя кристаллы, объединяюшие логические схемы и память на одном кристалле, выпускались и ранее, например та- кими фирмами, как «Toshiba», «Siemens AG» и «Mitsubishi», подход, предложенный «1ВМ», выгодно отличается по стоимости. Причем ее снижение никоим образом не сказывается на производительности. Использование новой технологии открывает широкую перспек- тиву для создания более мощных и миниатюрных микропроцессоров и помогает создавать компактные, быстродействующие и недорогие электронные устройства: маршрутизаторы, компьютеры, контрол- леры жестких дисков, сотовые телефоны, игровые и интернет-при- ставки Нанотехнологии Нанотехнологии — это технологии, оперирующие величинами порядка нанометра. Это технологии манипуляции отдельными ато- мами и молекулами, в результате которых создаются структуры слож- ных спецификаций. Слово «нано» (в древнегреч. языке nano — кар- лик) означает миллиардную часть единицы измерения и является синонимом бесконечно малой величины, в сотни раз меньшей длины волны видимого света и сопоставимой с размерами атомов. Поэтому переход от «микро» к «нано» — это уже не количественный, а качественный переход: скачок от манипуляции веществом к мани-
пуляции отдельными атомами. Мир таких бесконечно малых вели- чин намного меньше, чем мир сегодняшних микрокристаллов и ми- кротранзисторов. Сейчас работы в области нанотехнологий ведутся в четырех ос- новных направлениях: • молекулярная электроника; • биохимические и органические решения; • квазимеханические решения на основе нанотрубок; • квантовые компьютеры. Наночастицы Современная тенденция к миниатюризации показала, что веще- ство может иметь совершенно новые свойства, если взять очень ма- ленькую частицу этого вещества. Частицы размерами от 1 до 100 на- нометров обычно называют наночастииами. Так, например, оказа- лось, что наночастицы некоторых материалов имеют очень хорошие каталитические и адсорбционные свойства Другие материалы пока- зывают удивительные оптические свойства, например сверхтонкие пленки органических материалов применяют для производства сол- нечных батарей. Такие батареи хоть и обладают сравнительно низкой квантовой эффективностью, зато более дешевы и могут быть меха- нически гибкими. Удается добиться взаимодействия искусственных наночастиц с природными объектами наноразмеров — белками, нуклеиновыми кислотами и др. Тщательно очищенные наночастицы могут самовыстраиваться в определенные структуры. Такая структура содержит строго упорядоченные наночастицы и также зачастую про- являет необычные свойства. Нанообъекты делятся на три основных класса: трехмерные час- тицы, получаемые взрывом проводников, плазменным синтезом, восстановлением тонких пленок и т.д.; двумерные объекты — пленки, получаемые методами молекулярного наслаивания, CVD, ALD, методом ионного наслаивания и т.д.; одномерные объекты — вискеры, эти объекты получаются методом молекулярного наслаи- вания, введением веществ в цилиндрические микропоры и т.д. Также существуют нанокомпозиты — материалы, полученные введением наночастиц в какие-либо матрицы. На данный момент обширное применение получил только метод микролитографии, позволяющий получать на поверхности матриц плоские островковые объекты раз- мером от 50 нм, применяется он в электронике; методы CVD и ALD в основном применяются для создания микронных пленок. Прочие методы в основном используются в научных целях. В особенности
следует отметить методы ионного и молекулярного наслаивания, поскольку с их помощью возможно создание реальных монослоев. Особый класс составляют органические наночастицы как есте- ственного, так и искусственного происхождения. Поскольку многие физические и химические свойства наноча- стиц, в отличие от объемных материалов, сильно зависят от их раз- мера, в последние годы проявляется значительный интерес к мето- дам измерения размеров наночастиц в растворах: анализ траекторий наночастиц, динамическое светорассеяние, седиментационный ана- лиз, ультразвуковые методы. Самоорганизация наночастиц и самоорганизующиеся процессы Один из важнейших вопросов, стоящих перед нанотехнологией: как заставить молекулы группироваться определенным способом, самоорганизовываться, чтобы в итоге получить новые материалы или устройства? Этой проблемой занимается раздел химии — супрамо- лекулярная химия. Она изучает не отдельные молекулы, а взаимо- действия между молекулами, которые способны упорядочить моле- кулы определенным способом, создавая новые вещества и мате- риалы. Обнадеживает то, что в природе действительно существуют подобные системы и осуществляются подобные процессы. Так, из- вестны биополимеры, способные организовываться в особые струк- туры. Один из примеров — белки, которые не только могут сворачи- ваться в глобулярную форму, но и образовывать комплексы — струк- туры, включающие несколько молекул белков. Уже сейчас существует метод синтеза, использующий специфические свойства молекулы ДНК. Берется комплементарная ДНК (кДНК), к одному из концов подсоединяется молекула А или Б. Имеем два веще- ства: ---А и----Б, где-------условное изображение одинарной молекулы ДНК. Теперь, если смешать эти два вещества, между двумя одинарными цепочками ДНК образуются водородные связи, кото- рые притянут молекулы А и Б друг к другу. Условно изобразим полу- ченное соединение: ====АБ. Молекула ДНК может быть легко уда- лена после окончания процесса. Однако явления самоорганизации не замыкаются только на спон- танном упорядочении молекул и/или иных частиц в результате их взаимодействия. Существуют и другие процессы, которым присуща способность к самоорганизации, не являющиеся предметом супра- молекулярной химии. Одним из таких процессов является электро- химическое анодное оксидирование (анодирование) алюминия,
а именно та его разновидность, что приводит к формированию по- ристых анодных оксидных пленок (ПАОП). ПАОП представляют собой квазиупорядоченные мезопористые структуры с порами, рас- положенными нормально к поверхности образца и имеющими диа- метр от единиц до сотен нанометров и длину от долей до сотен мик- рометров. Существуют процессы, позволяющие в существенной степени увеличить степень упорядоченности расположения пор и создавать на основе ПАОП наноструктурированные одно-, двух и трехмерные массивы. В последнее время резко увеличилось количество публикаций о новых достижениях в области нанотехнологий. Самые свежие но- вости можно найти, например, на сайте http://www.nanonewsnet. сот/. Компьютеры и микроэлектроника Центральные процессоры. 15 октября 2007 г. компания «Intel» зая- вила о разработке нового прототипа процессора, содержащего наи- меньший структурный элемент размерами примерно 45 нм. В даль- нейшем компания намерена достичь размеров структурных элемен- тов до 5 нм. Основной конкурент «Intel», компания «AMD», также давно использует для производства своих процессоров нанотехноло- гические процессы, разработанные совместно с компанией «1ВМ». Характерным отличием от разработок «Intel» является применение дополнительного изолирующего слоя SOI, препятствующего утечке тока за счет дополнительной изоляции структур, формирующих транзистор. Уже существуют рабочие образцы процессоров с тран- зисторами размером 14 нм и опытные образцы на 10 нм. Жесткие диски. В 2007 г. Питер Грюнберг и Альберт Ферт полу- чили Нобелевскую премию по физике за открытие СЛ/Л-эффекта, позволяющего производить запись данных на жестких дисках с ато- марной плотностью информации. Сканирующий зондовый микроскоп (СЗМ) — микроскоп высокого разрешения, основанный на взаимодействии иглы кантилевера (зонда) с поверхностью исследуемого образца. Обычно под взаимо- действием понимается притяжение или отталкивание кантилевера от поверхности из-за сил Ван-дер-Ваальса. Но при использовании специальных кантилеверов можно изучать электрические и магнит- ные свойства поверхности. СЗМ может исследовать как проводящие, так и непроводящие поверхности даже через слой жидкости, что по- зволяет работать с органическими молекулами (ДНК). Простран- ственное разрешение сканирующих зондовых микроскопов зависит
от характеристик используемых зондов. Разрешение достигает ато- марного по горизонтали и существенно превышает его по вертикали. Антенна-осциллятор. 9 февраля 2005 г. в лаборатории Бостонского университета была получена антенна-осциллятор с размерами по- рядка 1 мкм. Это устройство насчитывает 5000 млн атомов и спо- собно осциллировать с частотой 1,49 Гц, что позволяет передавать с его помощью огромные объемы информации. Плазмоны — коллективные колебания свободных электронов в металле. Характерной особенностью возбуждения плазмонов можно считать так называемый плазмонный резонанс. Длина волны плазмонного резонанса, например, для сферической частицы сере- бра диаметром 50 нм составляет примерно 400 нм, что указывает на возможность регистрации наночастиц далеко за границами ди- фракционного предела (длина волны излучения много больше раз- меров частицы). В начале 2000 г. благодаря быстрому прогрессу в тех- нологии изготовления частиц наноразмеров был дан толчок к разви- тию новой области нанотехнологии — нанонлазмонике. Стало возможным передавать электромагнитное излучение вдоль цепочки металлических наночастиц с помощью возбуждения плазмонных колебаний Фотоника Фотоника — это технология излучения, передачи, регистрации света при помощи волоконной оптики и оптоэлектроники. Довольно давно уже известна оптимальная среда для передачи огромных массивов данных — это свет, бегущий по волоконно-оп- тическим кабелям. А все компьютерные транзисторы работают с электрическим током, текущим по медным проводам. Исследова- телям лабораторий «Intel» удалось органически совместить кремний со светом, так родилась кремниевая фотоника. 16 февраля 2004 г. впервые было продемонстрировано устройство, передающее информацию по волоконно-оптическому кабелю со скоростью 1 Гбит/с! Луч света, идущий по оптическому волокну, расщепляется на два луча, затем один из лучей проходит через специальное устройство, в котором световые колебания могут' сдвигаться по фазе. После сло- жения лучей наблюдается интерференция. Наличие света считают единицей, а его отсутствие — нулем. До сих пор существовали быстрые модуляторы (устройства, пре- образующие свет в последовательность битов информации), но они были очень дорогими, сложными в производстве и делались с ис-
пользованием экзотических материалов (таких как арсенид галлия или фосфид индия). Самые быстрые кремниевые модуляторы рабо- тали на скоростях около 20 МГц. Кремниевый модулятор «Intel» ра- ботает со скоростью более 1 ГГц, исследователи надеются повысить эту скорость еще раз в 10! У кремниевой фотоники есть масса преимуществ. Прежде всего это то, что по оптическому волокну можно передавать тысячи пото- ков сигналов на разных длинах световых волн, тогда как по медному проводу может идти лишь один ток. Теоретический предел для такой передачи близок к 100 трлн бит/с — этого достаточно, чтобы пере- дать по одному волокну (в 30 раз тоньше человеческого волоса) те- лефонные переговоры всех жителей Земли одновременно. Микропроцессорная технология потенциально имеет много на- значений: создание персональных электронных партнеров; интел- лектуализация (в известном смысле «оживление») всей техносферы; усиление и защита функций организма с помощью персональных медико-кибернетических устройств, в том числе вживляемых в ор- ганизм. В результате эволюции электронной технологии от «микро» к «нано» и ее слияния с «генной», вероятно, будет достигнуто со- стояние, при котором станет возможным синтез в массовых количе- ствах любых технических устройств. Однако основная цель будущей нанотехнологии, по всей вероятности, — создание структур, способ- ных к эволюции и саморазвитию. Контрольные вопросы и задания 1. Примеры классификации вычислительных систем. 2. Приведите примеры векторно-конвейерной системы. 3. Приведите примеры симметричных мультипроцессорных систем (SMP). 4. Какие уровни параллелизма реализуют симметричные мультипроцес- сорные системы? 5. Что такое кластерные системы? 6. Есть ли разница между производительностью (performance) вычисли- тельной системы и ее быстродействием? 7. Какие две проблемы призвана решить кластерная организация вычис- лительной системы? 8. Существуют ли ограничения на число узлов в кластерной ВС? И если существуют, то чем они обусловлены? 9. Какие задачи в кластерной вычислительной системе возлагаются на специализированное (кластерное) программное обеспечение?
10. Каким образом может быть организовано взаимодействие между уз- лами кластерной ВС? 11. Сформулируйте основные тенденции развития микропроцессоров. 12. За счет каких факторов достигают повышения тактовой частоты МП? 13. Какие архитектурные особенности приводят к улучшению характе- ристик МП? 14. Каким образом решается проблема уменыче] тия длины межсоедине]тий на кристалле при использовании традиционных технологий? 15. Что такое нанотехнологии? В каких направлениях они развиваются? 16. Приведите примеры использования нанотехнологий. 17. Что такое фотоника? Расскажите о ее достижениях.
СПИСОК ЛИТЕРАТУРЫ 1. Аванесян Г.Р., Левшин В.П. Интегральные микросхемы ТТЛ, ТТЛШ: Справочник. М.: Машиностроение, 1993. 2. Атовмян И.О. Архитектура вычислительных систем. М.: МИФИ, 2002. 3. Бродин В.Б., Шагурин И.И. Микропроцессор i486. Архитектура, прог- раммирование, интерфейс. М.: ДИАЛОГ-МИФИ, 1993. 4. Гибсон Г., Лю Ю-Чжен. Микропроцессоры семейства 8086/8088. М.: Радио и связь, 1987. 5. Гордеев А.В. Операционные системы: Учебник для вузов. 2-е изд. СПб. Питер, 2007. 6. Гуров В.В. Синтез комбинационных схем в примерах. М.: МИФИ, 2001. 7. Гуров В.В , Ленский О.Д., Соловьев Г.Н., Чуканов В.О Архитектура, струк- тура и организация вычислительного процесса в ЭВМ типа IBM PC / Подред. Т.Н. Соловьева. М.: МИФИ, 2002. 8. Гуров В.В , Чуканов В.О. Электронная книга. Архитектура и организация ЭВМ. М.: ИНТУИТ. Национальный открытый университет, 2005. 9. Дэвид Харрис, Сара Харрис. Цифровая схемотехника и архитектура ком- пьютера. 2-е изд.: перевод командой компаний и университетов России, Украины, США и Великобритании, Morgan Kaufman, 2013 10. Жмакин А.П. Архитектура ЭВМ. 2-е изд. СПб.: БХВ-Петербург, 2010. 11. Каган Б.М. Электронные вычислительные машины и системы. М.: Энергоатомиздат, 1991. 12. Казаринов Ю.М., Номоконое ЕН., Подклетное ГС. и др. Микропроцес- сорный комплект К1810: Структура, программирование, применение / Подред. Ю.М. Казаринова. М.: Высшая школа, 1990. 13. Киселев А.В., Корнеев В.В. Современные микропроцессоры. М.: Но- лидж, 1998. 14. Майоров С.А., Кириллов В.В., Приблуда А.А. Введение в микроЭВМ. Ленинград: Машиностроение, 1988. 15. Микушин А.В. Занимательно о микроконтроллерах. СПб.: БХВ-Петер- бург, 2006. 16. Микушин А.В., Сажнев А.М, Сединин В.И. Цифровые устройства и мик- ропроцессоры. СПб.: БХВ-Петербург, 2010. 17. Михаил Гук Аппаратные средства IBM PC. СПб.: Питер, 2006. 18. Олифер В.Г., Олифер Н.А. Сетевые операционные системы. СПб.: Питер, 2009. 19. Орлов С.А., Пилькер Б.Я Организация ЭВМ и систем. 2-е изд. СПб.: Питер, 2011. 20. Паттерсон Д., Хеннесси Дж. Архитектура компьютера и проектирование компьютерных систем. 4-е изд. СПб.: Питер, 2012 21. Таненбаум Э., Остин Т. Архитектура компьютера. 6-е изд. СПб. Питер, 2014.
22. Угрюмое Е.П. Цифровая схемотехника. СПб.: БХВ-Петербург, 2004. 23. Цилъкер Б.Я.. Орлов С.А. Организация ЭВМ и систем: Учебник для ву- зов. СПб.: Питер, 2004. URL: http://studopedia.org/4-185.html. Электронные ресурсы 24. Барский А.Б. Электронная книга. Архитектура параллельных вычисли- тельных систем. Интернет-университет информационных технологий ИНТУИТ. ISBN: 978-5-9556-0071-0. 25. Скоробогатов П К., Новиков Ю.В Электронная книга. Основы микро- процессорной техники. Интернет-университет информационных тех- нологий. ИНТУИТ. ISBN: 978-5-9556-0082-6. Интернет-ресурсы 26. http://all-ht .ru. Информационный сайт о высоких технологиях. 27. http://perscom.ru. ПерсКом. 28. http://www.infl.info. Планета информатики.
ОГЛАВЛЕНИЕ ПРЕДИСЛОВИЕ.......................................................3 Глава 1. ОСНОВНЫЕ ПОНЯТИЯ АРХИТЕКТУРЫ АППАРАТНЫХ СРЕДСТВ, ЬЫЧИСЛИТЕЛЬНОЙ СИСТЕМЫ, СИСТЕМНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ......................................................5 1.1. Базовые понятия вычислительной системы.......................5 1.2. Многоуровневая организация вычислительных машин..............8 1.3. Общий состав и структура вычислительных систем......... 17 Контрольные вопросы и задания....................................38 Глава 2. АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ ОСНОВЫ ЭВМ .................39 2.1. Арифметические основы цифровой техники......................39 2.2. Гоги1теские основы цифровой техники. . . ............. . 62 Контрольные вопросы и задания.................................... .. .89 Глава 3. ОСНОВНЫЕ ЦИФРОВЫЕ ЛОГИЧЕСКИЕ УСТРОЙСТВА.................92 3.1. Общие сведения об элементной базе цифровой техники......... 92 3.2. Функциональные цифровые узлы комбинационного типа ... ......113 3.3. Последовательностные устройства........................ — 125 3.4. Запоминающие устройства......................... 136 3.5. Арифметико-логическое устройство...........................147 Контрольные вопросы и задания....................................151 Глава 4. АРХИТЕКТУРА МИКРОПРОЦЕССОРОВ ..........................153 4.1. Принципы реализации микропроцессоров......................... 153 4.2. Система команд процессора и методы адресации операндов. ...169 4.3. Гегистровая архитектура х8б-совместимых процессоров........187 4.4. Режимы работы х86-совмсстимых процессоров!.................201 4.5. Конвейеризация инструкций..................................209 Контрольные вопросы и задания ...................................213 Глава 5. ОРГАНИЗАЦИЯ МИКРОПРОЦЕССОРНОЙ СИСТЕМЫ .................214 5.1. Структура связей микропроцессорных систем...................214 5.2. Адресное прос.ранство микропроцессорною устройства ........223 Контрольные вопросы и задания ..................................254 Глава 6. РЕЖИМЫ РАБОТЫ МИКРОПРОЦЕССОРНОЙ СИСТЕМЫ.................255 6.1. Пэотраммт-ый обмен информацией..................... 256
6.2. Система прерываний..........................................258 6.3. Прямой доступ к памяти......................................272 6.4. Функции уаройств ввода/вывода...............................277 Контрольные вопросы и задания ................................... 283 Глава 7. УРОВЕНЬ ОПЕРАЦИОННОЙ СИСТЕМЫ............................284 7.1. Назначение, структура и функции операционной системы........284 7.2. Операционная система как система упразления ресурсами.... 290 7.3. Интерфейс прикладного программирования......................307 7.4. Аппаратные средства защиты информации в микропроцессоре ....310 7.5. Использование шлюзов вызова.............................. 314 Контрольные вопросы и задания . ... ...... ...... — ...... - ------318 Глава 8. УРОВЕНЬ АССЕМБЛЕРА ......................................320 8.1. Язык ассемблера. Начальные сведения . ......................320 8.2. Основы прсграммирования на языке ассемблера ........... 325 Контрольные вопросы и задания................................... 342 Глава 9. МНОГОПРОЦЕССОРНЫЕ И МНОГОМАШИННЫЕ ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ............................................343 9.1. Классификация систем параллельной обработки данных..........343 9.2. Векторные и векторно-конвейерные вычислительные системы . ..347 9.3. Симметричные мультипроцессорные системы.....................357 9.4. Кластерные вычислительные системы......................... 361 9 5. Тенденции развития вычислительных систем.................368 Контрольные вопросы и задания .................................. 379 СПИСОК ЛИТЕРАТУРЫ.................................................381