Смекни!
smekni.com

Ответы на вопросы по курсу “Системное программирование” (стр. 6 из 7)

Параметры – могут передаваться по значению и по ссылке, размещаются в стеке перед вызовом процедуры, после выполнения кода пролога к ним возможно адресоваться через регистр BP, при завершении подпрограммы удаляются из стека.

Сегментация памяти. Типы программных сегментов, их использование в программах.

Любая программа состоит из многих частей. Как правило некоторые функции пишутся самостоятельно, другие используются готовыми. Чтобы обеспечить взаимодействие между частями программы, применяют ряд механизмов.

а) унитарная структура объектного модуля.

б) механизм внешних ссылок позволяет устанавливать связи между отдельными частями.

в) Способ объединения отдельных частей в общий исполняемый модуль. В современных системах основой 3-го способа и является сегментация.

Сегменты – бывают 4 видов.

а) кодовые – содержат коды исполняемой программы. Вряде случаев там можно располагать и данные. Модификация сегмента кода в процессе работы программы считается плохим стилем программирования, но иногда это приходится делать, напр. при сохранении регистров перед запуском программы функцией EXEC.

Сегменты данных бывают 3 типов:

а) сегмент инициализированных данных – содержит данные статического типа с уже присвоенными значениями

б) сегмент стека – как правило, ничем не инициализирован

в) сегмент неинициализированных данных. В него попадают данные, не имеющие начального значения (BSS).

Исполняемый модуль содержит образ начального состояния всех сегментов, и не обязан содержать только образ BSS.

При использовании указателей в программах с не более чем одним сегментом данных и не более чем одним – кода достаточно 16-битового короткого указателя, т.к. значения сегментов фиксиованы и хранятся в регистрах DS и CS соответственно. Для большего количества сегментов требуются длинные указатели.

Существует несколько моделей памяти – способов распределения программ по сегментам. Поддержка переключения моделей памяти есть в компиляторах C и ASSEMBLER, в остальных, например TruboPascal, чаще всего используется модель памяти LARGE.

TINY (крошечная) – и данные и код в одном сегменте (64К). Короткие указатели. Полученный исполняемый модуль может быть пригоден для конверсии в формат типа COM.

SMALL (малая) – 2 сегмента – код и данные (128K).Короткие указатели.

COMPACT (компактная) – 1 сегмент кода и много сегментов данных. Первая модель, где нужны дальние указатели.

MEDIUM (средняя) – наоборот, много сегментов кода, 1 данных.

LARGE (большая) – много сегментов кода и данных. Наиболее распространена.

HUGE (огромная) – то же, что и LARGE + все указатели программно приводятся к виду длинных. Используется для построения очень больших программ.

В 32-битовом режиме модели памяти не нужны, т.к. размер сегмента достигает 4ГБ.

31. Особенности указателей в 80х86. Модели памяти.

См. 30.

Понятие среды ОС. Взаимодействие прикладной программы с ОС. Системные соглашения о связях.

Структура взаимодействия аппаратуры, системы и прикладного ПО.

Аппаратные средства ПРИЛОЖЕНИЕ

Операционная система

Прикладное ПО API


СИСТЕМА

Среда ОС – совокупность условий, в которых работают прикладные програмы в данной ОС. Современная ОС обеспечивает, как минимум, 4 условия:

а) запуск и остановка прикладных программ.

б) распределение ресурсов.

в) обеспечение таких системных услуг, которых нет в аппаратуре.

г) защиту, т.е минимальную вероятность повреждения программ и данных при сбое одной из выполняющихся программ.

Чтобы писать приложения под ОС, существует ряд правил, которым должен следовать программист, в частности, он должен знать API – интерфейс прикладного программирования. Определяет состав, параметры и смысл функций, предоставляемых ОС программисту.

Например: стандарт POSIX на API ОС UNIX включает функции:

Набор файловых операций

Операции со строками

Ф-ии многозадачности, управления процессами

Управление терминалом.

Помимо POSIX есть APIWin32 и т.п. АPI ОС может включать самые разнообразные услуги, вплоть до поддержки функций телефонного аппарата на базе модема (TAPIWin32)

Принципы междумодульного взаимодействия: внешние ссылки и общие имена (publicnames)

Внешние ссылки из сегмента позволяют получать доступ к данным, которые объявлены в другом модуле. Для объявления внешних ссылок в компиляторах с ассемблера используется директива EXTRN. Пример использования:

EXTRNmaybe:far

Идентификаторы в программе можно сделать доступными из других модулей. Для этого применяется директива PUBLIC. Пример использования:

