Лекции по "Криптология "

Автор: Пользователь скрыл имя, 11 Декабря 2011 в 20:34, курс лекций

Краткое описание

Рассмотренные в предыдущем разделе физические механизмы взаимодействия устройств ввода-вывода с вычислительной системой позволяют понять, почему разнообразные внешние устройства легко могут быть добавлены в существующие компьютеры. Все, что необходимо сделать пользователю при подключении нового устройства - это отобразить порты устройства в соответствующее адресное пространство, определить какой номер будет соответствовать прерыванию, генерируемому устройством, и, если нужно, закрепить за устройством некоторый канал DMA.

Оглавление

Лекция 16. Структура системы ввода-вывода. Функции базовой подсистемы ввода-вывода. 1
Логические принципы организации ввода-вывода 1
Структура системы ввода-вывода 1
Функции базовой подсистемы ввода-вывода 4
Буферизация и кэширование 5
Spooling и захват устройств. 6
Обработка прерываний и ошибок 6
Планирование запросов 7
Лекция 15. Система управления вводом-выводом. Физические принципы организации ввода-вывода. Общие сведения об архитектуре компьютера. Структура контроллера устройства. Опрос устройств и прерывания. 8
Физические принципы организации ввода-вывода 8
Общие сведения об архитектуре компьютера 8
Структура контроллера устройства 10
Опрос устройств и прерывания. Исключительные ситуации и системные вызовы 11
Для внешних прерываний характерны следующие особенности: 13
Прямой доступ к памяти (Direct Memory Access – DMA) 14
Лекция 14. Загрузка программ. Абсолютная загрузка. Относительная загрузка. Позиционно-независимый код. Загрузка ОС. Сборка программ. 15
Загрузка программ 15
Абсолютная загрузка 15
Абсолютная загрузка используется, например, в системе UNIX на 32-разрядных машинах. 16
Относительная загрузка 16
Позиционно-независимый код 17
Загрузка ОС 17
Пример: Загрузка системы MS-DOS. 20
Сборка программ 21
Объектный модуль 21
Библиотеки объектных модулей 22
Варианты построения загрузчиков 23
Лекция 13. Кэширование данных. Иерархия запоминающих устройств. Кэш память. Принцип действия кэш-памяти. Проблемы согласования данных. Проблемы отображения основной памяти в кэш. 25
Иерархия запоминающих устройств 25
Кэш-память 25
Принцип действия кэш-памяти 26
Проблема согласования данных 28
Способы отображения основной памяти на кэш 28
Схемы выполнения запросов в системах с кэш-памятью 29

Файлы: 1 файл

модОС.docx

— 97.55 Кб (Скачать)

  Относительная загрузка

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

 Если для  адресации операндов используется  прямая (абсолютная) адресация, то  подобная перенастройка выливается  в процесс изменения всех используемых  в программе абсолютных адресов.  То есть, если мы захотим ``сдвинуть'' программу по адресам виртуальной  памяти так, чтобы она начиналась, скажем, не с адреса 01000, а с  адреса 02000, то мы должны будем  найти все команды с абсолютными  адресными полями и прибавить  ко всем этим полям разность  нового и старого адресов.

 Если же  используется относительная (базовая)  адресация или ее разновидности,  то задача значительно упрощается. В этом случае для перемещения  программы нам нужно только  изменить значения базовых регистров,  и программа даже не узнает, что загружена с другого адреса. 

 Именно так  происходит загрузка .com-файлов в системе MS DOS. Система выделяет свободную память, настраивает программе базовые регистры DS и CS, которые называются сегментными, и передает управление на стартовый адрес.

 В более  сложных ситуациях работа с базовой адресацией почти не отличается от абсолютной: мы должны запомнить все места в программе, где загружаются базовые регистры, и добавить к загружаемым значениям новый стартовый адрес. Единственное преимущество состоит в том, что таких мест в программе гораздо меньше, чем при абсолютной адресации. На практике разница здесь составляет десятки и сотни раз. Для перемещения программы мы обязаны найти в ней и обработать все ссылки на абсолютные адреса.

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

Как бы то ни было, в перемещаемой программе мы вынуждены  запоминать все ссылки на абсолютные адреса и в момент загрузки производить  их настройку на реальный начальный  адрес. Обычно это делается при помощи так называемой таблицы перемещений (relocation table), которая присоединяется к телу загружаемого модуля, и содержит смещения от начала модуля для каждой такой ссылки.

