Ядро Linux представляет собой сердце операционной системы, выполняющее роль посредника между аппаратным обеспечением компьютера и пользовательскими приложениями. Это сложная система, состоящая из миллионов строк кода (около 38 миллионов на текущий момент), которая обеспечивает базовые функции операционной системы.

Интересный факт: Ядро Linux было создано Линусом Торвальдсом в 1991 году как хобби-проект. Сегодня это одна из самых успешных open-source систем в мире, работающая на миллиардах устройств - от смартфонов до суперкомпьютеров.

Структура каталогов ядра Linux

При клонировании репозитория ядра Linux можно увидеть логично организованную структуру каталогов, где каждый имеет свое четкое назначение:

Основные каталоги

arch/

Архитектурно-специфичный код для различных платформ (x86, ARM, MIPS и др.)

block/

Подсистема блочных устройств ввода-вывода

drivers/

Драйверы устройств (самый большой каталог)

fs/

Файловые системы и виртуальная файловая система (VFS)

kernel/

Основные компоненты ядра

mm/

Подсистема управления памятью

net/

Сетевая подсистема

security/

Механизмы безопасности (SELinux, AppArmor, YAMA)

Дополнительные важные каталоги

crypto/

Криптографические алгоритмы и API

Documentation/

Документация по ядру

init/

Код загрузки и инициализации ядра

include/

Заголовочные файлы

io_uring/

Подсистема асинхронного ввода-вывода (высокопроизводительная, но с потенциальными уязвимостями)

ipc/

Межпроцессное взаимодействие

lib/

Библиотеки ядра

rust/

Экспериментальная поддержка языка Rust

security/

Механизмы безопасности (SELinux, AppArmor, YAMA)

scripts/

Скрипты конфигурации и сборки

tools/

Утилиты для разработки

Примечание: Каталог io_uring содержит подсистему асинхронного ввода-вывода, которая обеспечивает высокую производительность, но имеет потенциальные уязвимости. Google отключает её по умолчанию из соображений безопасности.

Архитектура ядра Linux

Монолитная архитектура

Linux использует монолитную архитектуру - основные функции реализованы в одном большом исполнительном файле.

✅ Преимущества

❌ Недостатки

- Единое адресное пространство

- Высокая производительность

- Быстрое взаимодействие между подсистемами

- Эффективность - нет накладных расходов на IPC

- Сложность разработки и отладки

- Высокая взаимозависимость модулей

- Большой размер (38 млн строк кода)

- Уязвимость может компрометировать всю систему

Загружаемые модули

Несмотря на монолитность, Linux поддерживает динамическую загрузку модулей:

module_init() // инициализация модуля module_exit() // выгрузка модуля // Поддержка KUnit для модульного тестирования

Процесс загрузки ядра Linux

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() - сетевое взаимодействие

Системы инициализации

SystemD

  • Модульная архитектура

  • Параллельная загрузка сервисов

  • Легкая настройка пользовательских сервисов

  • Мониторинг жизненного цикла

Альтернативы

  • OpenRC (Gentoo)

  • SysV init - традиционная система

  • Различные подходы к управлению сервисами

Заключение

Ядро Linux представляет собой сложную монолитную систему, выполняющую огромный объем работы для обеспечения функционирования современного компьютера. От момента включения питания до появления приглашения командной строки ядро проходит через множество этапов инициализации, настраивая аппаратное обеспечение, подсистемы безопасности и все необходимые компоненты для работы операционной системы.

Более подробно разбираем на наших курсах Разработка модулей ядра Linux (Linux Kernel developer) и Разработка на C под Linux

Комментарии (3)


  1. MonsterCatz
    05.08.2025 11:04

    Детальный разбор архитектуры ядра Linux

    Где?

    Я когда увидел "время чтения 4 минуты" уже понял, к чему все это. Но еще и взять простую копипасту из условного chatgpt и запростить это на habr - вы совсем не уважаете ни себя, ни читателей.


    1. TIEugene
      05.08.2025 11:04

      Насчет 49% - это Вы автору льстите. Походу его ChatGPT круче Вашего.
      Ну а так вообще - ядро ОС это прежде всего task manager. Который иногда удается вместить в 256 байт.
      Всё остальное - подарок фирмы.


      1. MonsterCatz
        05.08.2025 11:04

        49% - это то, что выдал первый бесплатный анализатор в гугле на 2000 символов, но это и так невооруженным глазом видно, что ИИ. Это даже грустно, что сгенерированный мусор просачивается абсолютно везде.