Приветствую, коллега! Если ты когда-нибудь задумывался, почему Linux не падает каждый раз, когда твой браузер решает съесть всю память, или как вообще операционка умудряется управлять этим железным монстром под капотом, — значит, ты по адресу. Сегодня разберём архитектуру Linux по шестерёнкам и винтикам.
Представь себе сложнейший паровой механизм с тремя камерами. Каждая камера отделена от других герметичными перегородками, и пар (данные) может перетекать между ними только через специальные клапаны. Именно так работает Linux — через уровни абстракции.
Уровень первый: машинное отделение (аппаратные средства)
В самом низу, в трюме нашего корабля, находится аппаратный уровень. Здесь царит грубая физика: процессоры пашут как каторжные, память хранит биты, жёсткие диски крутят свои магнитные пластины (или молча хранят данные в SSD, если тебе повезло), а сетевые карты гоняют пакеты по проводам.
Сюда же относятся все периферийные устройства: принтеры, сканеры, мыши, клавиатуры — всё, что можно потрогать руками (и что обычно ломается в самый неподходящий момент).
Важный нюанс: на этом уровне нет никакого Linux. Вообще. Здесь только электричество, магнетизм и квантовая механика в процессорах. Железо тупо исполняет машинные команды — ничего не знает о процессах, файлах или пользователях.
Что происходит на аппаратном уровне:
- CPU выполняет инструкции и делает вычисления
- RAM хранит данные временно (пока есть питание)
- Диски хранят данные постоянно
- Контроллеры управляют потоками данных между устройствами
- Прерывания (IRQ) сигнализируют процессору о событиях

Уровень второй: сердце механизма (пространство ядра)
А вот теперь начинается магия. Ядро Linux — это то, что все называют «Linux», хотя на самом деле это лишь одна из частей системы. Ядро живёт в специальной защищённой области памяти — kernel space (пространство ядра).
Главная задача ядра — быть посредником между железом и пользователем. Это как старший механик на пароходе: он не даёт пассажирам (пользовательским программам) лезть в машинное отделение и крутить все вентили подряд. Вместо этого механик сам управляет всеми механизмами по запросу.
Что делает ядро:
1. Управление процессами
Ядро решает, какой процесс получит процессор и на сколько времени. Это как диспетчер на железнодорожной станции — распределяет пути (процессорное время) между поездами (процессами).
2. Управление памятью
Ядро выделяет и освобождает память, создаёт иллюзию, что у каждой программы есть своё собственное адресное пространство. На самом деле это виртуальная память, которую ядро транслирует в физическую.
3. Файловая система
Ядро превращает хаос битов на диске в понятную структуру файлов и директорий. Без ядра диск — это просто набор секторов с нулями и единицами.
4. Сетевой стек
Вся сетевая магия — от отправки пакетов до сложных протоколов вроде TCP/IP — происходит в ядре.
5. Драйверы устройств
Ядро общается с железом через драйверы. Большинство драйверов — это модули ядра, которые можно загружать и выгружать на лету.
Системные вызовы: клапаны между мирами
Программы из пользовательского пространства не могут напрямую обращаться к железу или памяти ядра. Вместо этого они используют системные вызовы (system calls) — специальные «двери» в ядро.
Когда программе нужно:
- Прочитать файл
- Отправить данные по сети
- Выделить память
- Создать процесс
…она делает системный вызов. Процессор в этот момент переключается из пользовательского режима (Ring 3) в привилегированный режим ядра (Ring 0), выполняет запрос и возвращается обратно.