Такой файл гораздо  сложнее абсолютного загружаемого модуля, и носит название относительного или перемещаемого загрузочного модуля. Именно такой формат имеют  exe-файлы в системе MS DOS.

  Позиционно-независимый код

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

 Позиционно-независимые  программы очень удобны для  загрузки, но, к сожалению, их написание  накладывает довольно жесткие  ограничения на стиль программирования. Например, нельзя пользоваться статически  инициализированными переменными  указательного типа.

Кроме того, на многих процессорах, например, Intel 8080/8085 или многих современных RISC-процессорах позиционно-независимый код вообще невозможен - эти процессоры не поддерживают соответствующий режим адресации для данных. Возникают серьезные неудобства при сборке программы из нескольких модулей. Поэтому такой стиль программирования используют только в особых случаях. Например, многие вирусы под MS DOS написаны именно таким образом.

  Загрузка ОС

 При загрузке  самой ОС возникает специфическая  проблема: в пустой машине, скорее  всего, нет программы, которая  могла бы это сделать.

 В кросс-системах эта проблема решается просто. Как правило, значительная часть памяти разделяется между host-системой и целевой. Память целевой системы может быть видна host-машине как часть ее собственного физического адресного пространства (так называемая backpane memory), либо как специальное внешнее устройство. По принципу backpane memory организованы многие многопроцессорные машины, например транспьютерные "фермы". 

 В процессорах  семейства транспьютер фирмы  Inmos может использоваться похожая техника. Транспьютер имеет четыре или более высокоскоростных последовательных канала, называемых линками. Эти линки не являются внешними устройствами, они глубоко интегрированы в архитектуру процессора. Кроме того, транспьютер имеет специальный разъем, по которому передается сигнал boot from link. Если этот сигнал установлен, при включении питания или после получения сигнала сброса (reset) транспьютер начинает ждать, пока с какого-то из линков не придет байт, больший чем 1. Такой байт воспринимается как длина сообщения, которое сейчас должно прийти по этому же линку.

