Ядро не має 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.