Модули ядра: сменные шестерёнки
Одна из крутейших фич Linux — модули ядра. Это как сменные блоки в паровой машине: можно добавить новую функциональность без перезагрузки всей системы.
Посмотри, какие модули загружены прямо сейчас:
lsmod | head -20Или загрузи модуль вручную:
sudo modprobe vboxdrvМодули живут в /lib/modules/$(uname -r)/kernel/. Каждый драйвер, каждая файловая система, каждый сетевой протокол — это отдельный модуль.
⚡ Важно
модули ядра работают в пространстве ядра! Ошибка в модуле может уложить всю систему. Поэтому будь осторожен с модулями из ненадёжных источников.
Практика: заглядываем в ядро
Давай посмотрим, что происходит в ядре прямо сейчас.
Просмотр информации о ядре:
uname -aПокажет версию ядра, архитектуру и дату сборки.
Просмотр загруженных модулей:
lsmodИли более подробно:
cat /proc/modulesПросмотр системных вызовов в реальном времени:
sudo strace -p $(pidof systemd) 2>&1 | head -50Это покажет последние 50 системных вызовов процесса systemd (будь осторожен, strace может замедлить процесс!).
Просмотр прерываний:
watch -n 1 'cat /proc/interrupts | head -20'Эта команда покажет, какие устройства генерируют прерывания и как часто.
Уровень третий: пассажирская палуба (пользовательское пространство)
Наконец, мы добрались до user space — пространства пользователя. Здесь происходит всё, с чем ты взаимодействуешь: графические оболочки, браузеры, терминалы, текстовые редакторы, серверы приложений.
Главное отличие: программы в user space работают в изолированных адресных пространствах. Если браузер упадёт, он не утащит за собой текстовый редактор или всю систему. Это как каюты на корабле: если в одной каюте потоп, это не значит, что весь корабль пойдёт ко дну.
Что живёт в user space:
1. Прикладные программы
Всё, что ты запускаешь: Firefox, LibreOffice, VS Code, игры.
2. Системные демоны
Фоновые процессы: systemd, cron, sshd, nginx. Они работают без графического интерфейса, но всё ещё в user space.
3. Оболочки (shells)
Bash, Zsh, Fish — всё это программы в user space. Даже терминал — это просто программа, которая рисует красивое окошко и запускает shell.
4. Библиотеки
glibc, libssl, libpng — все библиотеки, которые используют программы.
Чем дистрибутивы отличаются друг от друга?
Именно user space — это то, чем отличаются дистрибутивы Linux! Ядро может быть одинаковым (версии 5.x или 6.x), но:
- Ubuntu/Debian используют systemd, apt, deb-пакеты
- Arch Linux использует systemd, pacman, AUR
- Alpine Linux использует OpenRC, apk, musl вместо glibc
- Slackware использует BSD-инициализацию, tgz-пакеты
По сути, дистрибутив — это набор программ в user space + способ их установки и обновления.

