Модули ядра

Терминология

Функции ядра ОС:

  • управление запуском приложений в виде процессов
  • предоставление приложениям доступ к оборудованию
  • предоставление приложениям доступ к файлам во внешней памяти

Ядро Linux реализует модель вытесняющей многозадачности.

Ядра различных ОС можно классифицировать по структуре:

  • Монолитные — ядро является единым модулем. Ранние версии ядра ОС Linux были монолитными. Преимуществами являются простота структуры и более высокая производительность (нет накладных расходов на переключение контекста между разными модулями). Недостатком является неустойчивость ядра перед малейшими ошибками в коде любого драйвера.
  • микроядерные — ядро маленькое и загружает модули по мере необходимости аналогично прикладным программам. Драйверы в микроядерных ОС не могут нарушить работу системы в целом. На практике микроядерные ОС пока не получили широкого распространения. Преимуществами является устойчивость к ошибкам в коде драйверов, простота развития. Недостатками являются высокие накладные расходы на переключение контекстов между различными модулями. Примеры: Fuchsia, Minix
  • гибридные — промежуточный вариант. Большинство современных ОС используют гибридную структуру ядра.

Параметры ядра (Полный список).

  • Редактирование параметров при загрузке (через загрузчик GRUB).
  • Редактирование параметров через sysctl (в рантайме либо через конф.файл /etc/sysctl.conf).

В процессорах с архитектурой x86 есть несколько механизмов которые используются ОС:

  • механизм защиты памяти (кольца защиты)
  • механизм трансляции адресов (виртуальная память процессов) - приложения использют виртуальные адреса, контроллер памяти преобразовывает их в физические адреса памяти

Механизм трансляции памяти в x86 работает со страницами по 4 килобайта. Каждая страница может быть помечена как:

  • код приложения (.text)
  • данные (.data)
  • данные только для чтения (.rodata)
  • неинициализированные данные (.bss)
  • стек (stack)
  • куча (heap)

Процессоры с архитектурой x86 используют механизм прерываний (interruption) чтобы выполнять специальный код для обработки событий:

  • аппаратные / программные
  • маскируемые (могут быть отключены) / немаскируемые (неотключаемые) Например прерывания вызываются:
  • при ошибках
    • деление на ноль
    • ошибки памяти (приложение запросило данные из страницы памяти, которая была выгружена в файл подкачки)
    • и т.д.
  • при работе с оборудованием Для поиска кода обрабатыващего прерывания используется таблица векторов прерываний (IVT).

Режимы работы кода:

  • kernel space - у кода есть системные права
  • user space - код запускается с правами пользователя

С точки зрения безопасности, нужно чтобы в kernel space работало как можно меньше кода.

Модуль ядра — это часть ядра Linux, которую можно динамически загрузить и выгрузить. Как правило, модули ядра являются драйверами для различных устройств и файловых систем. Модули хранятся в каталоге /lib/modules/ (/usr/lib/modules/), в файлах с расширением *.ko.

DKMS (Dynamic Kernel Module Support) — система для автоматической перекомпиляции сторонних драйверов при обновлении ядра ОС Linux.

Виртуальная файловая система — файловая система, которая не хранится в постоянной внешней памяти (диске). Виртуальные файловые системы:

  • /proc/ — взаимодействие с процессами (раньше также использовалась для взаимодействия с ядром)
  • /sys/ — взаимодействие с ядром ОС (echo 1 > /sys/class/leds/input3::capslock/brightness)
  • /run/ — временные файлы, которые нужны только во время текущего сеанса работы

FUSE — Filesystem in user space — файловая система, драйвер которой работает в user space.

Initial ramdisk (initrd) — образ начальной файловой системы, который содержит:

  • модули ядра ОС (драйверы, отключаемые подсистемы ядра)
  • системные утилиты
  • копии важных конфигурационных файлов

Система инициализации — первый запускающийся в Linux процесс, программа, которая управляет запуском системных служб:

  • Systev V init (sysv init, устарела)
  • SystemD (RedHat, Ленарт Поттеринг)
  • Upstart (больше не развивается)
  • OpenRC
  • Runit

Команды

Команды для получения информации о ядре:

  • uname -a — информация о ядре
  • cat /proc/version — версия ядра
  • cat /proc/cmdline — аргументы командной строки
  • sysctl -a — просмотр текущих параметров ядра
  • sysctl <параметр> — чтение значения параметра ядра
  • sysctl <параметр>=<значение> — изменение значения параметра ядра

Например: параметр sys

Команды для получения информации об оборудовании:

  • cat /proc/cpuinfo — данные о процессоре
  • lscpu — данные о процессоре
  • cat /proc/meminfo — подробные данные об использовании памяти (ОЗУ)
  • free — данные о занятой/свободной памяти (ОЗУ)
  • journalctl -k / dmesg — журнал работы с оборудованием
  • lspci — перечень оборудования подключаемого через шину PCI
  • lsusb — перечень оборудования подключаемого через шину USB

Команды для работы с модулями ядра:

  • lsmod — список загруженных модулей
  • modinfo — информация о модуле
  • instmod — загрузить модуль без проверки на совместимость с АО
  • modprobe — загрузить модуль
  • rmmod — выгрузить модуль

Важные файлы и каталоги:

  • /boot/vmlinuz... — сжатый образ ядра ОС
  • /boot/initrd... (либо initramfs...) — образ начальной ФС
  • /etc/sysctl — файл с настройками параметров ядра
  • /etc/sysctl.d/* — файлы с дополнительными настройками модулей ядра
  • /etc/modprobe.d/* — файлы с настройками модулей ядра

Например, очень часто после установки проприетарного драйвера для видеокарт Nvidia (nvidia) бывает необходимо отключить загрузку open-source драйвера (nouveau). Для этого нужно добавить в любой файл в каталоге /etc/modprobe.d/ (например blacklist-nouveau.conf) строку:

blacklist nouveau

Создание образа начальной файловой системы

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

Создание образа начальной файловой системы в разных дистрибутивах происходит с помощью разных утилит (initrd, cpio, mkinitrd, mkinitramfs, yaird, mkinitcpio).

В Ubuntu: update-initramfs - скрипт для обновления initrd в дистрибутиве Ubuntu.

В Ubuntu на процедуру создания образа начальной файловой системы влияет файл /etc/initramfs-tools/initramfs.conf — конфигурационный файл утилиты mkinitramfs.