Cистемное ПО.
🕛 22.05.2009, 12:05
1. Классификация систем программирования, основные характеристики машинно-ориентированной системы программирования.Системой программирования (СП) называется набор приемов и правил, а точнее совокупность инструментальных средств, позволяющих переводить представление алгоритма обработки информации из одной формы представления в другую.
Для современных программных средств основными являются три системы программирования - машинно-ориентированная, проблемно-ориентированная и процедурно-ориентированная. Каждая из них характеризуется различной степенью готовностью «выходного продукта» к немедленному «машинному» использованию, объемом требуемого дополнительного ПО, степенью «понятности» и «близости» пользователю.
Машинно-ориентированная СП содержит средства для программирования на языке машинных команд, автокоде или языке ассемблерного типа. Для ее использования требуется сравнительно немного дополнительного ПО, ее характеризует сильная платформенная зависимость и плохая «читабельность» со стороны пользователя. Однако в силу больших возможностей по управлению аппаратными средствами эта СП наиболее важна для решения задач системного программирования.
Название «проблемно-ориентированная» СП получила в те времена, когда языковые средства программирования привязывались к конкретным классам решаемых прикладных задач («проблем») - для научно-технических инженерных задач - язык FORTRAN, для экономических - COBOL, для «начинающих» - BASIC. Поэтому проблемно-ориентированная СП использует какой-либо язык высокого уровня, ей требуется дополнительное сложное ПО (компиляторы, интерпретаторы), ее «выходной продукт» слабо связан с платформой разработки и достаточно понятен человеку-пользователю.
Процедурно-ориентированные СП предназначены для выполнения каких-либо сложных процедур, инициированных пользователем, поэтому они представляют собой сложные обрабатывающие системы со своим входным языком - таковыми являются различные информационно-справочные системы, системы управления данными. Например, к ним можно отнести известную систему продажи и бронирования железно-дорожных билетов. Машинно-ориентированная СП характеризуется следующим набором из пяти групп параметров:
1) организация оперативной памяти, минимально-адресуемая единица, общий объем доступного адресного пространства, способы структуризации (слова, двойные слова и т.п.).
2) организация регистров - общее их число, доступность, назначение, формат
3) форматы данных - поддерживаемые типы данных, формы их представления в памяти
4) система команд - форматы, способы доступа к памяти, виды адресации, группы по выполняемым функциям
5) специальные средства (наличие средств защиты, системы прерываний, организация ввода вывода и т.п.).
2. Общая характеристика языка ассемблера. Команды ассемблера и директивы ассемблирования. Постановка задачи проектирования ассемблера. Возможный формат объектного модуля.
Язык ассемблера является мнемо-эквивалентом машинного языка, то есть одной ассемблерной команде соответствует ровно одна машинная команда, выполняемая процессором. Кроме этого, ассемблер, в отличие от машинного языка, позволяет программировать в «условных» адресах, а не в абсолютных машинных, используя для адресации данных символьные имена. Программирование на ассемблере организовано по принципу «один-в-один», т.е. одной ассемблерной команде исходного текста соответствует ровно одна машинная команда в выходном файле машинных команд. Однако в языке ассемблера, помимо команд, эквивалентных машинным и предназначенных для обработки данных или управления процессом выполнения программы, существуют еще «команды» для управления процессом ассемблирования («перевода» с языка ассемблера на язык кодов) - такие средства называются псевдокомандами, директивами ассемблирования, псевдооператорами и т.п. Они предназначены для управления распределением памяти, структурирования программных модулей, связывания модулей, разрабатываемых независимо друг от друга.
Задача проектирования ассемблера ставится следующим образом. Ассемблирующая программа должна:
1) собрать данные о всех используемых в транслируемом модуле символьных именах и блоках их размещения
2) распределить для них оперативную память, т.е. назначить символным ссылкам адресные значения
3) на основе принятой схемы распределения данных и назначенных адресов сгенерировать набор машинных команд
4) сформировать листинг обработки и объектный файл для последующей загрузки
Объектный файл может иметь различную структуру в зависимости от используемой системы программирования, однако обязательно в нем должны присутствовать записи трех типов:
1) запись-заголовок, содержащий имя модуля, его длину и другие общие характеристики
2) кодовая запись, содержащая кодовую последовательность, ее длину и адрес ее размещения в ОЗУ
3) концевая запись, завершающая объектный модуль и содержащая адрес точки входа.
3. Загрузчики. Основные задачи загрузки. Абсолютная (бинарная) загрузка.
Загрузчики - вид системного ПО, предназначенный для решения четырех специфических задач организации выполнения программных модулей:
1) размещения объектного модуля в ОЗУ (собственно загрузка)
2) настройка адресных ссылок внутри модуля в соответствии с адресами его конкретного размещения в ОЗУ (задача перемещения)
3) настройка внешних адресных ссылок модуля в соответствии с адресами размещения других модулей, с которыми данный модуль взаимодействует (задача связывания)
4) передача управления на точку входа настроенного и размещенного в ОЗУ модуля (запуск).
Абсолютный загрузчик выполняет простейшие функции, а именно загрузку и запуск. Поэтому его входным набором должен быть модуль, представляющий двоичный образ памяти и не требующий перемещения и связывания. Задачей загрузчика в этом случае становится чтение всех кодовых записей объектного модуля и запись их в ОЗУ в соответствии с назначенным адресом размещения. После обработки последней кодовой записи необходимо проверить соответствие размеров загруженной кодовой последовательности данным записи-заголовка и передать управление на точку входа, указанную в концевой записи, а при отсутствии адреса точки входа - по адресу первого байта загруженного кода.
4. Загрузчики. Основные задачи загрузки. Назначение и способы организации перемещающей загрузки.
Загрузчики - вид системного ПО, предназначенный для решения четырех специфических задач организации выполнения программных модулей:
1) размещения объектного модуля в ОЗУ (собственно загрузка)
2) настройка адресных ссылок внутри модуля в соответствии с адресами его конкретного размещения в ОЗУ (задача перемещения)
3) настройка внешних адресных ссылок модуля в соответствии с адресами размещения других модулей, с которыми данный модуль взаимодействует (задача связывания)
4) передача управления на точку входа настроенного и размещенного в ОЗУ модуля (запуск).
Поскольку на этапе ассемблирования адрес фактического размещения модуля неизвестен, то ассемблер назначает машинным командам и данным не абсолютные, а условные адреса, как правило относительно начала модуля. Такие адресные значения не требуют модификации при использовании относительного способа адресации, однако не все системы программирования поддерживают данный вид адресации. Кроме этого, абсолютный вид адресации может использоваться при межмодульных ссылках и вызовах процедур. Поэтому адреса, имеющие относительные значения, но использующие абсолютную форму адресации, необходимо обработать - прибавить к ним константу - адрес фактической загрузки всего модуля в ОЗУ. Для этого адреса, требующие такой настройки, должны быть перечислены в специальных записях-модификаторах объектного модуля, имеющих формат: <адрес-модифицируемого-адреса, его длина>. Перемещающий загрузчик поэтому должен выполнять функции абсолютного со следующими дополнениями,- после размещения в памяти кодов обработать записи-модификаторы и к каждому указанному в них адресу добавить константу загрузки.
5. Загрузчики. Основные задачи загрузки. Назначение и логическая схема связывающей загрузки.
Загрузчики - вид системного ПО, предназначенный для решения четырех специфических задач организации выполнения программных модулей:
1) размещения объектного модуля в ОЗУ (собственно загрузка)
2) настройка адресных ссылок внутри модуля в соответствии с адресами его конкретного размещения в ОЗУ (задача перемещения)
3) настройка внешних адресных ссылок модуля в соответствии с адресами размещения других модулей, с которыми данный модуль взаимодействует (задача связывания)
4) передача управления на точку входа настроенного и размещенного в ОЗУ модуля (запуск).
При загрузке независимо оттранслированных модулей возникает проблема связывания загруженных модулей по внешним ссылкам,- поскольку на этапе ассемблирования ассемблеру неизвестны адреса фактического размещения других модулей и их точек входа, то ссылки на эти данные в объектном модуле представлены нулевыми адресами, а адреса этих «неправильных адресов» указаны в специальных записях объектного модуля, формат которых может иметь вид
<адрес_неправильного_адреса, внешнее_ссылочное_имя>
Кроме этого, должны быть указаны адреса имен данного модуля, предоставляемые другим модулям, в записях объектного модуля следующего вида
< внешнее_имя, его_адресное_значение_в_данном_модуле >
Тогда задача связывающего загрузчика сводится к следующему:
1) составить таблицу загрузки, в которой указать для каждого модуля его имя, длину, адрес начала с учетом назначаемого ОС или пользователем адреса начальной загрузки всей сборки и размеров остальных модулей
2) для внешних имен всех модулей в этой таблице также должны быть указаны их имена и адреса,- относительный внутри своего модуля и абсолютный, с учетом адреса загрузки этого модуля
3) выполнить загрузку кода всех модулей в ОЗУ в соответствии с таблицей размещения
4) настройка значений адресных ссылок в каждом из модулей в соответствии с таблицей размещения и записями о расположении ссылки в данном модуле.
Алгоритм работы связывающего загрузчика включает два прохода - на первом составляется таблица загрузки/таблица внешних ссылок, а на втором - производится загрузка и настройка адресных значений.
6. Загрузчики. Основные задачи загрузки. Назначение и схема реализации раскручивающей загрузки. Первоначальная загрузка ОС в ЭВМ с архитектурой IBM PC.
Загрузчики - вид системного ПО, предназначенный для решения четырех специфических задач организации выполнения программных модулей:
1) размещения объектного модуля в ОЗУ (собственно загрузка)
2) настройка адресных ссылок внутри модуля в соответствии с адресами его конкретного размещения в ОЗУ (задача перемещения)
3) настройка внешних адресных ссылок модуля в соответствии с адресами размещения других модулей, с которыми данный модуль взаимодействует (задача связывания)
4) передача управления на точку входа настроенного и размещенного в ОЗУ модуля (запуск).
Так как и сам загрузчик является программой, то возникает вопрос, каким образом он сам оказался в ОЗУ, и утверждение, что он загружается операционной системой неизбежно порождает новый вопрос - а кто загружает ОС. Поэтому в системном ПО используется процедура раскручивающей загрузки (бутстропинг от англ. bootstrap), состоящая в том, что проектируется набор загрузчиков разной функциональности, которые последовательно, в порядке нарастания их сложности, загружают друг друга. Самый первый загрузчик должен быть очень простым, - часто это просто загрузочная запись, и должен грузиться либо вручную, с консоли, либо из ПЗУ «только-на-чтение». По такой схеме производится раскручивающая загрузка ОС в ПК с архитектурой IA86.
После включения питания первой выполняется программа самотестирования POST в ПЗУ BIOS. Она завершается прерыванием, обработчик которого определяет т.н. загрузочное устройство, содержащее в первом секторе нулевой дорожки главную загрузочную запись MBR и таблицу разделов PT. Обработчик копирует первый сектор в ОЗУ и передает ему управление. Первоначальный загрузчик, используя данные РТ, определяет носитель, на котором находится загрузчик следующего уровня - загрузчик операционной системы, и загружает в ОЗУ его. Этот загрузчик в свою очередь, находит и загружает ядро ОС, что позволяет работать утилитам ОС и, в первую очередь, командному процессору, на чем загрузка ОС и заканчивается.
7. Языки высокого уровня (ЯВУ). Системное ПО, необходимое для их использования. Логическая схема компилятора ЯВУ.
ЯВУ (Паскаль, Бейсик, Си, ЛИСП и др.) относятся к машинно-независимым средствам автоматизации программирования, по старой классификации - проблемно-ориентированным СП. Их особенностью является необходимость использования дополнительного ПО для их успешного применения.
Программа на ЯВУ (текстовый файл) должна быть обработана компилятором, в результате чего будет получен объектный модуль, который совместно со статическими и динамическими библиотеками загрузчиком компонуется в исполняемый и загружаемый файл.
Компилятор ЯВУ с логической точки зрения должен включать следующие компоненты:
Сканер - модуль, выделяющий во входном потоке (исходном текстовом файле) основные языковые единицы - лексемы
Синтаксический анализатор - модуль, распознающий в потоке лексем те или иные языковые конструкции (операторы ЯВУ)
Генератор кода - модуль, создающий для распознанных синтаксических конструкций блоки кода, выполняя который ЦП произведет над данными те операции, которые описаны на ЯВУ. Эти блоки кода должны образовать объектный модуль.
8. Формальная грамматика языка высокого уровня (ЯВУ). Ее структура и описание. Дерево грамматического разбора.
Грамматикой языка программирования называется набор правил, описывающих, каким образом из основных символов языка (констант, переменных и служебных слов строятся операторы данного языка.
Формальной грамматикой называется четверка G = < N, T, P, S >, где Т - множество основных символов языка, называемых терминальными (напр. служебные слова, имена переменных, знаки операций), N - множество нетерминалов,- понятий языка, образованных из терминальных символов (напр. операторы, списки, блоки), S - главный нетерминал, цель грамматики, Р - множество правил, описывающих как из терминалов образуются нетерминалы.
Для описания правил грамматики может быть использована нотация Бэкуса - Наура, позволяющая записывать правила в виде
< нетерминал > :: = < терминал > | < нетерминал > < терминал >, где знаки ::- и | обозначают «это есть по определению» и «или». В форме Бэкуса - Наура грамматика языка запишется в виде (напр., для языка Паскаль)
<программа> ::= Program < имя > var < > begin < список операторов > end.
< список описаний > ::= < описание > | < список описаний >, < описание > и т.д.
Набор правил грамматики может быть графически представлен в виде древовидной структуры, корневой вершиной которой будет цель грамматики, а «листьями» - терминалы. Любая синтаксически-правильно написанная программа допускает представление в виде такого дерева, называемого деревом грамматического разбора.