Ядро Linux: описание процесса разработки
Роберт Лав
Исчерпывающее руководство по проектированию и реализации ядра Linux.
В этой книге описаны основные принципы проектирования и детали реализации ядра Linux. Материал представлен в форме, удобной как для тех, кто занимается разработкой кода ядра, так и для программистов, которые хотят лучше понять особенности работы операционных систем и соответственно разрабатывать более эффективные прикладные программы.
В книге детально рассмотрены основные подсистемы и функции ядра Linux, особенности их построения, реализации и соответствующие программные интерфейсы. При этом ядро рассматривается под разными углами: теоретическим и прикладным, что может привлечь читателей с различными интересами и запросами.
Автор книги является разработчиком основных подсистем ядра Linux. Он делится своим бесценным опытом и знаниями по ядрам Linux серии 2.6. Рассмотренные вопросы включают управление процессами, системный планировщик, отсчет времени и таймеры ядра, интерфейс вызовов системных функций, особенности адресации и управления памятью, страничный кеш, подсистема VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. В книге также рассмотрены интересные новшества, которые появились в ядрах серии 2.6, такие как планировщик CFS, мультипрограммный режим работы ядра, уровень блочного ввода-вывода и планировщики ввода-вывода.
В третье издание этой книги включен ряд новых материалов, а старые главы подверглись существенному обновлению.
Особенности третьего издания
- Полностью новая глава, посвященная структурам данных и алгоритмам, используемым в ядре.
- Подробное описание механизмов обработки прерываний и реализация нижних половин обработчиков прерываний.
- Углубленное описание механизмов синхронизации и блокировки, используемых в ядре.
- Расширенное описание системы виртуальной памяти и особенностей выделения памяти в режиме ядра.
- Дополнительные сведения по отладке кода ядра.
- Полезные детали по работе с заплатами и вопросы взаимодействия с сообществом разработчиков.
Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Роберт Лав — активный разработчик программного обеспечения с открытым исходным кодом, оратор и автор книг. Он использует операционную систему Linux с первых дней ее существования и более пятнадцати лет занимается написанием кода ядра. В настоящее время Роберт работает в должности главного программного инженера в компании Google и является членом команды по разработке ядра ОС для мобильной платформы Android. До перехода в Google Роберт работал в корпорации Novell, где занимал должность главного архитектора и занимался разработкой Linux Desktop. Его карьера программиста началась в компании MontaVista Software, где он занимался разработкой ядра, а затем продолжилась в компании Ximian. Роберт участвовал в проектах по разработке мультипрограммного ядра, системного планировщика, уровня событий ядра, системы inotify, по улучшению системы виртуальной памяти и нескольких драйверов устройств. Он выступал на многочисленных конференциях и написал множество статей, посвященных ядру Linux. На общественных началах Роберт входит в редколлегию Linux Journal. Он написал также две другие книги, посвященные Linux: Linux System Programming и Linux in a Nutshell.
Издательство: Вильямс, 3-е издание, 2012 г.
ISBN 978-5-8459-1779-9
Количество страниц: 496.
Содержание книги «Ядро Linux: описание процесса разработки»:
- 17 Предисловие
- 19 Введение
- 20 Итак
- 20 Версия ядра
- 20 Читательская аудитория
- 22 Благодарности
- 23 Об авторе
- 24 От издательства
- 25 Глава 1. Понятие о ядре Linux
- 25 История систем Unix
- 27 Потом пришел Линус: введение в Linux
- 29 Обзор операционных систем и ядер
- 31 Отличие ядра Linux от классических ядер Unix
- 34 Версии ядра Linux
- 35 Сообщество разработчиков ядра Linux
- 36 Перед тем как начать
- 37 Глава 2. Начальные сведения о ядре Linux
- 37 Где взять исходный код ядра
- 37 Использование Git
- 38 Инсталляция исходного кода ядра
- 38 Использование заплат
- 39 Дерево каталогов исходных кодов ядра
- 40 Сборка ядра
- 40 Конфигурирование ядра
- 42 Уменьшение количества выводимых сообщений
- 42 Порождение нескольких параллельных задач сборки
- 42 Инсталляция нового ядра
- 43 Отличия от обычных приложений
- 44 Отсутствие библиотеки libc и стандартных заголовков
- 45 Компилятор GNU C
- 47 Отсутствие защиты памяти
- 47 Нельзя просто использовать вычисления с плавающей точкой
- 47 Системная стек-память небольшого фиксированного размера
- 48 Синхронизация и параллельное выполнение
- 48 Переносимость — это важно
- 49 Резюме
- 37 Где взять исходный код ядра
- 51 Глава 3. Управление процессами
- 51 Понятие процесса
- 53 Дескриптор процесса и структура task_struct
- 53 Распределение памяти под дескриптор процесса
- 55 Сохранение дескриптора процесса
- 56 Состояние процесса
- 58 Изменение текущего состояния процесса
- 58 Контекст процесса
- 58 Дерево семейства процессов
- 60 Создание нового процесса
- 60 Копирование при записи
- 61 Функция fork()
- 62 Функция vfork()
- 63 Реализация потоков в ядре Linux
- 64 Создание потоков
- 65 Потоки в ядре
- 66 Завершение процесса
- 68 Удаление дескриптора процесса
- 68 Дилемма «беспризорного» процесса
- 70 Резюме
- 73 Глава 4. Системный планировщик и диспетчеризация процессов
- 73 Мультипрограммный режим работы
- 75 Системный планировщик Linux
- 76 Стратегия планирования
- 76 Процессы, ориентированные на ввод-вывод и на вычисления
- 77 Приоритет процессов
- 78 Кванты времени
- 79 Стратегия планирования в действии
- 80 Алгоритм работы планировщика системы Linux
- 80 Классы планировщика
- 81 Планирование процессов в системах Unix
- 83 Справедливое планирование задач
- 85 Реализация планировщика в системе Linux
- 85 Учет времени
- 87 Выбор процесса
- 91 Точка входа в планировщик
- 92 Замораживание и активизация процессов
- 96 Вытеснение и переключение контекста
- 97 Вытеснение пространства пользователя
- 98 Вытеснение пространства ядра
- 99 Стратегии планирования в режиме реального времени
- 100 Системные функции для управления планировщиком
- 101 Системные функции для изменения стратегии и приоритета
- 101 Системные функции для изменения привязки к процессору
- 102 Передача процессорного времени другим задачам
- 102 Резюме
- 103 Глава 5. Системные функции
- 103 Взаимодействие с ядром
- 104 API, POSIX и библиотека C
- 105 Системные функции
- 106 Номера системных функций
- 107 Быстродействие системных функций
- 107 Обработчик вызова системных функций
- 108 Как определить, какую системную функцию вызвать
- 109 Передача параметров
- 109 Реализация системных функций
- 109 Разработка системных функций
- 110 Проверка параметров
- 113 Контекст системной функции
- 114 Завершающие этапы регистрации системной функции
- 116 Доступ к системным функциям из пользовательских приложений
- 117 Почему не нужно создавать системные функции
- 118 Резюме
- 119 Глава 6. Структуры данных ядра
- 119 Связанные списки
- 120 Однонаправленный и двунаправленный связанный список
- 120 Циклически связанные списки
- 121 Перемещение по элементам связанного списка
- 122 Реализация в ядре Linux
- 124 Работа со связанными списками
- 127 Обход элементов связанного списка
- 130 Очереди
- 131 Система kfifo
- 132 Создание очереди
- 132 Постановка в очередь
- 132 Выборка из очереди
- 133 Определение размера очереди
- 133 Очистка и удаление очереди
- 134 Примеры использования очередей
- 134 Таблицы отображения
- 135 Инициализация структуры idr
- 135 Выделение нового UID
- 137 Поиск UID
- 137 Удаление UID
- 137 Аннулирование idr
- 138 Двоичные деревья
- 138 Двоичные деревья поиска
- 139 Самобалансирующиеся двоичные деревья поиска
- 139 Красно-черные деревья
- 140 Реализация в Linux
- 142 Какие структуры данных следует использовать, если
- 143 Алгоритмическая сложность
- 143 Что такое алгоритм?
- 144 Понятие большого «О»
- 144 Понятие большой «тета»
- 145 Временная сложность алгоритма
- 146 Резюме
- 119 Связанные списки
- 147 Глава 7. Прерывания и их обработка
- 147 Прерывания
- 149 Обработчики прерываний
- 150 Верхняя и нижняя половины
- 150 Регистрация обработчика прерывания
- 151 Флаги обработчика прерываний
- 152 Остальные параметры функции обработки прерывания
- 153 Пример обработчика прерывания
- 153 Освобождение обработчика прерывания
- 154 Написание обработчика прерывания
- 155 Обработчики общих запросов на прерывание
- 156 Пример настоящего обработчика прерывания
- 158 Контекст прерывания
- 159 Реализация системы обработки прерываний
- 162 Интерфейс /proc/interrupts
- 163 Управление прерываниями
- 164 Запрещение и разрешение прерываний
- 165 Запрещение заданной линии IRQ
- 166 Состояние системы обработки прерываний
- 167 Резюме
- 169 Глава 8. Нижняя половина обработчика и отложенные действия
- 170 Нижняя половина
- 171 Когда используется нижняя половина обработчика
- 171 Многообразие нижних половин
- 174 Отложенные прерывания
- 175 Реализация механизма отложенных прерываний
- 177 Использование отложенных прерываний
- 179 Тасклеты
- 179 Реализация тасклетов
- 182 Использование тасклетов
- 184 Демон ksoftirqd
- 186 Старый механизм BH
- 187 Очереди отложенных действий
- 188 Реализация очередей отложенных действий
- 191 Использование очередей отложенных действий
- 194 Старый механизм очередей задач
- 195 Какие механизмы обработчиков нижних половин следует использовать
- 196 Блокировки между нижними половинами обработчиков
- 197 Запрещение обработки нижних половин
- 199 Резюме
- 170 Нижняя половина
- 201 Глава 9. Общие сведения о синхронизации кода ядра
- 202 Критические участки и конфликты из-за доступа к системным ресурсам
- 202 Зачем вообще нужно что-то защищать?
- 204 Общая переменная
- 205 Блокировки
- 207 Причины возникновения параллелизма
- 209 Что нужно защищать?
- 210 Взаимоблокировки
- 213 Конфликт при блокировке и масштабируемость
- 215 Резюме
- 202 Критические участки и конфликты из-за доступа к системным ресурсам
- 217 Глава 10. Средства синхронизации ядра
- 217 Неделимые операции
- 218 Неделимые целочисленные операции
- 222 64-разрядные неделимые операции
- 223 Неделимые битовые операции
- 225 Спин-блокировки
- 227 Функции для спин-блокировки
- 229 Другие средства работы со спин-блокировками
- 230 Спин-блокировки и нижние половины обработчиков прерываний
- 230 Спин-блокировки по чтению-записи
- 233 Семафоры
- 234 Счетные и бинарные семафоры
- 235 Создание и инициализация семафоров
- 236 Использование семафоров
- 237 Семафоры для чтения-записи
- 238 Мьютексы
- 240 Сравнение семафоров и мьютексов
- 240 Сравнение спин-блокировок и мьютексов
- 241 Условные переменные
- 242 BKL: большая блокировка ядра
- 243 Последовательные блокировки
- 245 Отключение мультипрограммного режима работы ядра
- 247 Порядок выполнения операций и барьеры
- 251 Резюме
- 217 Неделимые операции
- 253 Глава 11. Таймеры и управление временем
- 254 Основная идея учета времени в ядре
- 255 Частота импульсов таймера: директива HZ
- 256 Идеальное значение параметра HZ
- 257 Преимущества больших значений параметра HZ
- 258 Недостатки больших значений параметра HZ
- 259 Переменная jiffies
- 260 Внутреннее представление переменной jiffies
- 261 Переполнение переменной jiffies
- 263 Пользовательские программы и параметр HZ
- 264 Аппаратные часы и таймеры
- 264 Часы реального времени
- 264 Системный таймер
- 265 Обработчик прерываний от таймера
- 267 Абсолютное время
- 269 Таймеры
- 270 Использование таймеров
- 272 Конфликты из-за доступа к ресурсам при использовании таймеров
- 272 Реализация таймеров
- 273 Задержка выполнения
- 273 Задержка с помощью цикла
- 274 Короткие задержки
- 276 Функция schedule_timeout()
- 278 Резюме
- 279 Глава 12. Управление памятью
- 279 Страничная организация памяти
- 281 Зоны
- 284 Выделение страниц памяти
- 284 Выделение обнуленных страниц памяти
- 285 Освобождение страниц памяти
- 286 Функция kmalloc()
- 287 Флаги gfp_mask
- 292 Функция kfree()
- 292 Функция vmalloc()
- 294 Уровень блочного распределения памяти
- 295 Структура уровня блочного распределения памяти
- 298 Интерфейс блочного распределителя памяти
- 300 Пример использования блочного распределителя памяти
- 301 Статическое выделение памяти в стеке
- 302 Одностраничные стеки ядра
- 303 Справедливое использование стека
- 303 Отображение верхней памяти
- 303 Постоянное отображение
- 304 Временное отображение
- 305 Выделение памяти для конкретного процессора
- 306 Новый интерфейс percpu
- 306 Работа с процессорными данными на этапе компиляции
- 307 Работа с процессорными данными на этапе выполнения
- 308 Когда лучше использовать данные, связанные с процессорами
- 309 Выбор способа выделения памяти
- 310 Резюме
- 311 Глава 13. Виртуальная файловая система
- 312 Общий интерфейс файловых систем
- 312 Абстрактный уровень файловой системы
- 314 Файловые системы Unix
- 315 Объекты VFS и их структуры данных
- 317 Объект суперблок
- 318 Операции суперблока
- 320 Объект inode
- 322 Операции с файловыми индексами
- 325 Объект элемента каталога (dentry)
- 326 Состояние элементов каталога
- 327 Кеш объектов dentry
- 328 Операции с элементами каталогов
- 329 Файловый объект
- 330 Файловые операции
- 335 Структуры данных, связанные с файловыми системами
- 337 Структуры данных, связанные с процессом
- 339 Резюме
- 341 Глава 14. Уровень блочного ввода-вывода
- 342 Структура блочного устройства
- 343 Буферы и их заголовки
- 346 Структура bio
- 347 Векторы ввода-вывода
- 348 Сравнение старой и новой реализаций
- 349 Очереди запросов
- 350 Планировщики ввода-вывода
- 350 Задачи планировщика ввода-вывода
- 351 Лифт имени Линуса
- 353 Планировщик ввода-вывода с ограничением по времени
- 355 Прогнозирующий планировщик ввода-вывода
- 356 Планировщик ввода-вывода с полностью равноправными очередями
- 357 Планировщик ввода-вывода с отсутствием операций (Noop)
- 357 Выбор планировщика ввода-вывода
- 358 Резюме
- 359 Глава 15. Адресное пространство процесса
- 359 Адресные пространства
- 361 Дескриптор памяти
- 363 Выделение дескриптора памяти
- 363 Удаление дескриптора памяти
- 364 Структура mm_struct и потоки ядра
- 364 Области виртуальной памяти
- 365 Флаги областей VMA
- 367 Операции с областями VMA
- 368 Списки и деревья областей памяти
- 369 Области памяти в реальных приложениях
- 371 Работа с областями памяти
- 371 Функция find_vma()
- 372 Функция find_vma_prev()
- 372 Функция find_VMA_intersection()
- 373 Функции mmap() и do_mmap(): создание диапазона адресов
- 375 Функции munmap() и do_munmap(): удаление диапазона адресов
- 375 Таблицы страниц
- 377 Резюме
- 379 Глава 16. Страничный кеш и отложенная запись страниц
- 380 Методики кеширования
- 380 Кеширование при записи
- 381 Вытеснение данных из кеша
- 383 Реализация страничного кеша в ОС Linux
- 383 Объект address_space
- 385 Операции объекта address_space
- 387 Базисное дерево
- 387 Старая хеш-таблица страниц
- 388 Буферный кеш
- 388 Потоки синхронизатора
- 390 Режим ноутбука
- 391 Экскурс в историю: bdflush, kupdated и pdflush
- 392 Предотвращение перегрузки с помощью нескольких потоков
- 393 Резюме
- 380 Методики кеширования
- 395 Глава 17. Устройства и модули
- 395 Типы устройств
- 396 Модули
- 397 Модуль «Hello, World!»
- 398 Сборка модулей
- 401 Установка модулей
- 401 Генерация зависимостей между модулями
- 401 Загрузка модулей
- 402 Поддержка параметров конфигурации
- 404 Параметры модулей
- 406 Экспортируемые символы
- 407 Модель представления устройств
- 408 Объекты kobject
- 409 Типы ktype
- 410 Множества объектов kset
- 410 Взаимосвязь kobject, ktype и kset
- 411 Управление и работа с объектами kobject
- 412 Счетчики ссылок
- 414 Файловая система sysfs
- 417 Добавление и удаление объектов файловой системы sysfs
- 418 Добавление файлов в файловую систему sysfs
- 421 Уровень событий ядра
- 423 Резюме
- 425 Глава 18. Отладка
- 425 Начало работы
- 426 Ошибки ядра
- 427 Отладка с помощью вывода диагностических сообщений
- 427 Устойчивость
- 428 Уровни вывода сообщений ядра
- 429 Буфер сообщений ядра
- 429 Демоны syslogd и klogd
- 430 Взаимозаменяемость функций printf() и printk()
- 430 Сообщения Oops
- 431 Утилита ksymoops
- 432 Функция kallsyms
- 433 Параметры конфигурации для отладки ядра
- 433 Объявление об ошибках и выдача информации
- 434 «Магическая» клавиша <SysRq>
- 435 Сага об отладчике ядра
- 436 Отладчик gdb
- 436 Отладчик kgdb
- 437 Исследование и тестирование системы
- 437 Использование идентификатора UID в качестве условия
- 437 Использование условных переменных
- 438 Использование статистики
- 438 Ограничение частоты следования и общего количества событий при отладке
- 439 Поиск методом половинного деления изменений, приводящим к ошибкам
- 440 Поиск с помощью git
- 441 Если ничто не помогает — обратитесь к сообществу
- 441 Резюме
- 443 Глава 19. Переносимость
- 443 Переносимые операционные системы
- 445 История переносимости Linux
- 446 Размер машинного слова и типы данных
- 449 Скрытые типы данных
- 449 Специальные типы данных
- 450 Типы с явным указанием размера
- 451 Знаковые и беззнаковые типы char
- 451 Выравнивание данных
- 452 Как избежать проблем с выравниванием
- 452 Выравнивание нестандартных типов данных
- 453 Пустые поля структур
- 454 Порядок следования байтов
- 456 Учет времени
- 457 Размер страницы памяти
- 458 Порядок выполнения операций процессором
- 458 Многопроцессорность, мультипрограммирование и верхняя память
- 459 Резюме
- 461 Глава 20. Заплаты, хакерство и сообщество
- 461 Сообщество
- 462 Стиль написания исходного кода
- 462 Отступы
- 463 Оператор switch
- 463 Пробелы
- 464 Фигурные скобки
- 465 Длина строки исходного кода
- 466 Соглашения о присвоении имен
- 466 Функции
- 466 Комментарии
- 467 Использование директивы typedef
- 468 Использование того, что уже есть
- 468 Избегайте директив ifdef в исходном коде
- 468 Инициализация структур
- 469 Исправление ранее написанного кода
- 469 Организация команды разработчиков
- 470 Отправка сообщений об ошибках
- 470 Заплаты
- 470 Генерация заплат
- 471 Генерирование заплат с помощью программы Git
- 472 Публикация заплат
- 473 Резюме
- 475 Список литературы
- 475 Книги по основам построения операционных систем
- 476 Книги о ядре Unix
- 476 Книги о ядре Linux
- 476 Книги о ядрах других операционных систем
- 477 Книги по API Unix
- 477 Книги по программированию на языке C
- 477 Другие работы
- 478 Веб-сайты
- 479 Предметный указатель
Инструкция как скачать книгу Роберт Лав: Ядро Linux: описание процесса разработки в форматах DjVu, PDF, DOC или fb2 совершенно бесплатно.