Операционная система загружается в оперативную память при. Начальная загрузка операционной системы

Вкратце процесс загрузки компьютера описан в статье "Включение ПК" раздела BIOS. Рассмотрим этот процесс более подробно.

Инициализация системы средствами BIOS

  1. Нажатие кнопки включения питания. При включении кнопки Power на элементы материнской платы поступают питающие напряжения; по сигналу Power Good запускается тактовый генератор; на процессор подается сигнал сброса, который устанавливает его в исходное состояние. Начинают работать программы системного BIOS.
  2. Проверка BIOS. Контрольная сумма системных программ, находящихся в ПЗУ, находится в одной из ячеек. После запуска контрольная сумма пересчитывается и сравнивается с эталонным значением.
  3. Идентификация процессора. Материнская плата предусматривает возможность установки различных моделей процессора. БИОС подает запрос на идентификацию процессора и по полученному ответу определяет тип процессора, частоту, напряжения и проч.
  4. Настройка базовых элементов. Инициализируются и тестируются базовые компоненты системной платы: блок прямого доступа к памяти, таймер, блок аппаратных прерываний.
  5. Тестирование ОЗУ. Определяется тип модулей памяти, их объем, организация; тестируются первые 64 Кб оперативной памяти.
  6. Организация рабочих структур ОЗУ. Выделяется область под БИОС, настраиваются прерывания.
  7. Проверка CMOS-памяти и батарейки. При неисправной батарейке CMOS все данные настройки БИОС, находящиеся в памяти теряются. Загрузка последней конфигурации становится невозможной, о чем сообщается на экране монитора. Есть возможность осуществить загрузку стандартных заводских значений БИОС.
  8. Инициализация устройств материнской платы. Производится поиск и настройка загрузочных устройств (жесткий диск, привод CD, FDD), средств управления процессом загрузки (клавиатура, мышь), устройств ввода-вывода (COM, LPT). Устройствам выделяются соответствующие линии прерывания .
  9. PnP. Идентифицируются устройства, подключенные через системные разъемы. Устройствам выделяются ресурсы и прерывания.
  10. Включение видеосистемы. Запускается Video BIOS, который настраивает видеоконтроллер на режим VGA или EGA, которые поддерживают все видеоконтроллеры. После этого видеоконтроллер готов к работе.
  11. Выдача сообщения на экран монитора. На экране монитора появляется первое сообщение: фирма-производитель BIOS, тип и частота процессора, тип и объем ОЗУ.
  12. Тестирование ОЗУ. Производится выборочная проверка незадействованной оперативной памяти.
  13. Инициализация контроллера дисководов.
  14. Инициализация контроллера жестких дисков.
  15. Инициализация клавиатуры. Включается контроллер клавиатуры, производится тест матрицы контактов, устанавливаются временные параметры опроса клавиш и режим NumLock. Клавиатура готова к работе. На экран выводится сообщение о возможности использования программы BIOS Setup (обычно для этого используется клавиша Del).
  16. Поиск устройств с собственным BIOS. Если таковые устройства найдены, то управление передается BIOS-программам этих устройств и происходит их инициализация.
  17. Передача управления загрузчику ОС. По программному прерыванию Int 19h на дисковых накопителях ищется загрузчик ОС (Boot Record). Он должен находиться на одном из устройств (HDD, CD, FDD, SCSI). Местоположение загрузчика везде одинаково. После того, как загрузчик ОС найден, управление передается ему.

Загрузка операционной системы

Ядро операционной системы (ОС) загружается в ОЗУ, после чего в памяти системы размещается основная часть ОС.


БИОС производит "грубую" настройку компьютерной системы. Его основная задача - "вдохнуть" жизнь в компьютерное железо, независимо от его конкретной модификации. Новые модели процессоров, материнских плат, чипсетов и прочих устройств выходят чуть ли не ежеквартально. Невозможно в БИОС сразу заложить идентификацию всего этого разнообразия. Да это и не нужно. Основная задача БИОС сделать начальную инициализацию оборудования и запустить работу операционной системы, которая сама производит "тонкую" настройку компьютерных составляющих.


