Feb 8, 2025
Программирование ядра Linux – Краткое введение
Приветствуем вас в этой книге, посвященной изучению программирования ядра Linux! Эта книга, теперь во втором издании, была специально написана для того, чтобы помочь вам овладеть разработкой ядра Linux в практической, практико-ориентированной форме, наряду с необходимым теоретическим фоном, чтобы дать вам полное представление о этой обширной и интересной теме. Она специально сосредоточена на разработке ядра через мощный фреймворк загружаемых модулей ядра (LKM). Это связано с тем, что многие, если не большинство, реальных проектов и продуктов промышленности, связанных с разработкой функций ядра и/или драйверов устройств, выполняются таким образом.
Основной акцент сделан на практическом взаимодействии и глубоком понимании внутреннего устройства операционной системы Linux. В этом контексте, мы рассматриваем все, от сборки ядра Linux из исходного кода до понимания и работы с сложными темами, такими как синхронизация внутри ядра.
Чтобы помочь вам в этом увлекательном путешествии, книга разделена на три секции. Первая секция охватывает основы настройки рабочего пространства для разработки ядра, сборки современного ядра из исходного кода и написания вашего первого модуля ядра.
Следующая секция, ключевая, поможет вам понять существенные детали внутреннего устройства ядра. Она включает архитектуру ядра Linux, структуру задач, стеки режимов пользователя и ядра, а также управление памятью. Управление памятью – это ключевая и интересная тема, которой мы посвятили три полных главы (покрывающих внутренние механизмы до достаточной степени, а также важный аспект – как эффективно распределять и освобождать память ядра). Завершает эту секцию рассмотрение внутреннего устройства и более глубоких деталей планирования задач (CPU) в ОС Linux.
Последняя часть книги посвящена более продвинутой теме – синхронизации ядра, которая необходима для профессионального дизайна и кода в ядре Linux. Две полные главы посвящены ключевым темам в этой области.
Книга использует ядро Linux 6.1 LTS (Long Term Support), поддержка которого (включая исправления ошибок и безопасности) продлится с декабря 2022 по декабрь 2026 года. Кроме того, Проект гражданской инфраструктуры (CIP) принял 6.1 как выпуск SLTS (Super LTS) и планирует поддерживать его в течение 10 лет, до августа 2033 года. Это важно, поскольку гарантирует актуальность и долгосрочную ценность содержания книги.
Мы верим в практический подход, и на GitHub-репозитории книги представлено более 40 модулей ядра (помимо нескольких пользовательских приложений и сценариев оболочки, число которых вдвое больше, чем в первом издании!), чтобы сделать обучение живым, забавным, практичным, интересным и полезным. (Ссылка: https://github.com/PacktPublishing/Linux-Kernel-Programming_2E)
Мы настоятельно рекомендуем вам также воспользоваться компаньон-гидом к этой книге, “Программирование ядра Linux Часть 2 – Драйверы символьных устройств и синхронизация ядра: Создание интерфейсов пользователя-ядро, работа с вводом-выводом периферийных устройств и обработка аппаратных прерываний”. Это превосходное руководство для начинающих, ориентированное на индустрию, для написания различных символьных драйверов, выполнения ввода-вывода на память периферийных чипов и обработки аппаратных прерываний. Вы можете получить электронную версию бесплатно вместе с печатной копией, или же найти эту электронную книгу в GitHub-репозитории по адресу: https://github.com/PacktPublishing/Linux-Kernel-Programming/tree/master/Linux-Kernel-Programming-(Part-2).
Мы надеемся, что вы не только научитесь из этой книги, но и получите удовольствие. Ну что ж, давайте приступим к изучению того, как настроить подходящее рабочее пространство для ядра, чтобы вы могли максимально использовать эту книгу в практических занятиях.
Настройка рабочего пространства ядра
Чтобы максимально использовать данную книгу, крайне важно сначала настроить рабочее окружение, которое мы будем использовать на протяжении всей книги. Эта глава научит вас точно, как это сделать и начать работу.
В этой главе мы установим недавний дистрибутив Linux (или “дистро”) как виртуальную машину (VM) и настроим его для включения всех необходимых пакетов программного обеспечения. Мы также клонируем код этой книги через его репозиторий на GitHub. Кроме того, в этой главе представлены несколько полезных проектов, которые помогут вам в этом увлекательном путешествии в мир ядра Linux.
С самого начала хочу подчеркнуть, что лучший способ научиться чему-либо - это делать это эмпирически, практически, не полагаясь на чужие слова, а пробуя и испытывая на себе. Поэтому эта книга предоставляет вам множество практических экспериментов и примеров кода ядра, которые вы должны сами опробовать. Это значительно поможет вам в достижении реального прогресса, глубоком обучении и понимании различных аспектов разработки ядра и драйверов Linux. Помните об этом: учитывая ограничения по объему, полное и расширенное содержание этой главы можно найти в репозитории этой книги на GitHub здесь: http://www.packtpub.com/sites/default/files/downloads/9781803232225_Online_Chapter.pdf. Я прошу вас скачать и прочитать это полностью. То, что следует ниже, является введением к нашей первой главе. Спасибо!
Глава 1
Будьте эмпиричны! Также будьте смелыми, дерзкими и пробуйте новое!
В этой главе подробно рассмотрим следующие темы, которые помогут вам настроить рабочее окружение:
- Запуск Linux как гостевой ВМ
- Установка гостевой системы Linux x86_64
- Дополнительные полезные проекты
Технические требования
Вам понадобится современный и желательно мощный настольный ПК или ноутбук. Ubuntu Desktop указывает некоторые рекомендуемые минимальные системные требования для установки и использования дистрибутива здесь: https://help.ubuntu.com/community/Installation/SystemRequirements. Я бы настоятельно рекомендовал использовать систему, превышающую минимальные рекомендации, такую мощную, какую только можете себе позволить. Это связано с тем, что выполнение задач, таких как сборка ядра Linux из исходного кода, является очень ресурсоемким процессом в плане памяти и процессора. Как очевидно, чем больше оперативной памяти, мощности процессора и дискового пространства у хост-системы, тем лучше!
Как опытный разработчик ядра, я бы сказал, что работа на нативной системе Linux - это лучший вариант. Однако, для этой книги мы не можем предполагать, что у вас всегда будет доступ к выделенному нативному Linux-компьютеру. Поэтому мы будем исходить из того, что вы работаете с Linux-гостем. Работа в гостевой ВМ добавляет дополнительный уровень изоляции и, следовательно, безопасности. Конечно, недостатком является производительность; работа на высокоспециализированном нативном Linux-компьютере может быть в два раза быстрее, чем работа в виртуальной машине!
Клонирование репозитория кода этой книги
Полный исходный код для этой книги находится в открытом доступе на GitHub по адресу: https://github.com/PacktPublishing/Linux-Kernel-Programming_2E. Вы можете клонировать и работать с ним, используя следующую команду:
git clone https://github.com/PacktPublishing/Linux-Kernel-Programming_2E
Исходный код организован по главам. Каждая глава представлена как директория – например, ch1/ содержит исходный код для первой главы. В корне исходного дерева расположен код, который общий для всех глав, например, convenient.h и klib.c.
Для эффективного просмотра кода я настоятельно рекомендую использовать индексацию с помощью ctags и/или cscope. Например, чтобы создать индекс ctags для исходного дерева, перейдите в корень дерева исходного кода и выполните команду ctags -R. (Если вы еще не знакомы с инструментами для навигации по коду, такими как cscope и ctags, пожалуйста, потратьте время на их изучение.)
Если не указано иное, вывод кода, показанный в книге, соответствует тому, что видно на гостевой ВМ Ubuntu 22.04 LTS x86_64 (работающей под Oracle VirtualBox 7.0). Вы должны понимать, что из-за (обычно незначительных) различий между дистрибутивами – а также даже внутри одного дистрибутива, но разных версий – вывод, представленный в книге, может не совпадать точно с тем, что вы увидите на вашей системе Linux.
С учетом этого, я предлагаю вам скачать и прочитать полную главу 1 из репозитория на GitHub, а затем продолжить настройку рабочего пространства ядра, описанную там.
После этого я буду считать, что вы подготовили рабочую среду для последующих глав. Отлично. Теперь давайте перейдем к изучению захватывающего мира разработки ядра Linux; ваше путешествие по ядру только начинается! Две следующие главы научат вас, как скачивать, извлекать, настраивать и собирать ядро Linux из исходного кода.
Узнайте больше в Discord
Чтобы присоединиться к Discord-сообществу для этой книги, где вы сможете поделиться отзывами, задать вопросы автору и узнать о новых выпусках: