Крищенко, Н.Ю. Рязанова ОСНОВЫ ПРОГРАММИРОВАНИЯ В ЯДРЕ ОПЕРАЦИОННОЙ СИСТЕМЫ GNU/LINUX Рекомендовано Научно-методическим советом МГТУ им. <...> В пособии описаны основы создания программного кода, работающего в режиме ядра операционной системы GNU/Linux. <...> Рассмотрены основы организации ядра Linux, создания подключаемых к ядру модулей, внесения изменений в исходный код ядра, его сборка и установка. <...> Освещены вопросы синхронизации в ядре, выделения памяти и создания динамических структур данных, перехвата событий ядра, приемы отладки кода ядра, а также способы обмена данными между прикладными программами и ядром операционной системы. <...> Примеры программ, приведенные в пособии, работоспособны для версии ядра Linux 2.6.26 и версии дистрибутива Debian GNU/Linux 5.0. <...> Несмотря на разнообразие посвященной ядру Linux литературы, единственным заведомо актуальным источником информации о ядре являются исходные коды используемой версии ядра в силу постоянного изменения внутренних структур данных ядра и заголовков функций. <...> Ядро Linux состоит из следующих основных компонентов: планировщик процессов; менеджер памяти; подсистема ввода-вывода и драйверы устройств; сетевая подсистема; виртуальная файловая система; подcистема межпроцессного взаимодействия и др. <...> Отдельно следует упомянуть интерфейс системных вызовов ядра, обычно используемый прикладными программами через стандартную библиотеку языка Си, например GNU C Library. <...> Экспортируем переменные окружения и создадим рабочий каталог для работы с исходными кодом ядра: $ export SYSPROG=~/sysprog $ # Предполагается работа с ядром 2.6.26 $ export SRC=${SYSPROG}/linux-source-2.6.26 $ mkdir -p ${SYSPROG} Для работы с исходными кодами ядра и сборки ядра требуется около трех гигабайт свободного дискового пространства. <...> Для сборки ядра необходимы компилятор Си и средство сборки Make, которые устанавливаются через пакет build-essential. <...> Для работы с меню конфигурации ядра следует поставить пакет библиотеки ncurses5, а для разархивирования (распаковки <...>
_Основы_программирования_в_ядре_операционной_системы_GNULinux.pdf
УДК 681.326(075.8)
ББК 22.18
K82
Рецензенты: Г.В. Зеленко, С.Б. Ткачев
K82
Крищенко В. А.
Основы программирования в ядре операционной системы
GNU/Linux : учеб. пособие / В.А. Крищенко, Н.Ю. Рязанова. –
М.: Изд-во МГТУ им. Н. Э. Баумана, 2010. – 34, [2] с. : ил.
В пособии описаны основы создания программного кода, работающего
в режиме ядра операционной системы GNU/Linux. Рассмотрены
основы организации ядра Linux, создания подключаемых к ядру
модулей, внесения изменений в исходный код ядра, его сборка и установка.
Освещены вопросы синхронизации в ядре, выделения памяти
и создания динамических структур данных, перехвата событий ядра,
приемы отладки кода ядра, а также способы обмена данными между
прикладными программами и ядром операционной системы.
Для студентов 3-го курса, специализирующихся по кафедре «Программное
обеспечение ЭВМ и информационные технологии» МГТУ
им. Н.Э. Баумана.
УДК 681.326(075.8)
ББК 22.18
-МГТУ им. Н.Э. Баумана, 2010
c
Стр.2
ОГЛАВЛЕНИЕ
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1. Начало работы с исходным кодом ядра Linux . . . . . . . . . . . . . . . . 5
1.1. Краткие сведения о ядре . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2. Подготовка рабочего места программиста. . . . . . . . . . . . . . . . . . 5
1.3. Обзор исходных текстов ядра. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4. Сборка и установка ядра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2. Oсновы программирования для ядра Linux . . . . . . . . . . . . . . . . . . 12
2.1. Оформление исходного кода ядра. . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2. Внесение изменений в исходный код ядра . . . . . . . . . . . . . . . . . 14
2.3. Создание модулей ядра. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3. Программные интерфейсы ядра linux . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1. Служебные функции ядра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2. Выделение памяти и связанные списки . . . . . . . . . . . . . . . . . . . . 18
3.3. Системные вызовы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4. Обмен данными с прикладными программами . . . . . . . . . . . . . 22
4. Нити и синхронизация в ядре Linux . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1 Нити внутри ядра. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2. Механизм ожидания завершения . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.3. Cемафоры, мьютексы и спин-блокировки . . . . . . . . . . . . . . . . . . 25
4.4. Использование атомарных переменных . . . . . . . . . . . . . . . . . . . . 27
5. Отладка внутриядерного кода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6. Пример мониторинга системного вызова . . . . . . . . . . . . . . . . . . . . 29
6.1. Постановка задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2. Перехват информации о событиях ядра . . . . . . . . . . . . . . . . . . . . 30
6.3. Создание модуля с основной логикой работы . . . . . . . . . . . . . . 31
Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Стр.35