Сообщение загружается  в память с выделенного адреса и запускается как программа. В документации Inmos такая программа называется первичным загрузчиком. Как правило, эта программа загружает следующую, более сложную, называемую вторичным загрузчиком, которая и занимается инициализацией всей системы. В случае сложной конфигурации она может затянуть в память еще один, третичный загрузчик, который и произведет инициализацию.

 Похожий процесс  происходит при загрузке современных  операционных систем с диска.  Это последовательное исполнение  втягивающих друг друга загрузчиков  возрастающей сложности называется  бутстрапом (bootstrap), что можно перевести как "втягивание [себя] за шнурки от ботинок".

 Большинство  современных процессоров не имеют  ничего похожего на линки. При включении питания или аппаратном сбросе такие процессоры исполняют команду, находящуюся по определенному адресу, что-нибудь типа 0xFFFFFFFA. Обычно по этому адресу находится ПЗУ, в котором содержится программа первичного загрузчика. Кстати, транспьютер будет вести себя так же, если сигнал boot from link не установлен.

 На многих  системах в ПЗУ бывает прошито  нечто большее, чем первичный  загрузчик. Это может быть целая  контрольно-диагностическая система,  называемая консольным монитором.  Такой монитор позволяет вам  просматривать содержимое памяти  по заданному адресу, записывать  туда данные, запускать какую-то  область памяти как программу,  и многое другое. Он же позволяет  выбирать устройство, с которого  будет производиться дальнейшая  загрузка. В PDP-11/VAX на таком мониторе  можно даже писать программы,  почти с таким же успехом,  как на ассемблере. Нужно только  уметь считать в уме в восьмеричной  системе счисления.

 На машинах  фирмы Sun в качестве консольного монитора используется интерпретатор языка Forth. На ранних моделях IBM PC в ПЗУ был прошит интерпретатор BASIC. Именно поэтому клоны IBM PC имеют огромное количество плохо используемого адресного пространства выше сегмента 0xC000. Вы можете убедиться в том, что BASIC там должен быть, вызвав из программы прерывание 0x60. Вы получите на мониторе сообщение вроде: NO ROM BASIC. PRESS ANY KEY TO REBOOT. Вообще говоря, этот BASIC не является консольным монитором в строгом смысле этого слова, так как получает управление не перед загрузкой, а лишь после того, как загрузка со всех устройств завершилась неудачей.

 На многих  больших компьютерах существует  отдельная консольная подсистема. Это маломощная машина, используемая  для инициализации центрального  процессора и его загрузки. Так,  у VAX-11/780 внутри стоит консольная PDP-11/03, которая загружает микропрограмму в процессор VAX и инициализирует консольный терминал. 

 После запуска  консольного монитора вы можете  приказать системе начать загрузку. На IBM PC такое приказание отдается  автоматически, и часто загрузка  производится вовсе не с того  устройства, с которого хотелось  бы. На этом и основан жизненный  цикл загрузочных вирусов. 

 Проще всего  происходит загрузка с различных  последовательных устройств - лент, перфолент, магнитофонов, перфокарточных  считывателей и т.д. Первичный  загрузчик считывает в память  все, что можно считать с  заданного устройства и передает  управление на начало того, что  прочитал.

 В современных  системах такая загрузка практически  не используется. В них загрузка  происходит с устройств с произвольным доступом, как правило - с дисков. При этом обычно в память считывается нулевой сектор нулевой дорожки диска. Содержимое этого сектора часто называют первичным загрузчиком, хотя в терминологии фирмы Inmos это будет уже вторичный загрузчик (первичный прошит в ПЗУ). Иначе этот загрузчик называют загрузочным сектором, или boot-сектором. Как правило, этот загрузчик ищет на диске начало файловой системы своей родной ОС, ищет в этой файловой системе файл с определенным именем, закачивает его в память и передает на него управление. Часто такой файл и является ядром операционной системы.

 Размер вторичного  загрузчика ограничен, чаще всего  размером сектора на диске,  то есть 512 байтами. Если файловая  система имеет сложную структуру,  иногда вторичному загрузчику  приходится подкачать третичный  загрузчик, размер которого может  быть намного больше. Из-за большего  размера этот загрузчик намного  умнее и в состоянии разобраться  в структурах данных файловой  системы.

 В старых  веpсиях MS DOS (3.30 и pанее) эта проблема была решена еще проще: файлы IO.SYS и MSDOS.SYS обязаны занимать на диске непрерывное пространство. Загрузочный сектор находит корневую директорию, находит в ней ссылки на соответствующие файлы и их длину и считывает требуемое количество секторов, начиная со стартового. Это существенно проще, чем разбираться с типом FAT, размером кластера и всей относящейся к делу информацией. В ранних версиях DOS эти файлы вообще должны были лежать в начале диска.

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

 В современных  системах возможен еще один  интересный способ загрузки - загрузка  с сети. Он происходит аналогично  загрузке с диска - стартовое  ПЗУ посылает в сеть пакет  стандартного содержания, который  содержит запрос к серверу  удаленной загрузки. Этот сервер  передает по сети вторичный  загрузчик, и т.д. Такая механика  может использоваться при загрузке  бездисковых рабочих станций.

 Когда ядро  системы, наконец-то, окажется в  памяти, оно обычно запускает  некоторую специальную программу  инициализации. В случае MS DOS такая  программа содержится в модулях  MSDOS.SYS/IO.SYS. Имеется в виду процедура  интерпретации файла CONFIG.SYS. Эта  процедура определяет параметры  настройки системы, драйверы устройств,  которые нужно загрузить, и  т.д. В системе UNIX старых версий: System V стаpее, чем SVR4, или стаpых системах ветви BSD UNIX, все эти драйверы и параметры настройки намертво зашиты в ядро. Для изменения конфигурации системы вы должны собирать ядро заново. В случае BSD, которая поставляется в виде исходных текстов на C и ассемблере, вам, возможно, придется также перекомпилировать часть модулей. 

 Тем не  менее, в UNIX имеется специальная  инициализационная программа, которая  так и называется - init. Эта программа запускает различные процессы-демоны, например cron - программу, которая умеет запускать другие заданные ей программы в заданные моменты времени, различные сетевые сервисы, программы, которые ждут ввода с терминальных устройств (getty), и т.д. То, что она запускает, вообще говоря, задается в специальном файле /etc/inittab. Администратор системы может редактировать этот файл и устанавливать те сервисы, которые в данный момент нужны, избавляться от тех, которые не нужны, и т.д. Отчасти это похоже на группу startup в MS Windows. Вообще, аналогичный инициализационный сервис предоставляют все современные операционные системы.

 Существуют  операционные системы, которые  не умеют самостоятельно выполнять  весь цикл бутстрапа. Они используют более примитивную операционную систему, которая исполняет их вторичный (или какой это уже будет по счету) загрузчик, и помогает этому загрузчику затянуть в память ядро ОС. На процессорах i80x86 в качестве стартовой системы часто используется MS/DR DOS, а загрузчик новой ОС оформляется в виде .EXE-файла. Таким образом устроены MS Windows, DesqView и ряд других ``многозадачников'' для MS DOS. Таким же образом загружается сервер Novell Netware, система Oberon для i386, программы, написанные для различных расширителей DOS (DOS extenders) и т.д.

Информация о работе Лекции по "Криптология "