На заре развития персоналок конфигурирование системы требовало от пользователей соответствующей квалификации. Наверняка, пользователи со стажем еще помнят такие файлы, как config.exe и autoexec.bat , которые надо было правильно настроить, чтобы "телега" нормально поехала.


Что поделать, - это была обратная сторона медали открытой архитектуры IBM. За удобство получения компьютера нужной конфигурации надо было платить знаниями по его правильной настройке. Такие неудобства отпугивали неподготовленных пользователей, поэтому, фирмы-производители ПК не могли долго мириться с подобным положением вещей. Производители компьютерной техники и разработчики программного обеспечения постарались максимально снять с потребителя необходимость конфигурирования своего компьютера. Впервые новая процедура настройки системы была применена в ОС Windows - операционная система сама "опрашивала" подключенные устройства и правильно настраивала их:

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

Задача, в общем-то, довольно сложная. Для облегчения ее выполнения производители чипсетов и разработчики ПО согласовали и установили определенные правила механизма начальной загрузки. Теперь компоненты компьютерной системы, требующие инициализации и настройки комплектовались соответствующим программным обеспечением (инициализирующими программами, драйверами, INF-файлами):

  • Инициализирующие программы заносят управляющие коды по конкретным адресам (разовая процедура);
  • Драйверы - это программы, управляющие работой контроллера соответствующего устройства;
  • INF-файл - командный файл, помогающий ОС организовать процедуру настройки конкретного компьютерного блока.

Начальная загрузка Windows ведется под управлением командного файла, который содержит перечень программ и драйверов выполняемых в процессе загрузки ОС. Это, так называемая, "заготовка" командного файла, которая должна в процессе первоначальной установки Windows на компьютер, переделана в рабочую версию, соответственно установленному оборудованию на данном компьютере.


Windows имеет определенный набор универсальных драйверов (который постоянно пополняется с выходом новой версии ОС), позволяющих выполнить настройку всех компонентов системы. Справедливости ради следует сказать, что универсальные драйвера Windows далеко не всегда способны произвести оптимальную настройку того или иного устройства, что снижает производительность и стабильность работы всей компьютерной системы. Поэтому, все устройства поставляются со "своим" установочным ПО (как правило, на CD). При первоначальной установке нового устройства Windows может попросить вас установить в дисковод диск с соответствующими драйверами для правильной настройки нового устройства. Рекомендуется также следить за выходом новой версии драйверов (в которых исправлены ошибки, сделана оптимизация работы и проч.) для чипсета своей материнской платы и регулярно обновлять их.

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

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

Как отредактировать процесс загрузки нескольких операционных систем Windows, установленных на одном компьютере – об этом подробнее ниже.

Итак, имеем в нашем случае компьютер с установленными версиями Windows 7 и 8.1. При включении компьютера видим окно загрузчика с перечнем систем для выбора.

Каждый раз при загрузке компьютера попасть в нужную систему можно, сделав соответствующий выбор. В противном случае по истечении определённого времени – а по умолчанию это 30 секунд – автоматически будет загружена Windows, стоящая в списке первой. В нашем случае это Windows 7 , поскольку она установлена на компьютер последней, и именно её загрузчик, как видим, встречает нас после запуска компьютера.

Что же, изменим это. Настроим автоматическую загрузку основной системы – Windows 8.1. Для этого, естественно, необходимо войти в неё.

Нам нужен раздел настроек , и в Windows 8.1 в него можно попасть с помощью контекстного меню на кнопке .

В окошке системы выбираем дополнительные параметры .

Попасть в раздел настроек в Windows 7 можно также с помощью контекстного меню, но вызванном на значке «Компьютер» в проводнике. В числе команд необходимо выбрать .

В Windows 7 также выбираем дополнительные параметры .

Дальнейшие шаги в обоих системах идентичны.

В появившемся окне свойств системы во вкладке «Дополнительно» жмём кнопку параметров в последнем разделе .

