Интересный факт
Ядро Linux было создано Линусом Торвальдсом в 1991 году как хобби-проект. Сегодня это одна из самых успешных open-source систем в мире, работающая на миллиардах устройств - от смартфонов до суперкомпьютеров.
Примечание: Каталог io_uring содержит подсистему асинхронного ввода-вывода, которая обеспечивает высокую производительность, но имеет потенциальные уязвимости. Google отключает её по умолчанию из соображений безопасности.
module_init() // инициализация модуля module_exit() // выгрузка модуля // Поддержка KUnit для модульного тестирования
1️⃣ Предварительная загрузка (BIOS/UEFI):
- BIOS выполняет POST (Power-On Self Test)
- Читает загрузочный сектор (первые 512 байт)
- Загружает загрузчик (обычно GRUB 2)
2️⃣ Загрузка ядра
- BIOS выполняет POST (Power-On Self Test)
- Читает загрузочный сектор (первые 512 байт)
- Загружает загрузчик (обычно GRUB 2)
3️⃣ Инициализация ядра
Процесс начинается с функции start_kernel():
- set_task_stack_end_magic() - защита от переполнения стека
- smp_setup_processor_id() - настройка идентификаторов CPU
- local_irq_disable() - отключение прерываний
- setup_arch() - архитектурно-зависимая настройка
- mm_init() - инициализация управления памятью
- sched_init() - инициализация планировщика
4️⃣ Создание процессов init и kthreadd
- Создание процесса init с PID=1
- Создание потока kthreadd для управления ядерными потоками
- Запуск планировщика
5️⃣ Системные сервисы
- init_IRQ() - настройка прерываний
- vfs_caches_init() - инициализация VFS
- Запуск системных служб
Функция setup_arch()
Эта функция выполняет критически важные архитектурно-зависимые настройки:
- Инициализация KASLR (рандомизация адресного пространства ядра)
- Настройка KASAN (kernel address sanitizer)
- Обработка командной строки ядра
- Инициализация областей CPU
1. Управление процессами
- Создание: fork(), clone()
- Завершение: exit()
- Ожидание: wait()
- Замена: exec()
2. Планирование процессов
- Completely Fair Scheduler (CFS) или планировщик на основе дедлайнов
- Вытесняющая многозадачность
- Учет приоритетов и состояний процессов
3. Управление памятью
Аллокаторы:
- Buddy allocator - для больших блоков
- Slab/SLUB allocator - для объектов фиксированного размера
- kmalloc()/kfree() - общие функции выделения
- vmalloc() - виртуальная памят
4. Системные вызовы
Интерфейс между пользовательским пространством и ядром:
- open(), read(), write() - работа с файлами
- fork(), exec(), exit() - управление процессами
- socket() - сетевое взаимодействие