Функции ядра при загрузке системы

  1. Инициализация системы после загрузки.

После загрузки ядра, оно начинает сканировать адресное пространство по 16 К. Если какой-то модуль не откликнулся, этот модуль памяти считается недоступным.

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

Далее, в определённой памяти происходит поиск модулей, определение типов этих модулей.

Идёт определение очерёдности запуска модулей и осуществляется запуск всех необходимых системных модулей.

После этого ядро передаёт управление планировщику, который начинает работу по выделению ресурсов.

 

  1. Управлению памятью.

0000 – младший адрес памяти.

В них расположены векторы прерываний устройств, обнаруженных при инициализации.

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

Далее создаётся область данных прикладных программ.

Со старших адресов:

· системные модули данных;

· системные программные модули;

· модули памяти прикладных программ.

Младшие адреса – динамическая область данных. Она будет расти вверх.

· Свободная память.

Модуль памяти всегда занимает подряд идущие адреса памяти.

В конце работы запускает планировщик и контролирует таблицу текущих задач и занимаемые ими ресурсы. А также контролирует таблицу ожидающих задач и их ресурсы. Планировщик занимается конкретным выделением памяти.

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

  1. Совместное с планировщиком управление процессами.

Планирование происходит через каждый тик таймера. Величина тика задаётся при генерации ОС и действует в течении всего времени (10 мс).

Процессы могут находится в следующих состояниях:

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

· Состояние ожидания. Процесс ждёт завершение другого.

· Состояние сна. Ждёт наступления определённого времени или события.

· Ожидание события. Может ждать набор событий.

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

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

Процесс может стать или остаться текущим по двум причинам: приоритет и возраст.

Если приоритет это величина неизменная и задаётся во время создания модуля памяти (эта величина показывает претензии), то возраст это число тактов ОС, в течении которых этот процесс был активным, но не работал. Максимальное значение возраста: FFFF.

Максимальный приоритет: 64.

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

d_age_min – минимальная величина возраста = 20 – обычная величина

d_age_max – максимальная величина возраста – по достижению этой величины, возраст перестаёт инкрементироваться. Используется, если существуют процессы, которые не должны быть прерваны.

На практике d_age_max = 0.5*FFFF.