Теперь можно приступать к редактированию загрузки нескольких систем. Меняем загружаемую по умолчанию Windows из числа вариантов в выпадающем списке. В нашем случае предустановленную Windows 7 меняем на Windows 8.1.

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

Если преимущественно работа проводится только в одной системе , нет смысла оставлять полминуты ожидания её автоматической загрузки. Другую операционную систему можно не лишать возможности запуска, но сократить предустановленное время для выбора вариантов загрузки. В отображении списка загружаемых систем в нашем случае установим 5-секундное ожидание перед автоматической загрузкой основной системы Windows 8.1. Этого времени хватит с лихвой, чтобы осуществить выбор, если вдруг когда-то понадобится войти в Windows 7.

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

Если вторая операционная система когда-то понадобится, войти в неё можно будет, сделав эту опцию снова активной .

После внесения изменений жмём «Ок» внизу этого окна, а также внизу окна свойств системы.

Всё – список загрузки операционных систем отредактирован.

Выше мы рассмотрели редактирование загрузки существующих операционных систем. Но нередко при запуске компьютера можем увидеть перечень операционных систем, которых уже на компьютере нет . Это естественное развитие событий после того, как вторая операционная система была удалена путём обычного форматирования раздела диска или уничтожения системных файлов вручную, но при этом запись о возможности её загрузки в конфигурации системы не убиралась. Загрузчик также может отображать вариант запуска несуществующей основной Windows после того, как система была переустановлена . Это, кстати, не основная, но одна из причин, почему системщики советуют осуществлять так называемую чистую установку Windows – без сохранения файлов предыдущей системы и с форматированием раздела диска.

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

В основной системе вызываем команду . В Windows 8.1 быстрый доступ к ней реализован в контекстном меню на кнопке .

Нам нужен раздел конфигурации системы . Вводим в поле команды значение:

Жмём «Ок» .

В Windows 7 запустить окно конфигурации системы можно проще — прописав ключевой запрос в поисковом поле меню .

Появится окно конфигурации системы, переходим на вкладку . Выбираем запись о загрузке несуществующей системы и удаляем её .

В нашем случае перечень загрузки содержал разные версии Windows, и определиться с удаляемой «Семёркой» нам явно не составило труда. Но если в перечне загрузки числятся записи о двух одинаковых версиях Windows, в ориентации с той, которую нужно удалить, помогут описания систем. Windows, в которой мы по факту находимся, будет обозначена как текущая .

Внесённые изменения сохраняем кнопкой . После нажатия «Ок» система предложит перезагрузиться .

После перезапуска компьютера можем наблюдать незамедлительную автозагрузку основной системы.

login , регистрирующая пользователей в системе, запускается только тогда, когда сама система уже приведена в полную готовность и работает в обычном режиме. Происходит это далеко не сразу после включения компьютера: Linux - довольно сложная система, объекты которой попадают в оперативную - процесс ступенчатый: поведение компьютера на различных этапах загрузки определяется разными людьми - от разработчиков аппаратной составляющей до системного администратора. Предъявляемые к системе требования гибкости, возможности изменять ее настройку в зависимости от аппаратной составляющей, необходимость решать разные задачи с помощью одного и того же компьютера тоже делают процесс загрузки ступенчатым: сначала определяется профиль будущей системы, а затем этот профиль реализуется .

Начальный этап вообще не зависит от того, какая операционная система установлена на компьютере, для некоторых этапов в каждой операционной системе предлагаются свои решения - по большей части, взаимозаменяемые. Эту стадию (начальную) назовем досистемной загрузкой . Начиная с определенного этапа, загрузка компьютера уже управляется самой Linux, используются утилиты, сценарии и т.п. Эту стадию (завершающую) назовем системной загрузкой .

Загрузчик в ПЗУ

