Ядро не має mainфункції. mainє поняттям мови С. Ядро пишеться на С і збирання. Вхідний код ядра записується складанням.
Послідовність завантаження організована наступним чином:
- Зазвичай BIOS завантажує завантажувач із пристрою завантажувального блоку. Популярний зараз завантажувач - grub.
- Grub завантажує зображення ядра в рамку, можливо з початковим кореневим пристроєм (
initrd). Потім виконується код за якоюсь адресою.
- У зображенні ядра є деякі модулі ядра, наприклад: модулі файлової системи, драйвери пристроїв. Зображення ядра використовує модуль файлової системи для монтажу кореневої файлової системи. Тепер ядро може завантажувати та запускати всі модулі ядра з диска.
- Ядро виконує завдання ініціалізації. Наприклад: пройти шину PCI та знайти всі пристрої PCI, ініціалізувати всі драйвери пристроїв.
- Нарешті, ядро створює процес 0 і процес 1 (
initпроцес), перемикає контекст ЦП з кільця 0 на кільце 3 і запускає процес init (ідентифікатор процесу 1). Тепер завантаження ядра закінчено!
initПрограма запускає все системні сценарії запуску. Всі послуги запускаються. Оболонка називається. Користувачі можуть увійти в систему.
mainФункція є функцією С. Насправді основним методом не є точка входу в програми C. Виконання програми C заздалегідь викликає багато функцій main. GCC має особливість розширення: конструктори. Функції, оголошені "конструктором", називаються раніше main.
Наприклад:
/* This should not be used directly. Use block_init etc. instead. */
#define module_init(function, type) \
static void _attribute__((constructor)) do_qemu_init ## function(void) { \
register_module_init(function, type); \
}
Цей макрос є з проекту qemu.