Обзор книги |
Предыдущая Содержание Следующая |
Отсюда мы входим в мир программирования ядра. Глава 2 знакомит с модулями, объясняя тайны искусства и показывая код работающих модулей. Глава 3 рассказывает о символьных драйверах и показывает законченный код драйвера устройства, работающего с памятью, из которого можно читать и писать для развлечения. Использование памяти вместо аппаратного устройства позволяет любому запускать код примера без необходимости приобретения специального оборудования.
Техники отладки - жизненно важные средства для программиста и описываются в Главе 4. Одинаково важными для тех, кто будет исследовать современные ядра, являются способы управления исполнением и конкурентным доступом к ресурсам. Глава 5 интересуется проблемами, возникающими при параллельном доступе к ресурсам, и описывает механизмы Linux для управления конкурентным доступом.
С отладкой и навыками управления конкурентных процессов вместе, мы двигаемся в дополнительные особенности символьных драйверов, такие как блокирующие операции, использование select и важный вызов ioctl; эти темы - предмет Главы 6.
Прежде чем иметь дело с управлением оборудованием, мы анализируем ещё несколько программных интерфейсов ядра: Глава 7 показывает, как управляют временем в ядре, а Глава 8 объясняет распределение памяти.
Затем вы сфокусируемся на оборудовании. Глава 9 описывает управление портами ввода-вывода и буферами памяти, имеющимися на устройстве; после этого переходим к обработке прерываний в Главе 10. К сожалению, не каждый сможет запустить код примера этих глав, потому что необходимо иметь некоторое оборудование, чтобы протестировать программный интерфейс прерываний. Мы старались изо всех сил, чтобы свести к минимуму требования к оборудованию, но вам всё-таки необходимо такое простое оборудование, как стандартный параллельный порт, чтобы поработать с кодом примера для этих глав.
Глава 11 охватывает использование типов данных в ядре и написание переносимого кода.
Вторая половина книги посвящена более сложным темам. Мы начинаем углубляться в работу оборудования, в частности, функционирование специфичных шин для периферии. Глава 12 охватывает детали написания драйверов для устройств PCI, а Глава 13 рассматривает API для работы с устройствами USB.
Понимая работу периферийных шин, мы сможем бросить детальный взгляд на модель устройств в Linux, которая является уровнем абстракции, используемым ядром, чтобы описывать аппаратные и программные ресурсы, которыми оно управляет. Глава 14 - восходящий взгляд на инфраструктуру модели устройства, начинающуюся с типа kobject и построенную на нём. Она описывает интеграцию модели устройства с реальными аппаратными средствами; затем используем это знание, чтобы затронуть такие темы, как устройства, подключаемые без выключения системы (hot-plugged devices) и управление питанием.
В Главе 15 мы разбираемся в управлении памятью в Linux. Эта глава показывает, как отобразить память ядра в пространство пользователя (системный вызов mmap), отображение пользовательской памяти в пространство ядра (с помощью get_user_pages) и как отобразить любой вид памяти в пространство устройства (чтобы выполнять операции прямого доступа к памяти [DMA]).
Наше понимание памяти будет полезно в следующих двух главах, которые описывают другие главные классы драйверов. Глава 16 вводит блочные драйверы и показывает, как они отличаются от символьных драйверов, с которыми мы работали до этого. Затем Глава 17 рассказывает о написании сетевых драйверов. Мы финишируем разговором о последовательных драйверах (Глава 18) и библиографией. |
Предыдущая Содержание Следующая |