Сразу после включения оперативная память компьютера классической архитектуры девственно чиста. Для того чтобы начать работать, процессору необходима хоть какая-то программа. Эта программа автоматически загружается в память из постоянного запоминающего устройства , ПЗУ (или ROM, read-only memory), в которое она вписана раз и навсегда в неизменном виде 1Современные компьютеры используют программируемые ПЗУ , содержимое которых можно изменять, однако такое изменение всегда считается ситуацией нештатной: например, запись новой версии содержимого ПЗУ , в которой исправлены ошибки (upgrade). . В специализированных компьютерах (например, в дешевых игровых приставках) все, что нужно пользователю, записывается именно на

Обычно в компьютерах общего назначения программа из ПЗУ пользователю ничем полезна не бывает: она невелика, да и делает всегда одно и то же. Слегка изменить поведение программы из ПЗУ можно, оперируя данными, записанными в энергонезависимую память (иногда ее называют CMOS, иногда - NVRAM ). Объем энергонезависимой памяти очень невелик, а данные из нее сохраняются после выключения компьютера за счет автономного электропитания (как правило, от батарейки вроде часовой).

Что должна уметь эта начальная программа? Распознавать основные устройства, на которых может быть записана другая - нужная пользователю - программа, уметь загружать эту программу в память и передавать ей выполнение, а также поддерживать интерфейс, позволяющий менять настройки в NVRAM . Собственно, это даже не одна программа, а множество подпрограмм , занимающихся взаимодействием с разнообразными устройствами ввода-вывода - как с теми, на которых могут храниться программы (жесткие и гибкие диски, магнитные ленты и даже сетевые карты), так и теми, посредством которых можно общаться с пользователем (последовательные порты передачи данных - если есть возможность подключить консольный терминал, системная клавиатура и видеокарта - для простых персональных рабочих станций). Этот набор подпрограмм в ПЗУ обычно называется BIOS (basic input-output system).

BIOS . Сокращение от "Basic Input-Output System", набор подпрограмм в ПЗУ , предназначенных для простейшего низкоуровневого доступа к внешним устройствам компьютера. В современных ОС используется только в процессе начальной загрузки.

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

Загрузочный сектор и первичный загрузчик

Чаще всего размер первичного дискового загрузчика - программы, которой передается управление после нулевого этапа, - весьма невелик. Это связано с требованиями универсальности подобного рода программ. Считывать данные с диска можно секторами , размер которых различается для разных типов дисковых устройств (от половины килобайта до восьми или даже больше). Кроме того, если считать один, первый, сектор диска можно всегда одним и тем же способом, то команды чтения нескольких секторов на разных устройствах могут выглядеть по-разному. Поэтому-то первичный загрузчик занимает обычно не более одного сектора в самом начале диска, в его загрузочном секторе .

Если бы первичный загрузчик был побольше, он, наверное, и сам мог бы разобраться, где находится ядро операционной системы , и смог бы самостоятельно считать его, разместить в памяти, настроить и передать ему управление. Однако ядро операционной системы имеет довольно сложную структуру - а значит, и непростой способ загрузки; оно может быть довольно большим, и, что неприятнее всего, может располагаться неизвестно где на диске, подчиняясь законам файловой системы (например, состоять из нескольких частей, разбросанных по диску). Учесть все это первичный загрузчик не в силах. Его задача скромнее: определить, где на диске находится "большой" вторичный загрузчик , загрузить и запустить его. Вторичный загрузчик прост, и его можно положить в заранее определенное место диска, или, на худой конец, положить в заранее определенное место карту размещения , описывающую, где именно искать его части (размер вторичного загрузчика ограничен, поэтому построить такую карту возможно).

Карта размещения . Представление области с необходимыми данными (например, вторичным загрузчиком или ядром системы) в виде списка секторов диска, которые она занимает.

