^
Начало
Установить закладку
+ Настройки
14 | 16 | 18 | 20 | 22 | 24
Ширина текста:
50% | 60% | 70% | 80% | 90% | 100%
Шрифт:
Цвет текста:
Установить
Цвет фона:
Установить
Сбросить настройки
Разработка ядра Linux
Второе издание
Роберт Лав
Предисловие
Введение
Итак…
Версия ядра
Читательская аудитория
Интернет-ресурс
Благодарности ко второму изданию
Об авторе
От издательства
Для читателей
Глава 1
Введение в ядро Linux
Потом пришел Линус: введение в Linux
Обзор операционных систем и ядер
Ядро Linux в сравнении с классическими ядрами Unix
Версии ядра Linux
Сообщество разработчиков ядра Linux
Перед тем как начать
Глава 2
Начальные сведения о ядре Linux
Получение исходного кода ядра
Инсталляция исходного кода ядра
Использование заплат
Дерево исходных кодов ядра
Сборка ядра
Уменьшение количества выводимых сообщений
Параллельная сборка
Инсталляция ядра
"Зверек другого рода"
Отсутствие библиотеки libc
Компилятор GNU С
Отсутствие защиты памяти
Нельзя просто использовать вычисления с плавающей точкой
Маленький стек фиксированного размера
Синхронизация и параллелизм
Переносимость — это важно
Резюме
Глава 3
Управление процессами
Дескриптор процесса и структура task structure
Выделение дескриптора процесса
Хранение дескриптора процесса
Состояние процесса
Манипулирование текущим состоянием процесса
Контекст процесса
Дерево семейства процессов
Создание нового процесса
Копирование при записи
Реализация потоков в ядре Linux
Потоки в пространстве ядра
Завершение процесса
Удаление дескриптора процесса
Дилемма "беспризорного" процесса
Резюме
Глава 4
Планирование выполнения процессов
Стратегия планирования
Процессы, ограниченные скоростью ввода-вывода и скоростью процессора
Приоритет процесса
Квант времени
Вытеснение процесса
Стратегия планирования в действии
Алгоритм планирования
Очереди выполнения
Массивы приоритетов
Пересчет квантов времени
Вычисление приоритетов и квантов времени
Переход в приостановленное состояние и возврат к выполнению
Балансировка нагрузки
Вытеснение и переключение контекста
Вытеснение пространства пользователя
Вытеснение пространства ядра
Режим реального времени
Системные вызовы для управления планировщиком
Системные вызовы, связанные с управлением стратегией и приоритетом
Системные вызовы управления процессорной привязкой
Передача процессорного времени
В завершение о планировщике
Глава 5
Системные вызовы
API, POSIX и библиотека С
Вызовы syscall
Номера системных вызовов
Производительность системных вызовов
Обработка системных вызовов
Определение необходимого системного вызова
Передача параметров
Реализация системных вызовов
Проверка параметров
Контекст системного вызова
Окончательные шаги регистрации системного вызова
Доступ к системным вызовам из пространства пользователя
Почему не нужно создавать системные вызовы
В заключение о системных вызовах
Глава 6
Прерывания и обработка прерываний
Прерывания
Обработчики прерываний
Верхняя и нижняя половины
Регистрация обработчика прерывания
Освобождение обработчика прерывания
Написание обработчика прерывания
Совместно используемые обработчики
Настоящий обработчик прерывания
Контекст прерывания
Реализация системы обработки прерываний
Управление прерываниями
Запрещение и разрешение прерываний
Запрещение определенной линии прерывания
Состояние системы обработки прерываний
Не нужно прерывать, мы почти закончили!
Глава 7
Обработка нижних половин и отложенные действия
Нижние половины
Когда нужно использовать нижние половины
Многообразие нижних половин
Механизм отложенных прерываний (softirq)
Реализация отложенных прерываний
Использование отложенных прерываний
Тасклеты
Реализация тасклетов
Использование тасклетов
Демон ksoftirqd
Старый механизм BH
Очереди отложенных действий
Реализация очередей отложенных действий
Использование очередей отложенных действий
Старый механизм очередей заданий
Какие обработчики нижних половин необходимо использовать
Блокировки между обработчиками нижних половин
Запрещение обработки нижних половин
Внизу обработки нижних половин
Глава 8
Введение в синхронизацию выполнения кода ядра
Критические участки и состояние конкуренции за ресурсы
Зачем нужна защита
Блокировки
Откуда берется параллелизм
Что требует защиты
Взаимоблокировки
Конфликт при захвате блокировки и масштабируемость
Блокировки в вашем коде
Глава 9
Средства синхронизации в ядре
Атомарные операции
Целочисленные атомарные операции
Битовые атомарные операции
Спин-блокировки
Другие средства работы со спин-блокировками
Спин-блокировки и обработчики нижних половин
Спин-блокировки чтения-записи
Семафоры
Создание и инициализация семафоров
Использование семафоров
Семафоры чтения-записи
Сравнение спин-блокировок и семафоров
Условные переменные
BKL: Большая блокировка ядра
Секвентные блокировки
Средства запрещения преемптивности
Барьеры и порядок выполнения
Резюмирование по синхронизации
Глава 10
Таймеры и управление временем
Информация о времени в ядре
Частота импульсов таймера: HZ
Идеальное значение параметра HZ
Переменная jiffies
Внутреннее представление переменной jiffies
Переполнение переменной jiffies
Пространство пользователя и параметр HZ
Аппаратные часы и таймеры
Часы реального времени
Системный таймер
Обработчик прерываний таймера
Абсолютное время
Таймеры
Использование таймеров
Состояния конкуренции, связанные с таймерами
Реализация таймеров
Задержка выполнения
Задержка с помощью цикла
Короткие задержки
Функция schedule_timeout()
Время вышло
Глава 11
Управление памятью
Страницы памяти
Зоны
Получение страниц памяти
Получение страниц заполненных нулями
Освобождение страниц
Функция kmalloc()
Флаги gfp_mask
Функция kfree()
Функция vmalloc()
Уровень слябового распределителя памяти
Устройство слябового распределителя памяти
Интерфейс слябового распределителя памяти
Пример использования слябового распределителя памяти
Статическое выделение памяти в стеке
Честная игра со стеком
Отображение верхней памяти
Постоянное отображение
Временное отображение
Выделение памяти, связанной с определенным процессором
Новый интерфейс percpu
Работа с данными, связанными с процессорами, на этапе компиляции
Работа с данными процессоров на этапе выполнения
Когда лучше использовать данные, связанные с процессорами
Какой способ выделения памяти необходимо использовать
Глава 12
Виртуальная файловая система
Общий интерфейс к файловым системам
Уровень обобщенной файловой системы
Файловые системы Unix
Объекты VFS и их структуры данных
Другие объекты подсистемы VFS
Объект superblock
Операции суперблока
Объект inode
Операции с файловыми индексами
Объект dentry
Состояние элементов каталога
Кэш объектов dentry
Операции с элементами каталогов
Объект file
Файловые операции
Структуры данных, связанные с файловыми системами
Структуры данных, связанные с процессом
Файловые системы в операционной системе Linux
Глава 13
Уровень блочного ввода-вывода
Анатомия блочного устройства
Буферы и заголовки буферов
Структура bio
Сравнение старой и новой реализаций
Очереди запросов
Запросы
Планировщики ввода-вывода
Задачи планировщика ввода-вывода
Лифтовой алгоритм Линуса
Планировщик ввода-вывода с лимитом по времени
Прогнозирующий планировщик ввода-вывода
Планировщик ввода-вывода с полностью равноправными очередями
Планировщик ввода-вывода noop
Выбор планировщика ввода-вывода
Резюме
Глава 14
Адресное пространство процесса
Дескриптор памяти
Выделение дескриптора памяти
Удаление дескриптора памяти
Структура mm_struct и потоки пространства ядра
Области памяти
Флаги областей VMA
Операции с областями VMA
Списки и деревья областей памяти
Области памяти в реальной жизни
Работа с областями памяти
Функция find_vma()
Функция find_vma_prev()
Функция find_vma_intersection()
Функции mmap() и do_mmap(): создание интервала адресов
Системный вызов mmap()
Функции munmap() и do_munmap(): удаление интервала адресов
Системный вызов munmap()
Таблицы страниц
Заключение
Глава 15
Страничный кэш и обратная запись страниц
Страничный кэш
Объект address_space
Базисное дерево
Старая хеш-таблица страниц
Буферный кэш
Демон pdflush
Демоны bdflush и kupdated
Предотвращение перегруженности: для чего нужны несколько потоков
Коротко о главном
Глава 16
Модули
Модуль "Hello, World!"
Сборка модулей
Использование дерева каталогов исходных кодов ядра
Компиляция вне дерева исходных кодов ядра
Инсталляция модулей
Генерация зависимостей между модулями
Загрузка модулей
Управление конфигурационными параметрами
Параметры модулей
Экспортируемые символы
Вокруг модулей
Глава 17
Объекты kobject и файловая система sysfs
Объекты kobject
Типы ktype
Множества объектов kset
Подсистемы
Путаница со структурами
Управление и манипуляции с объектами kobject
Счетчики ссылок
Структуры kref
Файловая система sysfs
Добавление и удаление объектов на файловой системе sysfs
Добавление файлов на файловой системе sysfs
Уровень событий ядра
Кратко об объектах kobject и файловой системе sysfs
Глава 18
Отладка
С чего необходимо начать
Дефекты ядра
Функция printk()
Устойчивость функции printk()
Уровни вывода сообщений ядра
Буфер сообщений ядра
Демоны syslogd и klogd
Замечание относительно функции printk() и разработки ядра
Сообщения Oops
Утилита ksymoops
Функция kallsyms
Конфигурационные параметры отладки ядра
Отладка атомарных операций
Генерация ошибок и выдача информации
Магическая клавиша SysRq
Сага об отладчике ядра
Использование отладчика gdb
Отладчик kgdb
Отладчик kdb
Исследование и тестирование системы
Использование идентификатора UID в качестве условия
Использование условных переменных
Использование статистики
Ограничение частоты следования событий при отладке
Нахождение исполняемых образов с изменениями приводящими к ошибкам
Если ничто не помогает — обратитесь к сообществу
Глава 19
Переносимость
История переносимости Linux
Размер машинного слова и типы данных
Скрытые типы данных
Специальные типы данных
Типы с явным указанием размера
Знак типа данных char
Выравнивание данных
Как избежать проблем с выравниванием
Выравнивание нестандартных типов данных
Заполнение структур
Порядок следования байтов
История терминов big-endian и little-endian
Порядок байтов в ядре
Таймер
Размер страницы памяти
Порядок выполнения операций процессором
Многопроцессорность, преемптивность и верхняя память
Пару слов о переносимости
Глава 20
Заплаты, разработка и сообщество
Сообщество
Стиль написания исходного кода
Отступы
Фигурные скобки
Длинные строки
Имена
Функции
Комментарии
Использование директивы typedef
Использование того, что уже есть
Никаких директив ifdef в исходном коде
Инициализация структур
Исправление ранее написанного кода
Организация команды разработчиков
Отправка сообщений об ошибках
Генерация заплат
Представление заплат
Заключение
Приложение А
Связанные списки
Кольцевые связанные списки
Перемещение по связанному списку
Реализация связанных списков в ядре Linux
Структура элемента списка
Работа со связанными списками
Перемещение по связанным спискам
Приложение Б
Генератор случайных чисел ядра
Принцип работы и реализация
Проблема с загрузкой системы
Интерфейсы для ввода энтропии
Интерфейсы для вывода энтропии
Приложение В
Сложность алгоритмов
Алгоритмы
Множество О
Множество большого-тета
Объединяем все вместе
Опасность, связанная со сложностью алгоритмов
Приложение Г
Библиография и список литературы
Книги по основам построения операционных систем
Книги о ядрах Unix
Книги о ядрах Linux
Книги о ядрах других операционных систем
Книги по API Unix
Другие работы
Web-сайты