Практика: исследуем user space
Посмотреть все процессы:
ps auxИли интерактивно:
htopПосмотреть дерево процессов:
pstree -pПокажет иерархию процессов с PID.
Узнать, какие библиотеки использует программа:
ldd /usr/bin/firefox | head -20Покажет первые 20 библиотек, которые линкует Firefox.
Посмотреть переменные окружения:
env | sortПеременные окружения — это способ коммуникации между процессами в user space.
Найти процессы по имени:
pgrep -l firefoxИли более подробно:
ps aux | grep firefoxКак уровни взаимодействуют: полный цикл
Давай проследим полный путь от нажатия клавиши до появления буквы на экране.
1. Аппаратный уровень
Ты нажимаешь клавишу «A» на клавиатуре. Контроллер клавиатуры генерирует прерывание (IRQ), которое поступает в процессор.
2. Пространство ядра
Процессор приостанавливает текущую задачу и передаёт управление драйверу клавиатуры в ядре. Драйвер считывает скан-код клавиши, преобразует его в символ «A» и помещает в буфер ввода.
3. Системный вызов
Программа (например, текстовый редактор) делает системный вызов read(), чтобы прочитать ввод с клавиатуры.
4. Возврат в user space
Ядро копирует символ «A» из kernel space в buffer программы в user space.
5. Отрисовка
Программа вызывает системный вызов write() или использует графическую библиотеку, которая в конечном итоге вызовет системные вызовы для отрисовки буквы на экране.
6. Снова kernel space
Ядро через видеодрайвер отправляет данные в видеокарту.
7. Аппаратный уровень
Видеокарта обновляет пиксели на мониторе.
Всё это происходит за миллисекунды! И так — миллионы раз в секунду.
Границы безопасности: почему это важно
Разделение на kernel space и user space — это не просто архитектурное изящество, а фундамент безопасности.
Если программа в user space падает:
- Умирает только этот процесс
- Остальные программы продолжают работать
- Система стабильна
Если модуль ядра в kernel space падает:
- Kernel panic
- Вся система зависает или перезагружается
- Потеря всех несохранённых данных
Если злоумышленник эксплуатирует уязвимость в user space:
- Он получает доступ только к этому процессу и файлам пользователя
- Не может читать память других процессов
- Не может напрямую обратиться к железу
Если злоумышленник эксплуатирует уязвимость в kernel space:
- Полный контроль над системой
- Доступ ко всей памяти
- Возможность скрыть своё присутствие (rootkit)
- Обход всех механизмов безопасности
Поэтому ядро Linux проходит тщательный аудит безопасности, а загрузка сторонних модулей ядра должна быть под строгим контролем.
Продвинутые темы: что за пределами трёх уровней?
eBPF: революция в наблюдаемости
В современных ядрах Linux (начиная с 3.18) появилась технология eBPF (extended Berkeley Packet Filter). Она позволяет запускать безопасный код в ядре без загрузки модулей!
eBPF-программы проходят проверку на безопасность перед загрузкой и не могут:
- Зациклиться (ограничение по количеству инструкций)
- Обратиться к произвольной памяти
- Выполнить опасные инструкции
Это открыло новые возможности для:
- Мониторинга производительности
- Сетевой фильтрации
- Безопасности (detect threats in real-time)
Пример:
# Установка bpftrace для трассировки
sudo apt install bpftrace
# Просмотр системных вызовов в реальном времени
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s opened %s\n", comm, str(args->filename)); }'Контейнеризация: виртуализация на уровне user space
Docker, LXC, Podman — все эти технологии используют возможности ядра Linux для создания изолированных сред в user space:
- Namespaces изолируют процессы, сеть, файловую систему
- Cgroups ограничивают ресурсы (CPU, память, I/O)
- Capabilities делят root-права на отдельные привилегии
Всё это работает без эмуляции железа — контейнеры используют то же ядро, что и хост!
Виртуализация: KVM
KVM (Kernel-based Virtual Machine) — это модуль ядра, который превращает Linux в гипервизор. В отличие от контейнеров, KVM создаёт полноценные виртуальные машины с собственным ядром.
KVM использует аппаратную виртуализацию процессоров Intel VT-x и AMD-V для прямого выполнения кода гостевой системы на процессоре.
Практические советы от бывалого инженера
1. Не загружай сомнительные модули ядра
# Проверь подписи модулей
modinfo vboxdrv | grep signer2. Следи за системными вызовами подозрительных программ
# Запусти программу под strace
strace -f -o debug.log suspicious_program3. Проверяй, какие программы обращаются к ядру
# Посмотри dmesg на предмет ошибок
dmesg -T | tail -504. Используй seccomp для ограничения системных вызовов
# Запусти программу с ограниченным набором syscall
systemd-run --scope -p SystemCallFilter="@system-service" myapp5. Мониторь использование памяти ядром
# Посмотри, сколько памяти занято ядром
cat /proc/meminfo | grep -E "^(MemTotal|MemFree|Slab|SReclaimable)"Заключение
Архитектура Linux с её тремя уровнями абстракции — это шедевр инженерной мысли. Как хорошо отлаженная паровая машина, она разделяет ответственность:
- Hardware — грубая сила и физика
- Kernel Space — интеллект и управление
- User Space — удобство и функциональность
Понимание этой архитектуры — ключ к тому, чтобы стать не просто пользователем Linux, а настоящим инженером, способным диагностировать проблемы, оптимизировать систему и создавать надёжные приложения.
Помни: ядро — это не просто код. Это страж, который защищает железо от хаоса пользовательских программ, а пользователя — от сложности железа. Уважай эту границу, и Linux прослужит тебе верой и правдой долгие годы.
До новых встреч в машинном отделении, коллега! И помни: если что-то пошло не так, всегда есть dmesg и /proc.
⚙️ Машинное отделение ROADIT благодарит за прочтение.
Больше команд, шпаргалок и обзоров — на roadit.ru и в нашем Телеграф-канале.
📋 Все команды