В случае IBM-совместимого компьютера размер загрузочного сектора составляет всего 512 байтов , из которых далеко не все приходятся на программную область. Загрузочный сектор IBM PC, называемый MBR ( master boot record ), содержит также таблицу разбиения диска , структура которой описана в лекции 11. Понятно, что программа такого размера не может похвастаться разнообразием функций. Стандартный для многих систем загрузочный сектор может только считать таблицу разбиения диска , определить так называемый загрузочный раздел ( active partition ) и загрузить программу, расположенную в начале этого раздела . Для каждого типа диска может быть своя программная часть MBR , что позволяет считывать данные из любого места диска, сообразуясь с его типом и геометрией. Однако считывать можно все же не более одного сектора: неизвестно, для чего используются установленной на этом разделе операционной системой второй и последующие сектора. Выходит, что стандартная программная часть MBR - это некий предзагрузчик , который считывает и запускает настоящий первичный загрузчик из первого сектора загрузочного раздела .

Существуют версии предзагрузчика , предоставляющие пользователю возможность самостоятельно выбрать , с какого из разделов выполнять загрузку 2Например, BOOTACTV из пакета pfdisk или стандартный для FreeBSD предзагрузчик boot0 , которые, в силу их досистемности , можно применять где угодно. . Это позволяет для каждой из установленных операционных систем хранить собственный первичный загрузчик в начале раздела и свободно выбирать среди них. В стандартной схеме загрузки Linux используется иной подход: простой первичный загрузчик записывается прямо в MBR , а функция выбора передается вторичному загрузчику .

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

Загрузчик ядра

В задачу операционной системы . Как правило, ядро системы записывается в файл с определенным именем. Но как вторичному загрузчику прочитать файл с ядром , если в Linux эта операция и есть функция ядра ? Эта задача может быть решена тремя способами.

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

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

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

А вы никогда не задумывались над тем, что же происходит с операционной системой в тот момент, когда она рисует свой логотип и говорит «Starting Windows»? И вообще, почему она долго загружается? Ведь при старте системы уж точно не решаются никакие задачи, сложные с вычислительной точки зрения!

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

Давайте интереса ради разберемся, какие модули, в каком количестве и в каком порядке загружаются при старте ОС. Чтобы выяснить это, можно, например, получить лог загрузки системы. Подопытная ОС в моем случае - Windows 7 Enterprise x64. Логировать процесс загрузки будем при помощи отладчика ядра. Существует несколько вариантов отладчиков ядра, лично я предпочитаю WinDbg. Также нам понадобятся некоторые вспомогательные средства для волшебного превращения лога в нечто более приятное глазу.

Mining and crafting

Настройка отладки хорошо гуглится, поэтому описывать подробно этот процесс я не буду. Поскольку нас интересует все происходящее с момента старта системы, нам нужно отметить пункт «Cycle Initial Break», с помощью чего отладчик остановится, как только в отлаживаемой системе будет загружена подсистема отладки ядра. Дублирование вывода в файл можно осуществить при помощи команд ".logopen" и ".logclose", это просто. Другая полезная команда - ".cls". Она очищает экран команд, и да, только экран команд.

Интересующая нас функция - «MiCreateImageFileMap». Это внутренняя функция менеджера памяти, проецирующая исполняемый файл в память. Проецирование в память происходит при создании секции, например, при запуске исполняемого файла. Однако учтите, что если исполняемый файл проецируется в память, это не гарантия того, что будет выполнен его код! Эта функция просто создает проекцию, чаще всего «про запас», чтобы, если кто-то надумает запустить модуль на исполнение, можно было сэкономить время его загрузки. На эту функцию поставим логирующую точку останова.

Если у вас достаточно маны, вводите следующую команду:
bu nt!MiCreateImageFileMap "dt nt!_EPROCESS -d ImageFileName @$proc; dt nt!_FILE_OBJECT -d FileName @rcx; g"
Магическая строчка буквально означает следующее:

  • bu (Set Unresolved Breakpoint) - установить неразрешенную точку останова. Не то чтобы кто-то или что-то не разрешал, просто для ее установки необходимо определиться, по какому адресу ее ставить. Дело в том, что заранее не известно, по какому адресу она должна располагаться. При загрузке любого модуля проверяется присутствие в нем необходимой функции, и если такая функция найдена, точка останова устанавливается автоматически. Такой способ установки незаменим при включенном ASLR - рандомизации адресного пространства, поскольку модули будут загружаться каждый раз по разным адресам, и точка останова, установленная по фиксированному адресу, с большой вероятностью окажется не у дел.
  • nt!MiCreateImageFileMap - символ, на котором нужно останавливаться. В WinDbg принята запись в форме "module_name!function_name". В данном случае nt является предопределенным псевдонимом для ntoskrnl.exe.
  • далее следует часть WinDbg-скрипта, которая будет выполняться каждый раз при остановке на этой функции. «dt nt!_EPROCESS -d ImageFileName @$proc» по-русски означает «отобразить поле ImageFileName структуры _EPROCESS из модуля nt при условии ее отображения по адресу, определенному в псевдорегистре «текущий процесс»». Следующая после разделителя ";" команда означает примерно то же самое, только адрес структуры берется из регистра rcx, в котором в Microsoft x64 ABI передается первый параметр функции. «g» означает «go», т.е. продолжить исполнение.

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

Поехали! Отжимаем тормоз точки останова и ждем. Я ждал, пока не прогрузится рабочий стол, т.е. я залогинился. Полученный «урожай» немного редактируется, обрезается все лишнее для удобства дальнейшей обработки и скармливается дружище питону. Не будем заострять внимание на парсинге лога. Отметим только, что граф укладывался в форму спирали Архимеда с дальнейшей коррекцией вручную, поскольку происходило наложение узлов друг на друга. В полученном графе учитывается порядок загрузки библиотек. К сожалению, пришлось пожертвовать учетом порядка загрузки исполняемых файлов относительно библиотек в угоду удобочитаемости графа.

Карта звездного неба


Условно выделим несколько групп загрузки.

Начинается работа OC в модуле ntoskrnl.exe, являющимся ядром ОС. А если еще конкретнее - с функции KiSystemStartup(). Вместе с загружаемыми системными компонентами она формирует фундамент ОС: разделение режимов работы, базовые сервисы для пользовательских приложений и т.п. В эту же группу входят драйверы, отмеченные для загрузки во время старта системы. В двух словах, в этой ракушке зарождается ОС Windows.

Следующий узел - менеджер сессий (session manager). Его представляет первый после системного процесс, стартующий в Windows - smss.exe. Процесс примечателен тем, что является родным (native) процессом Windows, то есть он не использует подсистему Win32, которая в общем-то еще не загружена. Этот процесс использует только нативные сервисы операционной системы посредством ntdll.dll, представляющей собой интерфейс режима пользователя для сервисов ОС. Также этот процесс является доверенным компонентом операционной системы и обладает исключительными правами, например, он может создавать маркеры безопасности (security tokens). Но главное его предназначение - создание сеансов и инициализация подсистем, как графической, так и различных исполняемых (Windows, POSIX). Эта ракушка воздает каждому по потребностям.

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

Самой массивной оказалась группа сервисов. Во многом она обязана своим объемом службе SuperFetch. Эта та самая, про которую говорят, что она по выходным заранее прогружает офисный пакет, а в начале рабочей недели - Steam с игрушками. Superfetch прогружает огромное количество модулей при старте системы, чтобы потом «все быстрее работало». Да и кроме него в системе хватает сервисных приложений и автозапускающихся драйверов. Думаю, все видели оснастку «Службы и приложения». Эта звезда жизни заводит в системе все, что нужно и не очень.

Последним отмечу любимый всеми explorer.exe. Примечательно, что к моменту его запуска все используемые им модули уже загружены в память. В скриншот также попал некий vcredist_x64.exe - бедолага лежал на рабочем столе подопытной виртуальной машины и был прогружен в память проводником.

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

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

Граф загрузки был построен для ОС Windows 7 Enterprise x64, установленной на виртуальной машине VMware. Ниже приведены векторное изображение графа и непосредственно файл в формате gml, с которым можно поиграться в любом редакторе графов.

Для нормальной работы компьютера необходимо, чтобы основные модули опера­ционной системы находились в оперативной памяти. Поэтому после включения компьюте­ра организована автоматическая перезапись (загрузка) операционной системы с диска в оперативную память.

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

    Загрузчик операционной системы;

    Системные файлы IO.SYS и MSDOS.SYS ;

    Драйверы устройств.

    Командный процессор MS DOS (файл COMMAND.COM);

    Внешние команды MS DOS .

Кроме того, MS-DOS, как и все другие операционные системы для IBM PC , использует встроенное программное обеспечение компьютера, именуемое Базовой Системой Ввода-Вывода (BIOS).

Рассмотрим указанные программные модули в том порядке, в каком они загружаются в оперативную память после включения ПК.

Базовая система ввода-вывода - это самый низкий уровень управления, своего рода интерфейс между аппаратными средствами компьютера и программами. BIOS управляет непосредственно аппаратурой компьютера и избавляет другие программы от знания деталей того, как это делается. Программы BIOS записываются в ПЗУ компьютера фирмой-производителем и осуществляют:

    самотестирование компьютера при его включении (программа POST);

    инициализацию, т.е. настойку компьютерного оборудования (определяется конфигурация компьютера, устанавливаются необходимые значения некоторых регистров);

    выполнение обслуживающих функций и обработку аппаратных прерываний;

    загрузку операционной системы, записанной на магнитном диске (программа BOOT).

Сразу после включения компьютера начинает работать программа POST, проверяя работоспособность оперативной памяти и других компонентов компьютера. Затем BIOS производит инициализацию и пытается считать с диска в дисководе А: программу-загрузчик операционной системы, чтобы передать ей управление и продолжить процесс загрузки DOS. При отсутствии необходимых файлов или самого гибкого диска поиск продолжается на жестких дисках С:, D:, Е: и т.д. Если загрузочный (или, иными словами, системный) диск не найден, сообщение об этом выдается на монитор.

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

Загрузчик операционной системы - это очень короткая программа, находящаяся в первом секторе каждой дискеты и жесткого диска (винчестера) с операционной системой MS DOS. Функция этой программы заключается в считывании с загрузочного диска в оперативную память системных файлов DOS.

Системный файл IO.SYS - это расширение BIOS. Этот модуль настраивает операционную систему на конкретную конфигурацию вычислительного комплекса и позволяет подключать новые драйверы к нестандартным устройствам ввода-вывода,

Системный файл MSDOS.SYS - модуль обработки прерываний. В основном он обслуживает файловую систему и распоряжается распределением оперативной памяти.

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

При успешной загрузке системных файлов программный модуль IO.SYS устанавливает требуемую конфигурацию вычислительной системы. С этой целью он помещает в оперативную память компьютера драйверы внешних устройств.

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

Командный процессор завершает процесс загрузки операционной системы. После того, как управление компьютером передано командному процессору, последний автоматически начинает выполнение специального командного файла - AUTOEXEC.BAT (если такой файл присутствует в корневом каталоге загрузочного диска). В файле AUTOEXEC.BAT указывают команды и программы, выполняемые при каждом запуске компьютера. С помощью этого файла можно произвести настройку параметров операционной среды. Например, со­здать виртуальный диск, обеспечить смену режимов печати, загрузить вспомогательные программы и т.д.

Файлы с расширением.ВАТ играют при работе в системной среде особую роль. Они содержат совокупность ко­манд операционной системы или имен исполняемых файлов. После запуска файла с расширением.ВАТ все записанные в нем команды выполняются автоматически одна за другой.

Если файл AUTOEXEC.BAT не найден в корневом каталоге диска, с которого загружается операционная система, то MS DOS запрашивает у пользователя текущую дату и время.

После выполнения файла AUTOEXEC.BAT процесс загрузки операционной системы заканчивается. Командный процессор выдает приглашение, показывающее, что MS-DOS готова к приему команд. Приглашение обычно имеет вид А:\> или, например,С:\>, если загрузка производилась с жесткого диска.

Интернет