Ядро 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 Резюме
  • 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 Резюме
  • 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 Резюме
  • 201 Глава 9. Общие сведения о синхронизации кода ядра
    • 202 Критические участки и конфликты из-за доступа к системным ресурсам
      • 202 Зачем вообще нужно что-то защищать?
      • 204 Общая переменная
    • 205 Блокировки
      • 207 Причины возникновения параллелизма
      • 209 Что нужно защищать?
    • 210 Взаимоблокировки
    • 213 Конфликт при блокировке и масштабируемость
    • 215 Резюме
  • 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 Резюме
  • 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 Резюме
  • 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 совершенно бесплатно.
Ядро Linux: описание процесса разработки
Рейтинг книги:
3 голоса
1008

Поиск книг:




При поиске учитываются только слова, длина которых больше 3-х символов.

Статистика: