Раздел 1. Самые основы
Здесь вы изучите как выполнять базовые задачи разработки ядра. Вы установите рабочее пространство разработки ядра, соберёте некое ядро Linux из исходного кода, изучите платформу LKM и напишите модуль ядра "Hello, world".
Этот раздел составлен из следующих глав:
Мы также настоятельно рекомендуем вам пользоваться компаньоном этой книги, http://onreader.mdl.ru/LinuxKernelProgrammingPart2/content/index.html.
Это великолепное ориентированное на отрасль руководство для приступающих к написанию символьных драйверов misc
,
выполнению операций ввода/ вывода в память периферийной микросхемы и обработке аппаратных прерываний. Эта книга в первую очередь предназначена
программистам Linux, начинающим поиск своего пути в разработке драйверов устройств. Преимущества данной книги получат разработчики драйверов Linux,
ищущие преодоление частых и распространённых проблем при разработке ядра/ драйвера, а также разбирающиеся с выполнением распространённых задач драйверов и
изучающие их - современную платформу
(Linux Device Model), взаимодействие пользователь - ядро, выполнение периферийного
ввода/ вывода, обработку аппаратных прерываний, ведение дел с одновременной работой и многое иное. Требуются базовые знания внутреннего устройства ядра
Linux (и общеупотребимых API), разработки модуля ядра и программирования на C.
Вы можете получить эту книгу бесплатно со своей копией или вы можете обнаружить эту электронную книгу в репозитории GitHub.
Глава 1. Настройка рабочего пространства ядра
Содержание
- Глава 1. Настройка рабочего пространства ядра
- Технические требования
- Запуск Linux в качестве гостевой ВМ
- Настройка необходимого программного обеспечения - дистрибутив и пакеты
- Дополнительные полезные проекты
- Применение страниц руководства Linux
- Определение местоположения и применение документации ядра Linux
- Инструментарий статического анализа для ядра Linux
- Следующее поколение Инструментария трассировки Linux
- Утилита procmap
- Простой проект FOSS системы Linux встроенного ARM
- Современные трассировка и анализ производительности при помощи [e]BPF
- Проект LDV - Linux Driver Verification
- Выводы
- Вопросы
- Дальнейшее чтение
Привет вам и добро пожаловать с эту книгу по изучению разработки ядра Linux. Чтобы получить максимальную пользу от этой книги, очень важно чтобы вы прежде всего установили соответствующую среду рабочего пространства, которую мы будем применять на протяжении всей этой книги. Данная глава в точности научит вас как это сделать и начать.
Мы установим последний дистрибутив Linux, предпочтительно в виде некой ВМ (Виртуальной машины) и настроить его с тем, чтобы он включал все необходимые программные пакеты. Мы к тому же клонируем репозиторий кода этой книги из GitHub и изучим несколько полезных пакетов, которые окажут помощь вам на протяжении данного путешествия.
Лучший способ изучения чего бы то ни было состоит в выполнении этого эмпирически - не доверять вовсе ни чьим словам, а вместо этого пробовать это и экспериментировать своими руками. Следовательно, данная книга снабдит вас множеством практических экспериментов и образцов кода ядра, которые вы можете и даже должны испробовать самостоятельно; это величайшим образом поспособствует тому чтобы вы совершили действительный прогресс и глубоко освоили и разобрались с различными сторонами разработки ядра Linux и драйвера. Итак, приступим!
Данная глава проведёт нас по следующим темам, которые поспособствуют установке нашей среды:
-
Запуск Linux в качестве гостевой ВМ
-
Установку необходимого программного обеспечения - дистрибутива и пакетов
-
Некоторые дополнительные полезные проекты
{Прим. пер.: привыкшим работать в операционной системе Windows может оказаться полезным наш перевод книги Изучаем подсистемы Windows для Linux Прэйтик Сингх, при помощи которой вы сможете выполнять практически всё то же самое непосредственно в операционной системе Windows, применяя Windows Subsytem for Linux 2 поколения (WSL2), доступную в Windows 10 начиная с выпуска 2004.}
Вам потребуется современный настольный ПУ или ноутбук. Ubuntu Desktop предписывает следующие "рекомендуемые системные требования" для установки и применения своего дистрибутива:
-
Процессор с двумя ядрами 2ГГц или лучше.
-
Оперативная память
-
При работе на физическом хосте: 2ГБ или более системной памяти (больший объём определённо не помешает).
-
При работе в качестве гостевой ВМ: Система хоста обязана обладать по крайней мере 4ГБ оперативной памяти (чем больше тем лучше и тем более гладко пройдёт ваша практика).
-
-
35ГБ свободного дискового пространства (я советую больше, по крайней мере удвоить его).
-
Либо устройство DVD, либо USB порт для установочного носителя (не требуется при настройке Ubuntu в качестве гостевой ВМ).
-
Доступ к Интернету несомненно полезен и временами необходим.
Поскольку такая задача как сборка ядра Linux из исходного кода очень затратный процесс в плане памяти и ЦПУ, я настоятельно рекомендую вам пробовать его в мощной системе Linux с обильными оперативной памятью и дисковым пространством, чтобы также иметь их про запас. Это достаточно очевидно - чем больше оперативной памяти и мощности ЦПУ имеет ваша система хоста, тем лучше!
Как всякий бывалый разработчик ядра, я бы сказал, что лучше всего работать с натуральной системой Linux. Однако для целей данной книги мы не можем предполагать, что у вас всегда в наличии будет выделенный естественный Linux. Итак, мы предполагаем, что вы работаете в гостевой системе Linux. {Прим. пер.: или даже непосредственно в операционной системе Windows, как то описано в нашем переводе книги Изучаем подсистемы Windows для Linux Прэйтика Сингха, применяя Windows Subsytem for Linux 2 поколения (WSL2), доступную в Windows 10 начиная с выпуска 2004.} Работа в рамках гостевой виртуальной машины к тому же добавляет некий дополнительный уровень изоляции, а следовательно, и безопасности.
Клонирование нашего кода репозитория: Полный исходный rод для этой книги целиком
свободно доступен в GitHub.Вы можете
клонировать его и работать с ним, выполнив команду git
подобно таковой:
> git clone https://github.com/PacktPublishing/Linux-Kernel-Programming.git
Данный исходный код организован по главам. Каждая глава представляется как некий каталог - например, ch1/
обладает исходным кодом для этой главы. Собственно корень этого дерева исходного кода содержит некий код, который является общим для всех глав, к
примеру, исходные файлы convenient.h
, klib_llkd.c
и другие.
Для действенного просмотра кода я буду настоятельно рекомендовать чтобы вы всегда индексировали свой базовый код при помощи
ctags(1)
и/ или cscope(1)
. Например, чтобы установить индексацию
ctags
, просто выполните cd
в свой корень исходного кода и наберите
ctags -R
.
Замечание | |
---|---|
Пока не оговорено инок, весь вывод кода, который мы показываем в данной книге это вывод как он выглядит в некой гостевой ВМ Ubuntu 18.04.3 LTS x86-64 (запущенной под Oracle VirtualBox 6.1). Вы должны сознавать, что из- за различий (обычно незначительного) в дистрибутивах - и даже в пределах одних и тех же дистрибутивов, но с различными версиями - показанный здесь вывод может не соответствовать в точности тому, что вы наблюдаете в своей собственной системе Linux. |
Как уже пояснялось ранее, практической и удобной альтернативой применению натуральной системы Linux является установка и использование соответствующего дистрибутива Linux в качестве гостевой ОС в некой ВМ. Ключевым моментом является именно то, что вы устанавливаете самый последний дистрибутив Linux, предпочтительно в виде некой ВМ с целью безопасности и во избежание нежелательной утраты данных или прочих сюрпризов. Несомненный факт в том, что при работе на уровне собственного ядра, внезапное крушение его системы (и риски утраты данных, возникающие по его причине) на самом деле являются общим местом. Я рекомендую применять Oracle VirtualBox 6.x (или самую последнюю стабильную версию) или иное программное обеспечение виртуализации, например, VMware Workstation.
Замечание | |
---|---|
И то, и другое доступны бесплатно. Просто весь код для данной книги был проверен в VirtualBox 6.1. Oracle VirtualBox рассматривается как OSS (Open Source Software) и лицензируется под GPL v2 (точно так же как само ядро Linux). Вы можете выгрузить его с https://www.virtualbox.org/wiki/Downloads. Его документацию можно найти тут: https://www.virtualbox.org/wiki/End-user_documentation. |
Системой вашего хоста должен быть MS Windows 10 или старше (естественно, даже Windows 7 будет работать), самый последний дистрибутив Linux (к примеру, Ubuntu или Fedora), либо macOS. Итак, давайте приступим к инсталляции своего гостевого Linux.
Здесь я не буду вдаваться в подробности установки Linux в качестве гостя в Oracle VirtualBox, поскольку эта установка не имеет прямого отношения к разработке ядра Linux. Имеется множество способов установки ВМ Linux, мы на самом деле не хотим вдаваться в эти детали, а также в за и против каждого из них.
Однако если вы не знакомы с этим, не беспокойтесь. Для вашего удобства вот несколько исключительных ресурсов, которые помогут вам в этом:
-
Очень ясно написанное руководство с названием Install Linux Inside Windows Using VirtualBox Абишека Пракаша (Это FOSS!, август 2019).
-
Альтернативный, также исключительный ресурс Install Ubuntu on Oracle VirtualBox.
Кроме того, вы можете просмотреть полезные ресурсы по установке гостевого Linux в VirtualBox в нашем разделе Дальнейшее чтение в конце этой главы.
При установке ВМ Linux имейте в виду следующие обстоятельства.
Включение в вашей системе расширенной поддержки виртуализации
Установка 64- битного гостевого Linux требует включения расширения поддержки виртуализации ЦПУ (Intel VT-x или AMD-V) внутри настроек BIOS (basic input/output system. {Прим. пер.: строго говоря в системах с аппаратной поддержкой виртуализации вместо BIOS применяется UEFI- совместимое встроенное ПО - firmware, но в литературе допускается вольность продолжать именовать такое программное обеспечение базовой системой ввода/ вывода}) Давайте рассмотрим как сделать это:
-
Наш первый шаг состоит в том чтобы убедиться что наш ЦПУ поддерживает виртуализацию:
-
Имеются два проторённых пути проверки этого в хосте Windows:
-
Во- первых, запустите прикладное приложение Диспетчера задач (Task Manager) и переключитесь в закладку Performance, под графиком ЦПУ вы, помимо прочего, обнаружите Virtualization со следующим за ней Enabled:или Disabled.
-
Второй способ проверки систем Windows состоит в открытии окна команд cmd. В приглашении на ввод команды наберите
systeminfo
и нажмитеEnter
. Помимо прочего вывода вы обнаружите строкуVirtualization Enabled in firmware
. За ним будет следоватьYes
илиNo
.
-
-
Для проверки этого в хосте Linux в Терминале активируйте следующие команды (поддержка расширения виртуализации процессора):
vmx
это проверка для процессоров Intel,smv
это проверка для процессоров AMD):> egrep --color "vmx|svm" /proc/cpuinfo
Для ЦПУ Intel в случае поддержки виртуализации флаг
vmx
будет взведён (выделен цветом). В случае AMD будет отображён (цветом)smv
. Получив это, мы узнаём что наш ЦПУ поддерживает виртуализацию. Однако чтобы пользоваться её, нам требуется включить её в BIOS {UEFI} компьютера.
-
-
Нажав
Del
илиF12
(точное определение нажимаемой клавиши различается для разных производителей) при запуске, войдите в BIOS. Сверьтесь, пожалуйста, со своим системным руководством какое именно ключевое слово искать. Отыщите такой термин какVirtualization
илиVirtualization Technology (VT-x)
. Вот некий образец для BIOS Award:
Замечание Когда вы пользуетесь EFI-BIOS Asus, вам придётся установить эту запись в
[Enabled]
, если это не так в настройках по умолчанию. Посетите https://superuser.com/questions/367290/how-to-enable-hardware-virtualization-on-asus-motherboard/375351#375351 . -
Теперь выберите применение аппаратной виртуализации в меню span class="term">Settings своей ВМ. Для этого кликните по System, а затем Acceleration. После этого проверьте соответствующие блоки, как это показано на следующем снимке экрана:
Именно так мы разрешаем функциональные возможности аппаратной виртуализации процессора для оптимальной производительности.
Выделение достаточного пространства на имеющемся диске
Для большинства настольных/ переносных систем выделения гигабайта оперативной памяти и двух ЦПУ для вашей гостевой ВМ должно быть достаточным.
Тем не менее, при выделении пространства под гостевой диск будьте великодушны. Вместо обычно предлагаемых по умолчанию 8ГБ я настоятельно рекомендую сделать его в 50ГБ или даже больше. Конечно, это подразумевает, что ваша система обладает большим диском, чем доступно! Кроме того, вы можете определить что это значение будет выделяться динамически или выделяться по запросу. Ваш гипервизор будет "наращивать" этот виртуальный диск оптимально, не предоставляя всё заявленной пространство целиком с самого начала.
Установка гостевых дополнений Oracle VirtualBox
Для лучшей производительности важно также установить внутри ваше ВМ Гостевые добавления Oracle VirtualBox. Это существенное программное обеспечение ускорения паравиртуализации, которое серьёзно способствует оптимальной производительности. Давайте рассмотрим как сделать это в гостевом сеансе Ubuntu:
-
Прежде всего обновите программные пакеты гостевой ОС своего Ubuntu. Вы можете выполнить это при помощи следующих команд:
> sudo apt update > sudo apt upgrade
-
По завершению перезапустите гостевую ОС Ubuntu и затем установите необходимый пакет воспользовавшись следующей командой:
> sudo apt install build-essential dkms linux-headers-$(uname -r)
-
Теперь в планке меню ВМ пройдите к Devices | Insert Guest Additions CD image.... Это смонтирует файл
Guest Additions ISO
внутри вашей ВМ. Приводимый ниже снимок экрана показывает как всё выглядит когда вы это выполняете:
-
Теперь всплывает диалоговое окно, которое пригласит вас выполнить сам установщик чтобы запустить его. Выберите Run/
-
Теперь в неком окне терминала происходит некая отображаемая установка Гостевых добавлений. По её завершению нажмите на клавишу
Enter
для закрытия этого окна. Затем выключите гостевую ОС своего Ubuntu чтобы внести некие изменения из диспетчера VirtualBox, как это поясняется далее. -
Теперь, чтобы включить функциональные возможности Shared Clipboard и Drag'n'Drop между гостем и машиной хоста проследуйте в General | Advanced и разрешите два параметра (Shared Clipboard и Drag'n'Drop) по своему желанию в ниспадающих пунктах:
-
Далее кликните OK для сохранения сделанных настроек. Теперь запустите свою гостевую систему, зарегистрируйтесь в ней и убедитесь что всё отлично работает.
Замечание На момент написания Fedora 29 обладала некоторой проблемой при установке модуля ядра
vboxsf
, необходимого для функциональности Shared Folders. Для попытки урегулирования этой ситуации я отсылаю вас к следующему ресурсу: Bug 1576832 - virtualbox-guest-additions does not mount shared folder.Если проблема останется, вы можете просто перемещать файлы между своими хостом и гостевой ВМ через SSH (при помощи
scp(1)
); для этого установите и запустите демон SS при помощи таких команд:> sudo yum install openssh-server > sudo systemctl start sshd
Не забывайте постоянно обновлять свою гостевую ВМ, а также по её запросам. Это существенное требование безопасности. Вы можете выполнять это вручную воспользовавшись следующим:
> sudo /usr/bin/update-manager
Наконец, на всякий случай, не храните важные данные в гостевой ВМ. Мы будем работать над развитием ядра. Крушение гостевого ядра - обычное дело. Хотя, как правило, это не приводит к утрате данных, это нельзя сказать наверняка! На всякий случай, всегда делайте резервные копии важных данных. Это также относится и к Fedora. Чтобы ознакомиться с установкой Fedora в качестве гостевой в VirtualBox , посетите https://fedoramagazine.org/install-fedora-virtualbox-guest/.
Совет | |
---|---|
Порой, в особенности когда слишком велики накладные расходы графической системы x Winodow (или Wayland), предпочтительно работать просто
в консольном режиме. Вы можете сделать это, добавив 3 (значение уровня выполнения) в свою командную строку ядра через его начальный загрузчик.
Тем не менее, работа в консольном режиме в VirtualBox может оказаться не столь приятным занятием (например, недоступен буфер обмена, а размер
экрана и шрифты оставляют желать лучшего). Таким образом, отличным способом для работы может оказаться простой удалённый вход (через
|
Raspberry Pi является популярным SBC (Single-Board Computer) размером с кредитную карту, очень похожим на ПК небольшого размера, который обладает портами USB, картой microSD, HDMI, аудио. Ethernet, GPIO и многим прочим. Снабжающий её мощностью SoC (System on Chip) производится Broadcom и выполнен ядре или на кластере ядер ARM. Хотя это, конечно, не обязательно, в данной книге мы пытались проверить и испробовать свой код на целевом Raspberry Pi 3 Model B+. Выполнение кода на разных целевых архитектурах всегда полезно для открытия глаз на возможные дефекты и способствует тестированию. Я призываю вас сделать то же самое:
Рисунок 1-5
Raspberry Pi с переходным кабелем USB-последовательный порт, подключённым к его контактам GPIO.
Вы можете работать с целевым Raspberry Pi либо при помощи цифрового монитора/ телевизора через HDMI в качестве устройств вывода и традиционных
клавиатуры/ мыши через его порты USB или, что более распространено при разработке поверх удалённой оболочки через
ssh(1)
. Тем не менее, подход с SSH не справляется со всеми обстоятельствами. Наличие
последовательной консоли в Raspberry Pi, в особенности помогает при отладке ядра.
Совет | |
---|---|
Я бы порекомендовал вал свериться со следующей статьёй, которая поможет вам настроить подключение USB- к последовательному порту, тем самым снабжая консолью регистрации в Raspberry Pi с некого ПК/ ноутбука: WORKING ON THE CONSOLE WITH THE RASPBERRY PI, kaiwanTECH. |
Для настройки своего Raspberry Pi, будьте любезны обратиться к его официальной документации. Наша система Raspberry Pi исполняет "официальную" ОС Linux Raspbian (Debian для Raspberry Pi) с самым последним (на момент написания этих строк) ядром Linux 4.14. В консоли Raspberry Pi мы исполняем такие команды:
rpi $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.6 (stretch)
Release: 9.6
Codename: stretch
rpi $ uname -a
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
rpi $
Что делать если у вас нет Racpberry Pi или он вам не сподручен? Что же, всегда имеется выход - эмуляция!. Хотя это и не так же хорошо как обладание настоящим предметом, эмуляция Racpberry Pi при помощи мощного эмулятора FOSS (Free and Open Source Software) под названием QEMU или Quick Emulator, это хороший способ, по крайней мере, для начала.
Замечание | |
---|---|
Поскольку детали настройки Raspberry Pi через QMI выходят за рамки данной книги, мы не будем рассматривать их. Однако, вы можете обратиться к следующим ссылкам: Emulating Raspberry Pi on Linux и GitHub qemu-rpi-kernel. |
Кроме того, естественно, вы не обязаны ограничивать себя семейством Raspberry Pi; имеются доступными и различные иные исключительные прототипы. На ум приходит популярная плата BBB (BeagleBone Black)
Совет | |
---|---|
Фактически, для профессиональной разработки и работы с продукцией, Raspberry Pi и в самом деле не наилучший выбор по ряду причин... слегка погуглив, вы сможете разобраться с этим. При этом, в качестве среды обучения и базового прототипирования, её трудно превзойти с поддержкой мощного сообщества (и технических любителей). Некоторые современные варианты микропроцессов для встроенного Linux (и многого прочего) обсуждается и сопоставляется в этой исключительной статье Джея Карлсона SO YOU WANT TO BUILD AN EMBEDDED LINUX SYSTEM?, октябрь 2020. |
На данный момент я полагаю, что вы настроили Linux в качестве гостевой машины (или же пользуетесь собственным "тестовым" блоком Linux) и клонировали репозиторий кода GitHub этой книги. Теперь перейдём к ключевому моменту: реальной установке программных компонентов в вашей гостевой системе Linux, чтобы мы могли изучать и писать код ядра Linux в своей системе!
Рекомендуется применять одну из указанных далее или более поздних стабильных версий дистрибутивов Linux. Как уже упоминалось в предыдущем разделе, они всегда могут устанавливаться в качестве гостевой ОС в системе хоста Windows или Linux и очевидным первым кандидатом выступает Ubuntu Linux 18.04 LTS Desktop. Приводимый ниже снимок экрана показывает вам рекомендуемую версию и взаимодействие с пользователем:
Предыдущая версия - Ubuntu 18.04 LTS Desktop - это, по крайней мере, избранная для данной книги версия. Две самые основные причины этого очевидны:
-
Ubuntu Linux одна из наиболее, если не самая популярная среда разработки (ядра) рабочей станции Linux в отрасли, применяемая сегодня.
-
Мы не всегда можем по причине недостатка места и чёткости показывать в этой книге вывод кода/ сборки множества сред. Следовательно, мы остановились в выборе на показе вывода, как он видится в Ubuntu 18.04 LTS Desktop.
Замечание Ubuntu 16.04 LTS Desktop также неплохой выбор (она также обладает LTS (Long-Term Support) - длительной поддержкой) и всё должно работать и в ней. Для её выгрузки посетите https://www.ubuntu.com/download/desktop.
Некоторые прочие дистрибутивы, которые также можно включить в рассмотрение таковы:
-
CentOS 8 Linux (не CentOS Stream): Linux CentOS это дистрибутив, который выступает по существу клоном RedHat (естественно, RHEL 8). Вы можете выгрузить её с https://www.centos.org/download/. {Прим. пер.: по причине прекращения поддержки CentOS со стороны red Hat/ IBM, рекомендуем следить за альтернативными клонами RHEL: Rocky Linux, а также CloudLinux и его бесплатным ответвлением AlmaLinux, последнее уже обладает свободно распространяемым дистрибутивом.}
-
Fedora Workstation: Fedora это также очень хорошо известный дистрибутив FOSS Linux. Вы можете представлять его себе как испытательную модель для проектов и кодов, которые в конечном счёте приземляются в корпоративных продуктах Red Hat. Выгружайте его с https://getfedora.org/ (выгружайте образ Fedora Workstation).
-
Raspberry Pi в качестве цели: На самом деле, для установки Raspberry Pi лучше всего пользоваться официальной документацией (Raspberry Pi documentation). Не лишним будет отметить, что с некоторыми аппаратными приспособлениями также поставляются "комплекты" Raspberry Pi, которые уже полностью предварительно установлены.
Замечание Если вы желаете ознакомиться как установить образ ОС Raspberry Pi на карту SD, посетите https://www.raspberrypi.org/documentation/installation/installing-images/.
-
BeagleBone Black в качестве цели: BBB, как и Raspberry Pi, это некая чрезвычайно популярная встроенная SBC ARM для энтузиастов и профессионалов. Вы можете стартовать здесь. Справочное руководство по системе для BBB можно найти тут. Хотя мы и не приводим примеров запуска в BBB, тем не менее, это допустимая встраиваемая система, в которой, надлежащим образом установленной, вы сможете исполнить код из этой книги.
Прежде чем покончить с обсуждением по выбору нашего дистрибутива для данной книги, вот несколько подлежащих отметке моментов:
-
Эти дистрибутивы выступают, в своём представлении по умолчанию, FOSS, а не частными, и могут бесплатно применяться конечными пользователями.
-
Хотя наша цель состоит в нейтральности к дистрибутиву Linux, весь код был проверен лишь в Ubuntu 18.04 LTS и "ckturf" тестировался в CentOS 8, а также Raspberry Pi 3 Model B+ выполнял Raspbian GNU/Linux 9.9 (stretch) ОС Linux на основе Debian.
-
Пока это возможно, мы будем продолжать применять самую последнюю (на момент написания книги) стабильную LTS версию 5.4 ядра Linux для сборки своего ядра и исполнения кода. Выступая в роли LTS ядра, это ядро 5.4 является исключительным выбором для работы с ним и его изучения.
Замечание Будет занимательным узнать, что LTS ядро 5.4 несомненно будет обладать длительным отпечатком времени жизни; с ноября 2019 вплоть до декабря 2025! Это хорошая новость: данная книга продолжит оставаться современной и допустимой на грядущие годы!.
-
Для целей данной книги мы будем регистрироваться с учётной записью пользователя с названием
llkd
.Замечание Важно осознавать, что для целей максимальной безопасности (с самыми последними средствами защиты и исправлений), вы обязаны запускать в своём проекте или продукте наиболее последнее из возможных ядро LTS (Long Term Support) .
Теперь, когда мы выбрали свой дистрибутив Linux и/ или аппаратную плату и ВМ, настало время установки нами существенных программных пакетов.
Те пакеты, которые мы по умолчанию устанавливаем при использованию типичного дистрибутива настольного Linux, такого как всякая последняя система
Linux Ubuntu, CentOS или Fedora, будут содержать минимальный набор, необходимый для системного программиста: естественную цепочку инструментов, которая
содержит компилятор gcc
совместно с заголовками и утилиту/ пакеты
make
.
В этой книге, однако, мы собираемся изучать как писать код пространства ядра при помощи ВМ и/ или целевой системы, запускаемой на внешнем процессоре (типичной ситуацией будет ARM или AArch64). Для действенной разработки кода ядра в таких системах нам потребуется установить некоторые программные пакеты. Идём дальше.
Установка гостевых дополнений Oracle VirtualBox
Убедитесь что вы установили свою гостевую ВМ (как то пояснялось ранее). Затем выполните следующее:
-
Зарегистрируйтесь в своей гостевой ВМ и вначале выполните внутри окна Терминала (в оболочке) такие команды:
> sudo apt update > sudo apt install gcc make perl
-
Теперь установите Oracle VirtualBox Guest Additions. Отсылаем вас к How to Install VirtualBox Guest Additions in Ubuntu.
Замечание Это применимо лишь когда мы запускаем Ubuntu в качестве ВМ, применяющей в качестве прикладного приложения гипервизора Oracle VirtualBox.
Установка необходимых программных пакетов
Для установки этих пакетов предпринимайте такую последовательность:
-
Внутри ВМ Ubuntu вначале выполните следующее:
> sudo apt update
-
Теперь единой строчкой исполните такую команду:
> sudo apt install git fakeroot build-essential tar ncurses-dev tar xz-utils libssl-dev bc stress python3-distutils libelf-dev linux-headers-$(uname -r) bison flex libncurses5-dev util-linux net-tools linux-tools-$(uname -r) exuberant-ctags cscope sysfsutils gnome-system-monitor curl perf-tools-unstable gnuplot rt-tests indent tree pstree smem libnuma-dev numactl hwloc bpfcc-tools sparse flawfinder cppcheck tuna hexdump openjdk-14-jre trace-cmd virt-what
Данная команда вначале выполнит установку gcc
, make
и
perl
с тем, чтобы сразу после этого могли бы быть надлежащим образом установлены Oracle VirtualBox Guest
Additions . Они (Гостевые добавления) являются существенными программными средствами ускорения паравиртуализации. Их установка важна для
оптимальной производительности.
Замечание | |
---|---|
Данная книга временами упоминает, сто программа запускается под иной архитектурой ЦПУ - обычно AM - что может быть полезным упражнением. Если вы желаете это испытать (а это занимательно!) продолжайте чтение, в противном случае переходите к разделу Важные замечания относительно установки. |
Установка инструментальной линейки кросс- трансляции и QEMU
Одним из способов попробовать машину ARM это на самом деле сделать это в SBC на основе физической SBC ARM; например, Raspberry Pi это очень популярный вариант. В данном случае, ваш типичный рабочий поток разработки вначале собирает необходимый код ARM в вашей системе хоста x86-64. Однако для этого нам потребуется установить некий кросс- компилятор - некий набор инструментов, позволяющий вам собирать программное обеспечение на ЦПУ самого хоста, разрабатывая его для другого целевого ЦПУ. Программы сборки хоста x86-64 для некого целевого ARM это очень распространённый случай и в самом деле вариант для нашего варианта рассмотрения. Далее кратко излагаются подробности установки кросс компилятора.
Зачастую неким альтернативным способом попробовать это является наличие системы эмуляции системы Linux/ ARM - это смягчает потребность в оборудовании! Для этого мы рекомендуем воспользоваться великолепным проектом QEMU (https://www.qemu.org/).
Для установки необходимых пакетов QEMU сделайте следующее:
-
Для установки в Ubuntu воспользуйтесь следующим:
> sudo apt install qemu-system-arm
-
Для установки в Fedora примените такое:
> sudo dnf install qemu-system-arm-<version#>
Совет Чтобы получить в Fedora номер версии, просто наберите приведённую выше команду и после набора необходимого названия пакета (здесь это
qemu-system-arm-)
) дважды нажмите клавишуTab
. Это выполнит автоматическое заполнение, предоставив список вариантов. Изберите самую последнюю версию и нажмитеEnter
.
Кажется, что CentOS не обладает простыми средствами установки необходимого нам пакета QEMU. (Вы всегда можете установить цепочку инструментов кросс- трансляции через его исходный код, но это определённый вызов; либо получить надлежащий пакет исполняемого кода.) По причине таких сложностей мы пропустим показ кросс- компиляции в CentOS.
Установка кросс- компилятора
Если вы собираетесь писать программу C, которая компилируется в определённой системе хоста, но обязана исполняться в иной целевой системе, тогда вам требуется оттранслировать (скомпилировать) её при помощи того, что носит название кросс компилятора или линейки кросс инструментов. Например, в нашем варианте использования, мы желаем работать на машине хоста x86-64. Это даже может быть гостевая ВМ x86-64, без проблем, но при этом запускать наш код в целевом ARM-32:
-
В Ubuntu вы можете установить цепочку кросс инструментов таким образом:
> sudo apt install crossbuild-essential-armhf
Наша предыдущая команда устанавливает линейку инструментов x86_64-to-ARM-32 , подходящую для систем ARM-32 с "аппаратными числами с плавающей запятой" (hard float, armhf, например, Raspberry Pi); обычно это отлично подходит. Результатом будет установка набора инструментов
arm-linux-gnueabihf-<foo>
; где<foo>
представляет кросс инструменты, такие какaddr2line
,as
,gcc
,gcov
,gprof
,ld
,nm
,objcopy
,objdump
,readelf
,size
,strip
и тому подобных. (Префиксом кросс компилятора в данном случае выступает )arm-linux-gnueabihf-
). Кроме того, хотя это и не обязательно, вы можете установить такую цепочку кросс инструментов какarm-linux-gnueabi-<foo>
:> sudo apt install gcc-arm-linux-gnueabi binutils-arm-linux-gnueabi
-
В Fedora вы можете установить цепочку кросс инструментария так:
> sudo dnf install arm-none-eabi-binutils-cs-<ver#> arm-non-eeabi-gcc-cs-<ver#>
Совет В Fedora Linux применим уже показанный ранее трюк - для автоматического заполнения в команде воспользуйтесь клавишей
Tab
.
Установка и применение цепочки кросс инструментария может потребовать некого дополнительного чтения для пользователей- новичков. Вы можете посетить раздел Дальнейшее чтение, в котором я разместил ряд полезных ссылок, которые несомненно окажут вам великолепную помощь.
Сейчас мы упомянем несколько остающихся моментов, причём большинство из них относится к установке программного обеспечения или прочим проблемам при работе с определёнными дистрибутивами:
-
В CentOS 8 вы можете установить Python при помощи такой команды:
> sudo dnf install python3
Однако в реальности она не создаёт (необходимую) symbolic link (symlink, символическую ссылку),
/usr/bin/python
; но почему? За подробностями обратитесь к следующей ссылке.Чтобы вручную создать подобную символическую ссылку, например,
python3
, сделайте следующее:> sudo alternatives --set python /usr/bin/python3
-
Сьорка ядра может завершиться отказом при неустановленных файлах заголовка OpenSSL. Исправьте это в CentOS 8 следующим образом:
> sudo dnf install openssl-devel
-
В CentOS 8 утилиту
lsb_release
можно установить следующим образом:> sudo dnf install redhat-lsb-core
-
В Fedora выполните следующее:
-
Установите эти два пакета, обеспечив соответствие необходимых зависимостей при сборке ядра в системах Fedora:
Предыдущий пакет> sudo dnf install openssl-devel-1:1.1.1d-2.fc31 elfutils-libelf-devel
openssl-devel
снабжается суффиксом с подходящим номером версии Fedora (в данном случае.fc31
; если это требуется, отрегулируйте для своей системы). -
Чтобы применять команду
lsb_release
, вам надлежит установить пакетredhat-lsb-core
.
-
Поздравляем! Этим вы завершили настройку программного обеспечения и начинается ваше путешествие по ядру! Теперь, чтобы завершить данную главу, давайте проверим несколько дополнительных и полезных проектов. Вам несомненно рекомендуется прочесть это также.
Этот раздел приводит вам подробности некоторых прочих разнообразных проектов, которые вы в действительности можете найти крайне полезными. В некоторых соответствующих местах в данной книге мы делаем ссылки или напрямую пользуемся некоторыми из них, что делает важным их понимание.
Давайте начнём с хорошо известного и важного проекта Linux страниц руководства (man pages).
Вам следует обращать внимание на соглашения, которым следует большая часть литературы Unix/ Linux:
-
Снабжения суффиксом (
1
) команд пользователя - например,gcc(1)
илиgcc.1
-
Системных вызовов суффиксом (
2
) - например,fork(2)
илиfork().2
-
Библиотечных API значением (
3
) - например,pthread_create(3)
илиpthread_create().3
Как вы несомненно знаете, значение числа в скобках (или после точки) обозначает номер раздела
manual
(man, руководства), к которому относится команда/ API из вопроса. Быстрая проверка
при помощиman(1)
через команду man man
(именно поэтому мы обожаем
Unix/ Linux!) обнаруживает соответствующие разделы руководства Unix/ Linux:
$ man man
[...]
A section, if provided, will direct man to look only in that section of
the manual. [...]
The table below shows the section numbers of the manual followed by the types of pages they contain.
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g.
man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]
[...]
Итак, например, для просмотра страницы руководства по системному вызову stat(2)
вы можете применить
следующее:
$ man 2 stat # (or: man stat.2)
Иногда (а в действительности очень часто), страницы man
просто через- чур подробны чтобы их можно было прочесть,
когда всего лишь требуется быстрый ответ. Войдите в проект tldr
- читайте далее!
Вариант tldr
Когда мы обсуждаем страницы man
, основное раздражение состоит в том, что страница
man
в команде, порой, через-чур велика. В качестве примера возьмите утилиту
ps(1)
. Она обладает большой страницей man
, что объяснимо, ибо она
обладает гигантским числом необязательных переключателей. Разве не было бы лучше, однако, обладать упрощённой и сведённой к минимуму страницей
"обычного применения"? Именно это и имеют целью страницы проекта tldr
.
Замечание | |
---|---|
TL;DR в буквальном смысле означает Too Long; Didn't Read (Слишком длинно; не читайте). |
Иными словами, они предоставляют "упрощённые и продвигаемые сообществом страницы руководства". Итак, будучи установленным,
tldr ps
предоставляет прекрасное краткостью резюме наиболее распространённых применений вариантов
переключателей команды ps
для выполнения чего- нибудь полезного:
Совет | |
---|---|
Все репозитории Ubuntu обладают пакетом |
Его действительно стоит попробовать. Если вам интересно узнать больше, посетите https://tldr.sh/
Напомним, что ранее мы уже говорили, что системные вызовы пространства пользователя подпадают в раздел 2 страниц руководства, библиотечные
подпрограммы в раздел 3, а API ядра в раздел 9. Принимая это во внимание, почему бы нам, скажем, не определить функцию ядра
printk
как printk (9)
- раз уж
man man
показывает нам что раздел 9
нашего руководства это
Подпрограммы ядра? Ну ладно, это фантазия (по крайней мере в Linux наших дней):
для API ядра никаких страниц руководства в действительности нет! Итак, как нам получить документацию API
ядра и тому подобного? Это именно то, чего мы кратко коснёмся в своём следующем разделе.
За многие годы усилий имеющееся сообщество разработало и довело документацию ядра Linux до хорошего состояния. Самая последняя версия (latest version) документации ядра представлена в приятном и современном "веб" стиле и к ней всегда можно выполнить доступ через Интернет: https://www.kernel.org/doc/html/latest/.
Замечание | |
---|---|
Конечно же, как мы упомянем в своей следующей главе, документация определённого ядра всегда доступна для той версии ядра, внутри которой
располагается исходный код самого ядра, в каталоге с названием |
Просто в качестве образца документации ядра в Интернете посмотрите на следующий частичный снимок экрана со страницы Core Kernel Documentation/Basic C Library Functions:
Рисунок 1-8
Частичный снимок экрана, показывающий небольшую часть современной Интернет документации ядра Linux
Как видно из этого снимка экрана, современная документация достаточно обширна.
Выработка документации вашего ядра из исходного кода
Вы буквально можете генерировать полную документацию ядра Linux изнутри дерева исходного кода самого ядра в разнообразных популярных форматах
(включая PDF, HTML, LaTeX, EPUB или XML) в стиле Javadoc или Doxygen-like.
Современная система документации, внутренне применяемая ядром носит название Sphinx.
Применяя make help
внутри дерева исходного кода соответствующего ядра вы выявляете некоторые
documentation targets (цели документации), помимо их htmldocs
,
pdfdocs
и многого прочего. Итак, вы можете, в качестве примера, cd
в дерево исходного кода ядра и выполнить make pdfdocs
для сборки полной документации ядра Linux в виде
документов PDF (сами PDF, а также некие прочие мета- документы будут помещены в Documentation/output/latex
).
В самый первый раз, по крайней мере, скорее всего вы получите приглашение на установку некоторых пакетов и утилит (мы не покажем это в явном виде).
Совет | |
---|---|
Не беспокойтесь, если предыдущие подробности не кристально ясны вам. Я предлагаю вам сначала прочесть Главу 2, Сборка ядра Linux 5.4 из исходного кода - Часть I и Главу 3, Сборка ядра Linux 5.4 из исходного кода - Часть II, а затем снова вернуться к этим деталям. |
Статические анализаторы это инструменты, которые через изучение определённого исходного кода пытаются выявить внутри него потенциальные проблемы. Они чрезвычайно полезны вам, как разработчику, хотя вам и придётся научиться как- то "приручать" их - в том смысле, что они могут иметь ложно положительные результаты.
Существуют различные инструменты статического анализа. Среди них те, которые лучше всего подходят для анализа кода ядра включают следующие:
-
Coccinelle (требует установки пакета
ocaml
)
К примеру, чтобы установить Sparse, выполните следующее:
> sudo apt install sparse
> cd <kernel-src-tree>
> make C=1 CHECK="/usr/bin/sparse"
Также имеется доступным ряд высококлассных коммерческих инструментов статического анализа. Помимо прочих это:
-
SonarQube (доступна также бесплатная редакция сообщества отерытого исходного кода)
Совет | |
---|---|
|
Инструменты статического анализа помогут вам сохранять ваш рабочий день! Затрачиваемое на изучение их действенного применения время будет потрачено не зря!
Превосходный инструментарий для трассировки и профилирования это мощный набор инструментов Linux Tracing Toolkit next generation (LTTng), проект фонда Linux. LTTng позволит вам отслеживать как пространство пользователя (приложения), и/ или пути кода самого ядра с минутными подробностями. Это может оказать вам неоценимую помощь в понимании того где возникают узкие места производительности, а также содействовать вашему пониманию общего потока кода и тем самым узнать как этот код в действительности выполняет свои задачи.
Чтобы изучить как установить его и пользоваться им, я отсылаю вас к очень хорошей документации (попробуйте https://lttng.org/download/ для установки под различными распространёнными дистрибутивами). Также настоятельно рекомендуем вам установить Trace Compass GUI. Он снабдит вас исключительным графическим интерфейсом для изучения и интерпретации вывода LTTng.
Совет | |
---|---|
Trace Compass минимально потребует также установленным JRE (Java Runtime Environment). В своей системе Ubuntu 20.04 LTS, я установил его при помощи:
|
В качестве примера (я не смог устоять!), вот некий снимок экрана перехвата LTTng, с "визуализацией" превосходным графическим интерфейсом Trace Compass. Здесь я показываю пару аппаратных прерываний (линии IRQ 1 и 130, соответственно, линии прерывания для i8042 и набора микросхем Wi-Fi в моей родной системе x86_64):
Рисунок 1-9
Образец снимка экрана Trace Compass GUI; примеры записей LTTng, показывающие линии IRQ 1 и 130
Розовый цвет в верхней части предыдущего снимка экрана представляет собственно появление аппаратного прерывания. Под ним, в закладке IRQ vs Time (она видна лишь частично), наблюдается распределение соответствующего прерывания. (На графике распределения по оси y откладывается значение времени; занятно, что обработчик сетевого прерывания - выделен красным - кажется потребляющим очень мало времени, в то время как обработчик микросхемы контроллера клавиатуры/ мыши i8042 -выделен синим - потребляет больше времени, даже превосходя 200 миллисекунд!)
Визуализация всей карты памяти VAS
(Virtual Address Space, Виртуального адресного пространства) самого ядра, а также
любого VAS заданного процесса пользователя это именно то, для чего разработана утилита procmap
.
Его описание в GitHub суммирует его так:
Он выводит простую визуализацию полной карты памяти заданного процесса в вертикально- мозаичном формате упорядоченном по убыванию виртуального адреса. Его сценарий обладает интеллектуальностью для отображения сопоставлений ядра и пространства пользователя, а также для вычисления и отображения разряженных областей памяти, которые будут в наличии. Кроме того, каждый сегмент или соответствие масштабируется по относительному размеру (и с целью читабельности кодируется цветом). В 64- битных системах он также отображает так называемую неканоническую область или "lshe" (обычно в x86_64 близкую к 16 384 ПБ).
Эта утилита включает возможности для просмотра только пространства ядра или пространства пользователя, режимы с подробностями и отладки, возможность экспорта её вывода в удобном формате CSV в особый файл, а также прочие параметры. Она обладает компонентом ядра и в настоящее время работает (и автоматически выявляет их) в ЦПУ x86_64, AArch32 и Aarch64.
Замечание | |
---|---|
Обратите внимание, что я всё ещё работаю над этой утилитой; в настоящее время она всё ещё в разработке... имеется ряд предостережений. Приветствуются отзывы и вклад! |
Выгрузите/ склонируйте её с https://github.com/kaiwan/procmap:
Рисунок 1-10
Частичный снимок экрана вывода утилиты procmap, отображающий лишь верхней части VAS ядра в x86_64
Мы будем интенсивно пользоваться этой утилитой в Главе 7, Внутреннее устройство управления памятью - Существенные моменты.
SEALS или Simple Embedded ARM Linux
System это очень простой "скелет" базовой системы Linux, запускаемой в некой эмулируемой машине ARM. Он предоставляет
первичный сценарий Bash, который через меню запрашивает у конечного пользователя какая функциональность ему желательна, затем соответствующим
образом продолжает кросс компиляцию ядра Linux для ARM, потом создаёт и инициализирует некую простую файловую систему корня. Далее он способен
через QEMU (qemu-system-arm
) вызвать для эмуляции и исполнения платформу ARM (эмулируемой по умолчанию
выступает плата Versatile Express CA-9). Самый полезный момент состоит в том, что этот сценарий собирает целевое ядро, необходимую файловую систему
корня и файл образа файловой системы корня, а также настраивает вещи для запуска. Он даже обладает простым графическим интерфейсом (или консолью)
для упрощения использования конечным пользователем. Страница проекта GitHub.
Клонируйте его и испытайте... мы несомненно рекомендуем для получения помощи вам заглянуть в его
страницы раздела wiki.
Некое расширение хорошо известного Berkeley Packet Filter, или BPF, eBPF это extended BPF (к вашему сведению, современное применение этого термина это просто ссылка на него как на BPF, с выпадающим префиксом "e"). Если очень кратко, BPF применяется для предоставления поддержки инфраструктуры внутри самого ядра с целью действенного отслеживания сетевых пакетов. BPF это наиболее последняя инновация ядра - доступна только начиная с ядра Linux 4.0 и выше. Оно расширяет нотацию BPF, позволяя вам отслеживать намного больше чем просто имеющийся сетевой стек. Кроме того, оно работает над отслеживанием как пространства ядра, так и прикладных приложений пространства пользователя. По существу, BPF и его интерфейсы представляют современный подход к отслеживанию и анализу производительности системы Linux.
Чтобы воспользоваться BPF вам потребуется система со следующим:
-
Ядро Linux 4.0 или более позднее
-
Поддержка ядра для BPF (https://github.com/iovisor/bcc/blob/master/INSTALL.md#kernel-configuration)
-
Установленный интерфейс BCC или
bpftrace
(ссылка на его установку для популярных дистрибутивов) -
Доступ уровня root в его целевой системе
Напрямую применять функциональные возможности BPF очень сложно, поэтому для его использования имеются некоторые интерфейсы. Среди них полезными
считаются BCC и bpftrace
. Посмотрите следующую ссылку на картинку, которая раскроет вам глаза на то,
сколько мощных инструментов доступно чтобы помочь отслеживать различные подсистемы Linux и аппаратные средства:
https://github.com/iovisor/bcc/blob/master/images/bcc_tracing_tools_2019.png.
Важно | |
---|---|
Вы можете установить сами инструменты BCC для своего постоянного дистрибутива хоста Linux, прочитав инструкции по установке
здесь. Почему не в нашей гостевой ВМ
Linux? Это можно сделать при запуске ядра дистрибутива (такого как ядра с поддержкой Ubuntu или Fedora). Основная причина: собственно
установка набора инструментов BCC сдержит (и зависит) установку пакета |
Основной сайт для BCC можно найти по адресу: https://github.com/iovisor/bcc.
Российский Linux Verification Center, основанный в 2005, это проект с открытым исходным кодом; они обладают специалистами по автоматизированному тестированию сложных программных проектов, а потому они и специализируются на этом. Всё это включает в себя всесторонние комплекты тестов, платформы и подробный анализ (как статический, так и динамический), который осуществляется на самой сердцевине ядра Linux, так и в драйверах основных устройств внутри самого ядра. В этом проекте большое внимание уделяется тестированию и проверке модулей ядра, которые многие подобные проекты обычно не применяют.
Особый интерес для нас здесь это страница (Интернет службы Удостоверения драйвера Linux); она содержит перечень неких удостоверяющих Правил (Рисунок 1.11):
Просматривая эти правила, мы сможем не только увидеть сами правила, но также и примеры некоторых реальных случаев когда такие правила нарушались кодом драйвера/ ядра внутри ядра основной линии, тем самым приводя к появлению ошибок. Этот проект LDV успешно обнаружил и исправил (отправив исправления обычным образом) некоторые ошибки драйвера/ ядра. В нескольких последующих главах мы будем упоминать случаи таких нарушений правил LDV (например, утечку памяти, ошибки UAF, (Use After Free, применения после освобождения), а также нарушения блокировок) и (возможно) даже исправлять их.
Вот некоторые полезные ссылки на вебсайт LDV:
-
Страница службы удостоверения драйвера Linux с удостоверяющими правилами
-
Страница проблем в ядре Linux; перечень более 400 проблем, обнаруженных в имеющихся драйверах (большинство также исправлено)
В этой главе мы подробно рассмотрели аппаратные и программные требования для настройки надлежащей среды разработки чтобы приступить к работе над разработкой ядра Linux.Кроме того, мы упомянули самые основы и предоставили, где это возможно, ссылки для настройки устройства Raspberry Pi, установки мощных инструментов, таких как QEMU и инструментальные линейки кросс трансляции и тому подобное. Мы также пролили свет на прочие "разнообразные" инструменты и проекты, которые вы, в качестве перспективного разработчика ядра и/ или драйвера устройства, можете найти полезными, а также сведения о том, как начать искать документацию ядра.
В этой книге мы несомненно рекомендуем и ожидаем от вас попыток работы с кодом ядра практическим образом. Для этого вы должны обладать надлежащей настроенной средой рабочего пространства ядра, что мы успешно и выполнили в данной главе.
Теперь, когда наша среда готова, давайте двинемся далее и исследуем мир бравых духом разработки ядра Linux! Две следующие главы обучат вас тому как выгружать, раскрывать, настраивать и собирать ядро Linux их исходного кода.
В заключение, вот вам список вопросов, которые проверят ваши знания относительно материалов этой главы. Некоторые из ответов на эти вопросы вы сможете найти в репозитории GitHub этой книги.
Чтобы помочь вам глубже окунуться в предмет при помощи полезных материалов, мы предоставляем достаточно подробный список справочных материалов и интернет ссылок (а временами даже книг) в документе Последующего чтения в репозитории GitHub данной книги.