maybePROCfar

PUBLICmaybe

Такие действия необходимы для того, чтобы после раздельной компиляции модулей компоновщик, используя имена и смещения, записанные в объектных модулях, разрешил все внешние ссылки директив EXTRN, использовав соответствующие директивы PUBLIC. Если для какой-то ссылки EXTRN не будет обнаружен соответствующий идентификатор PUBLIC, то компоновщик выдаст ошибку unresolvedexternal <имя_идентификатора>, и сборка прекратится.

Использование многомодульной структуры необходимо:

а) для разбиения большого текста на модули по функциональному назначению;

б) для создания библиотек процедур;

в) для написания подпрограмм в языки высокого уровня.

Технология разработки программ – трансляция и редактирование связей. Понятие об исходном, объектном, выполняемом модулях.

Исходный код программы – код, написанный на языке программирования. Может включать модули на ЯВУ и модули с подпрограммами на языке ассемблера.

Объектный модуль – код программы после трансляции (компиляции), преобразованный в машинные коды. Помимо них содержит внешние ссылки и информацию для редактора связей и может также содержать отладочную информацию (debuginfo).

Исполняемый модуль –модуль, содержащий готовую к выполнению программу – м.б. 2 видов:

а) точный образ памяти программы с привязкой к абсолютным адресам (в MS-DOS – формат файла *.COM)

б) перемещаемый исполняемый формат, см. 17.

Трансляция – получение объектного кода из исходного.

Редактирование связей – разрешение внешних ссылок и создание исполняемого модуля из объектных.

Основные функции редактора связей – распределение памяти, разрешение внешних ссылок – см. 17, 33.

Программные сегменты и их атрибуты, способы распределения памяти под сегменты.

Собственно сегменты и распределение памяти см. 30.

Атрибуты сегментов

Атрибут комбинации сегмента предназначен дляуказания компоновщику, каким образом объединять сегменты, находящиеся в разных модулях и имеющие одинаковые имена. М.б. PRIVATE (сегмент не будет объединяться с одноименными из др. модулей), PUBLIC (будет) и некоторые другие.

Атрибут класса сегмента представляет собой строку, заключенную в кавычки, которая позволяет определить компоновщику нужный порядок размещения сегментов при помещении их в программу из разных модулей. Он группирует вместе сегменты с одинаковым классом.

Атрибут выравнивания сегмента – сообщает компонаовщику, чтобы он позаботился о том, чтобы сегмент начинался с указанной границы. Возможное выравнивание: BYTE – выравнивание не делается, сегмент начинается со следующего байта, WORD (DWORD) – выравнивание погарнице слова (двойного слова), PARA – выравнивание по границе 16-байтового параграфа, и т.п.

Атрибут размера сегмента – показывает размер, 16 или 32-битные сегменты.

Атрибут доступа – показывает возможность доступа к сегменту в защищенном режиме – доступен как кодовый, для чтения, записи, чтения и записи.

Разрешение внешних ссылок, функция автовызова, библиотеки объектных модулей и их использование.

Разрешение внешних ссылок – см. 33, 17.

Библиотеки объектных модулей – пакет объектных модулей, собранных в один файл и подключаемый к программе на этапе разрешения внешних ссылок (все идентификаторы, которые должны быть доступны из библиотек, объявляются в модулях как PUBLIC). Компоновщик может просматривать библиотеку и самостоятельно находить нужные модули, избавляя от этого программиста. Библиотеки делаются с помощью программы-библиотекаря. Библиотекарь может добавлять и извлекать модули, а также получать список доступных идентификаторов.

Любой компилятор ЯВУ имеет в комплекте несколько стандартных библиотек, например, библиотеки ввода-вывода, работы с плавающей точкой, графическую и т.п.

Типы внешних ссылок и общих имен. Статическое и динамическое разрешение ссылок.

Статическое и динамическое разрешение внешних ссылок.

Процесс разрешения внешних ссылок на этапе создания исполняемого модуля – статическое разрешение ссылок. Возможно и динамическое подсоедиение нужных модулей на этапе работы программы.

а) Динамически вызываемый загрузчик, т.е. программа вызывает загрузчик и подсоединяет недостающие части. Такой подход невыгоден (сложен и требует много времени)

б) DLL – принцип разделяемых библиотек. DLL – это пакет функций, отредактированный для исполнения в позиционно-независимом стиле. Имеет таблицу всех содержащихся функций. Для работы с ним программа выполняет 1) функцию загрузки DLL, 2)переход по смещению в таблице функций.