
- •История операционных систем
- •Первое поколение (1945-55): электронные лампы и коммутационные панели
- •Второе поколение (1955-65): транзисторы и системы пакетной обработки
- •Третье поколение (1965-1980): интегральные схемы и многозадачность
- •Четвертое поколение (с 1980 года по наши дни): персональные компьютеры
- •Онтогенез повторяет филогенез
- •1. Классификация ос
- •1.1 Дос (Дисковые Операционные Системы)
- •1.2 Ос общего назначения
- •1.3 Системы виртуальных машин
- •1.4 Системы реального времени
- •1.5 Средства кросс-разработки
- •1.6 Системы промежуточных типов
- •1.7 Семейства операционных систем
- •1.8 Выбор операционной системы
- •1.9 Открытые системы
- •2. Представление данных в вычислительных системах
- •2.1. Введение в двоичную арифметику
- •2.3. Представление текстовых данных
- •2.4. Представление изображений
- •2.5. Представление звуков
- •2.6. Упаковка данных
- •2.7. Контрольные суммы
- •1.8. Введение в криптографию
- •3. Загрузка программ
- •3.1. Абсолютная загрузка
- •3.2. Разделы памяти
- •3.3. Относительная загрузка
- •3.4. Базовая адресация
- •3.5. Позиционно-независимый код
- •3.6. Оверлеи (перекрытия)
- •3.7. Сборка программ
- •3.8. Объектные библиотеки
- •3.9. Сборка в момент загрузки
- •3.10. Динамические библиотеки
- •3.11. Загрузка самой ос
- •4 Управление оперативной памятью
- •4.1. Открытая память
- •4.2. Алгоритмы динамического управления памятью
- •4.3. Сборка мусора
- •4.4. Открытая память (продолжение)
- •4.4.1. Управление памятью в MacOs и Win16
- •4.5. Системы с базовой виртуальной адресацией
- •5. Компьютер и внешние события
- •5.1. Опрос
- •5.2. Канальные процессоры и прямой доступ к памяти
- •1. Мастер шины (bus master), когда устройство имеет свой собственный контроллер пдп,
- •2. Централизованный контроллер, устанавливаемый на системной плате и способный работать с несколькими различными устройствами.
- •5.3. Прерывания
- •5.4. Исключения
- •5.5. Многопроцессорные архитектуры
3.7. Сборка программ
В большинстве современных языков программирования программа состоит из отдельных слабо связанных модулей. Как правило, каждому такому модулю соответствует отдельный файл исходного текста. Эти файлы независимо обрабатываются языковым процессором (компилятором), и для каждого из них генерируется отдельный файл, называемый объектным модулем. Затем, запускается программа, называемая редактором связей, компоновщиком или, линкером (linker — тот, кто связывает), которая формирует из заданных объектных модулей цельную программу.
Объектный модуль отчасти похож по структуре на перемещаемый загрузочный модуль. Дело в том, что сборку программы из нескольких модулей; можно уподобить загрузке в память нескольких программ. При этом возникает та же задача перенастройки адресных ссылок, что и при загрузке относительного загрузочного файла . Поэтому объектный модуль должен в той или иной форме содержать таблицу перемещений.
Кроме ссылок на собственные метки, объектный модуль имеет право ссылаться на символы, определенные в других модулях.
Для разрешения внешних ссылок мы должны создать две таблицы: в одной перечислены внешние объекты, на которые ссылается модуль, в другой — объекты, определенные внутри модуля, на которые можно ссылаться извне. Обычно с каждым таким объектом ассоциировано имя, называемое глобальным символом. Как правило, это имя совпадает с именем соответствующей Функции или переменной в исходном языке.
Типичный объектный модуль содержит следующие структуры данных.
□ Таблицу перемещений, т. е. таблицу ссылок на перемещаемые объекты внутри модуля.
□ Таблицу ссылок на внешние объекты. Иногда это называется таблицей или списком импорта.
□ Таблицу объектов, определенных в этом модуле, на которые можно ссылаться из других модулей. В некоторых случаях ее называют списком экспорта. Иногда таблицы экспорта и импорта объединяют и называют все это таблицей глобальных символов. В этом случае для каждого символа приходится указывать, определен он в данном модуле или нет, а если определен, то как.
□ Различную служебную информацию, такую, как имя модуля, программу, которая его создала и отладочную информацию.
□ Собственно код и данные модуля.
Как правило, код и данные разбиты на именованные секции. Например, в системах семейства Unix программы, написанные на языке С, состоят из минимум трех программных секций:
□ . text — исполняемый код (современные компиляторы иногда помещают в эту секцию и данные, описанные как const);
□ .data — статически инициализированные данные;
□ .bss — неинициализированные данные.
Некоторые форматы объектных модулей, в частности ELF (Executable and Linking Format — формат исполняемых и собираемых [модулей], используемый современными системами семейства Unix), предоставляют особый тип глобального символа — слабый (weak) символ.
3.8. Объектные библиотеки
Крупные программы часто состоят из сотен и тысяч отдельных модулей. Кроме того, существуют различные пакеты подпрограмм, также состоящие из большого количества модулей. Один из таких пакетов используется практически в любой программе на языке высокого уровня — это так называемая стандартная библиотека. Для решения проблем, возникающих при поддержании порядка в наборах из большого количества объектных модулей, были придуманы библиотеки объектных модулей.
Библиотека, как правило, представляет собой последовательный файл, состоящий из заголовка, за которым последовательно располагаются объектные модули. В заголовке содержится следующая информация.
□ Список всех объектных модулей, со смещением каждого модуля от начала библиотеки. Смещение нужно для того, чтобы можно было легко найти требуемый модуль.
□ Список всех глобальных символов, определенных в каждом из модулей, с указанием, в каком именно модуле он был определен.
Линкер обычно собирает в программу все объектные модули, которые были ему, заданы в командной строке, даже если на этот модуль не было ни одной ссылки. С библиотечными модулями он ведет себя несколько иначе.
Встретив ссылку на глобальный символ, компоновщик ищет определение этого символа во всех модулях, которые ему были заданы. Если там такого символа нет, то линкер ищет этот символ в заголовке библиотеки. Если его нет и там, компоновщик сообщает: "Не определен символ SYMBOL", — и завершает работу. Некоторые редакторы связей, правда, могут продолжить работу и даже собрать загружаемый модуль, но, как правило, таким модулем пользоваться нельзя, так как в нем содержится ссылка на некорректный адрес. Если же определение символа библиотеке есть, компоновщик "вытаскивает" соответствующий модуль и дальше работает так, будто этот модуль был задан ему наравне с остальными объектными файлами. Этот процесс повторяется до тех пор, пока не будут разрешены все глобальные ссылки, в том числе и те, которые возникли библиотечных модулях, или пока не будет обнаружен неопределенный символ. Благодаря такому алгоритму в программу включаются только те модуль из библиотеки, которые нужны.
В системах семейства Unix библиотеки такой структуры называются архив ними библиотеками, чтобы отличить их от разделяемых библиотек.