Функции ядра при загрузке системы
- Инициализация системы после загрузки.
После загрузки ядра, оно начинает сканировать адресное пространство по 16 К. Если какой-то модуль не откликнулся, этот модуль памяти считается недоступным.
При генерации ОС можно задавать те банки памяти, которые являются доступными.
Далее, в определённой памяти происходит поиск модулей, определение типов этих модулей.
Идёт определение очерёдности запуска модулей и осуществляется запуск всех необходимых системных модулей.
После этого ядро передаёт управление планировщику, который начинает работу по выделению ресурсов.
- Управлению памятью.
0000 – младший адрес памяти.
В них расположены векторы прерываний устройств, обнаруженных при инициализации.
Далее расположены векторы особых событий (программные прерывания, порождаемые прикладными программами или системными компонентами).
Далее создаётся область данных прикладных программ.
Со старших адресов:
· системные модули данных;
· системные программные модули;
· модули памяти прикладных программ.
Младшие адреса – динамическая область данных. Она будет расти вверх.
· Свободная память.
Модуль памяти всегда занимает подряд идущие адреса памяти.
В конце работы запускает планировщик и контролирует таблицу текущих задач и занимаемые ими ресурсы. А также контролирует таблицу ожидающих задач и их ресурсы. Планировщик занимается конкретным выделением памяти.
В общем случае не существует защиты памяти. Однако, есть возможность при генерации ОС включить модуль защиты памяти, который чётко разделит память на участки.
- Совместное с планировщиком управление процессами.
Планирование происходит через каждый тик таймера. Величина тика задаётся при генерации ОС и действует в течении всего времени (10 мс).
Процессы могут находится в следующих состояниях:
· состояние текущего запуска – процесс загружен в память, у него есть ресурсы и он использует время процесса. Определить статус можно только во время работы планировщика. Остальные процессы могут быть активными, но их не запускают, т.к. не подошло их время по возрасту и по приоритету.
· Состояние ожидания. Процесс ждёт завершение другого.
· Состояние сна. Ждёт наступления определённого времени или события.
· Ожидание события. Может ждать набор событий.
Все эти процессы находятся в очереди задач. Кроме этого, может быть процесс во взвешенном состоянии, т.е. он ждёт в явном виде реакции со стороны другого процесса. Он должен быть принудительно запущен.
Когда процесс уничтожается, остаётся только модуль памяти, в котором хранилась данная задача.
Процесс может стать или остаться текущим по двум причинам: приоритет и возраст.
Если приоритет это величина неизменная и задаётся во время создания модуля памяти (эта величина показывает претензии), то возраст это число тактов ОС, в течении которых этот процесс был активным, но не работал. Максимальное значение возраста: FFFF.
Максимальный приоритет: 64.
Когда процесс переходит в состояние текущий запуск, его возраст становится раным 0, после каждого тика процессора, его возраст не изменяется, а возраст всех активных процессов увеличивается на 1. Если после тика возраст + приоритет у запущенного процесса меньше, чем у любого активного, то этот активный процесс запускается.
d_age_min – минимальная величина возраста = 20 – обычная величина
d_age_max – максимальная величина возраста – по достижению этой величины, возраст перестаёт инкрементироваться. Используется, если существуют процессы, которые не должны быть прерваны.
На практике d_age_max = 0.5*FFFF.