- D -
DMA для устройств ISA
Общение с контроллером DMA
Регистрация использования DMA
- G -
get_free_page и друзья
scull, использующий целые страницы: scullp
Интерфейс alloc_pages
- I -
ioctl
Возвращаемое значение
Выбор команд ioctl
Использование аргумента ioctl
Предопределённые команды
Разрешения и запрещённые операции
Реализация команд ioctl
Управление устройством без ioctl
ioctl-ы
- K -
Kobject-ы, Kset-ы и Subsystem-ы
Иерархии kobject-а, kset-ы и subsystem-ы
Основы kobject
- N -
NuBus
- O -
open и release
Метод release
Метод open
- P -
PC/104 и PC/104+
poll и select
Взаимодействие с read и write
Нижележащая структура данных
- R -
read и write
Метод read
Метод write
Функции readv и writev
- S -
SBus
- U -
USB и Sysfs
USB передачи без Urb-ов
usb_bulk_msg
usb_control_msg
Другие функции для работы с данными USB
- V -
vmalloc и друзья
scull использующий виртуальные адреса: scullv
- А -
Автоопределение номера прерывания
Проверка с помощью ядра
Самостоятельное тестирование
Альтернативы блокированию
seqlock-и
Атомарные переменные
Битовые операции
Последовательные блокировки
Прочитать-Скопировать-Обновить
Свободные от блокировки алгоритмы
Анатомия запроса
Барьерные запросы
Неповторяемые запросы
Поля структуры запроса
Структура bio
Аргумент flags
Зоны памяти
Асинхронное сообщение
С точки зрения драйвера
Асинхронный ввод/вывод
Пример асинхронного ввода/вывода
- Б -
Блоки запроса USB
struct urb
Завершение Urb-ов: завершающий обработчик с обратным вызовом
Отмена Urb-ов
Отправка Urb-ов
Создание и уничтожение Urb-ов
Блокирующий Ввод/Вывод
Блокирующие и неблокирующие операции
Знакомство с засыпанием
Подробности засыпания
Пример блокирующего ввода/вывода
Тестирование драйвера Scullpipe
Буферы сокетов
Важные поля
Функции, работающие с буферами сокетов
Быстрые и медленные обработчики
Внутренности обработки прерываний на x86
- В -
Ввод/вывод, управлемый прерыванием
Пример буферированной записи
Верхние и нижние половины
Микрозадачи
Очереди задач
Тасклеты
Взаимодействие с read и write
Запись в устройство
Сброс на диск в процессе вывода
Чтение данных из устройства
Взгляд назад: ISA
Аппаратные ресурсы
Программирование ISA
Спецификация Plug-and-Play
Внешние шины
Вопросы безопасности
Выполнение прямого ввода/вывода
Асинхронный ввод/вывод
- Г -
Генерация события горячего подключения
Операции горячего подключения
Глава 1, Введение в драйверы устройств
Вопросы безопасности
Классы устройств и модулей
Лицензионное соглашение
Нумерация версий
Обзор книги
Присоединение к сообществу разработчиков ядра Linux
Роль драйвера устройства
Строение ядра Linux
Глава 10, Краткая справка
Глава 10, Обработка прерываний
Ввод/вывод, управлемый прерыванием
Верхние и нижние половины
Краткая справка
Подготовка параллельного порта
Разделяемые прерывания
Реализация обработчика
Установка обработчика прерывания
Глава 11, Краткая справка
Глава 11, Типы данных в ядре
Другие вопросы переносимости
Использование стандартных типов языка Си
Краткая справка
Определение точного размера элементам данных
Связные списки
Типы, специфичные для интерфейса
Глава 12, PCI драйверы
NuBus
PC/104 и PC/104+
SBus
Взгляд назад: ISA
Внешние шины
Другие шины ПК
Интерфейс PCI
Краткая справка
Глава 12, Краткая справка
Глава 13, USB драйверы
USB и Sysfs
USB передачи без Urb-ов
Блоки запроса USB
Краткая справка
Написание USB драйвера
Основы USB устройства
Глава 13, Краткая справка
Глава 14, Краткая справка
Глава 14, Модель устройства в Linux
Kobject-ы, Kset-ы и Subsystem-ы
Генерация события горячего подключения
Горячее подключение
Классы
Краткая справка
Низкоуровневые операции в sysfs
Работа со встроенным программным обеспечением
Собираем всё вместе
Шины, устройства и драйверы
Глава 15, Краткая справка
Глава 15, Отображение памяти и DMA
Выполнение прямого ввода/вывода
Краткая справка
Операция устройства mmap
Прямой доступ к памяти
Управление памятью в Linux
Глава 16, Блочные драйверы
Краткая справка
Некоторые другие подробности
Обработка запроса
Операции блочного устройства
Регистрация
Глава 16, Краткая справка
Глава 17, Краткая справка
Глава 17, Сетевые драйверы
Буферы сокетов
Дополнительные команды ioctl
Изменение состояния соединения
Каким разработан snull
Краткая справка
Многоадресность
Несколько других подробностей
Обработчик прерывания
Открытие и закрытие
Передача пакетов
Подключение к ядру
Приём пакетов
Разрешение MAC адреса
Статистическая информация
Структура net_device в деталях
Уменьшение числа прерываний
Глава 18, TTY драйверы
ioctl-ы
Краткая справка
Настройки TTY линии
Небольшой TTY драйвер
Обработка TTY устройствами proc и sysfs
Структура tty_driver в деталях
Структура tty_operations в деталях
Структура tty_struct в деталях
Указатели на функции в tty_driver
Глава 18, Краткая справка
Глава 2, Краткая справка
Глава 2, Сборка и запуск модулей
Инициализация и выключение
Компиляция и загрузка
Краткая справка
Модуль Hello World
Отличия между модулями ядра и приложениями
Параметры модуля
Предварительные замечания
Работа в пространстве пользователя
Символьная таблица ядра
Установка вашей тестовой системы
Глава 3, Краткая справка
Глава 3, Символьные драйверы
open и release
read и write
Дизайн scull
Игра с новым устройством
Использование памяти в scull
Краткая справка
Некоторые важные структуры данных
Регистрация символьных устройств
Старший и младший номера устройств
Глава 4, Техники отладки
Отладка наблюдением
Отладка через запросы
Отладка через печать
Отладчик и соответствующие инструменты
Поддержка отладки в ядре
Система отладки неисправностей
Глава 5, Конкуренция и состояния состязаний
Альтернативы блокированию
Завершения
Конкуренция и управление ей
Краткая справка
Ловушки блокировок
Ловушки в scull
Семафоры и мьютексы
Спин-блокировки
Глава 5, Краткая справка
Глава 6, Краткая справка
Глава 6, Расширенные операции символьного драйвера
ioctl
poll и select
Асинхронное сообщение
Блокирующий Ввод/Вывод
Контроль доступа к файлу устройства
Краткая справка
Произвольный доступ в устройстве
Глава 7, Время, задержки и отложенная работа
Измерение временных промежутков
Краткая справка
Микрозадачи
Определение текущего времени
Отложенный запуск
Очереди задач
Таймеры ядра
Тасклеты
Глава 7, Краткая справка
Глава 8, Выделение памяти
get_free_page и друзья
vmalloc и друзья
Заготовленные кэши
Как работает kmalloc
Копии переменных для каждого процессора
Краткая справка
Получение больших буферов
Глава 8, Краткая справка
Глава 9, Взаимодействие с аппаратными средствами
Использование памяти ввода/вывода
Использование портов ввода/вывода
Краткая справка
Порты ввода/вывода и память ввода/вывода
Пример порта ввода/вывода
Глава 9, Краткая справка
Горячее подключение
Динамические устройства
Использование /sbin/hotplug
Утилита /sbin/hotplug
- Д -
Дизайн scull
Длинные задержки
Время ожидания
Ожидание в состоянии занятости
Уступание процессора
Дополнительные команды ioctl
Драйверы устройств Linux, Третья Редакция
Другие вопросы переносимости
Выравнивание данных
Интервалы времени
Порядок байт
Размер страницы
Указатели и значения ошибок
Другие шины ПК
EISA
MCA
VLB
- З -
Завершения
Заготовленные кэши
scull, основанный на кешах кусков: scullc
Пулы памяти
Знакомство с засыпанием
Простое засыпание
- И -
Игра с новым устройством
Иерархии kobject-а, kset-ы и subsystem-ы
Kset-ы
Subsystem-ы
Операции с kset-ами
Изменение состояния соединения
Измерение временных промежутков
Использование счётчика тиков
Процессорно-зависимые регистры
Инициализация и выключение
Гонки при загрузке модуля
Перехват ошибок во время инициализации
Функция очистки
Интерфейс PCI
MODULE_DEVICE_TABLE
PCI прерывания
Адресация в PCI
Аппаратные абстракции
Доступ в пространство конфигурации
Доступ к пространствам ввода/вывода и памяти
Момент загрузки
Разрешение устройства PCI
Регистрация PCI драйвера
Регистры конфигурации и инициализация
Старый способ зондирования PCI
Использование /sbin/hotplug
udev
Скрипты горячего подключения Linux
Использование памяти в scull
Использование памяти ввода/вывода
ISA память ниже 1 Мб
isa_readb и друзья
Доступ к памяти ввода/вывода
Повторное использование short для памяти ввода/ввода
Получение памяти ввода/вывода и отображение
Порты как память ввода/вывода
Использование портов ввода/вывода
Доступ к портам ввода/вывода из пользовательского пространства
Зависимости от платформы
Назначение портов ввода/вывода
Пауза ввода/вывода
Строковые операции
Управление портами ввода/вывода
Использование стандартных типов языка Си
Использование файловой системы /proc
Интерфейс seq_file
Метод ioctl
Работа с файлами в /proc
Создание вашего файла в /proc
Устаревший интерфейс
- К -
Как работает kmalloc
Аргумент flags
Аргумент size
Каким разработан snull
Назначение IP адресов
Физический транспорт пакетов
Классы
Интерфейс class_simple
Полный интерфейс класса
Классы устройств и модулей
Компиляция и загрузка
Зависимость от версии
Зависимость от платформы
Загрузка и выгрузка модулей
Компиляция модулей
Конкуренция и управление ей
Контроль доступа к файлу устройства
Блокирующее открытие как альтернатива EBUSY
Клонирование устройства при открытии
Ограничение доступа: один пользователей в один момент времени
Однократно-открываемые устройства
Копии переменных для каждого процессора
- Л -
Лицензионное соглашение
Ловушки блокировок
Правила очерёдности блокировки
Сомнительные правила
Точечное блокирование против грубого
Ловушки в scull
- М -
Микрозадачи
Многоадресность
Поддержка многоадресности в ядре
Типичная реализация
Модуль Hello World
- Н -
Написание USB драйвера
probe и disconnect в деталях
Какие устройства поддерживает драйвер?
Отправка и управление Urb
Регистрация USB драйвера
Настройки TTY линии
set_termios
tiocmget и tiocmset
Небольшой TTY драйвер
struct termios
Некоторые важные структуры данных
Структура file
Структура inode
Файловые операции
Некоторые другие подробности
Очереди помеченных команд
Предварительная подготовка команд
Несколько других подробностей
Netpoll
Поддержка Ethtool
Поддержка интерфейса, не зависящего от среды передачи
Низкоуровневые операции в sysfs
Атрибуты по умолчанию
Двоичные атрибуты
Нестандартные атрибуты
Символические ссылки
Нумерация версий
- О -
Обзор книги
Обзор передачи данных с прямым доступом к памяти
Самостоятельное выделение
Обработка TTY устройствами proc и sysfs
Обработка запроса
Анатомия запроса
Введение в метод request
Очереди запросов
Простой метод request
Функции завершения запроса
Обработчик прерывания
Операции блочного устройства
Метод ioctl
Методы open и release
Поддержка сменных носителей
Операция устройства mmap
Добавление операций VMA
Использование remap_pfn_range
Отображение памяти с помощью nopage
Переназначение заданных областей ввода/вывода
Перераспределение виртуальных адресов ядра
Перераспределение ОЗУ
Простая реализация
Определение текущего времени
Определение точного размера элементам данных
Основы kobject
Внедрение kobject-ов
Инициализация kobject
Манипуляция счётчиком ссылок
Функции освобождения и типы kobject
Основы USB устройства
Интерфейсы
Конфигурации
Оконечные точки
Открытие и закрытие
Отладка наблюдением
Отладка через запросы
Использование файловой системы /proc
Отладка через печать
printk
Включение и выключение сообщений
Как получить сообщения из лога
Ограничение скорости
Перенаправление сообщений консоли
Печать номеров устройств
Отладчик и соответствующие инструменты
Dynamic Probes
Linux Trace Toolkit
Вариант Linux для пользовательского режима
Использование gdb
Отладчик ядра kdb
Патчи kgdb
Отличия между модулями ядра и приложениями
Конкуренция в ядре
Несколько дополнительных деталей
Пространство пользователя и пространство ядра
Текущий процесс
Отложенный запуск
Длинные задержки
Короткие задержки
Очереди задач
Общая очередь
Очереди запросов
Создание и удаление очереди
Функции для очереди
Функции управления очередью
- П -
Параметры модуля
Передача пакетов
Ввод/вывод с разборкой/сборкой
Таймауты при передаче
Управление конкуренцией при передаче
Перераспределение ОЗУ
Перераспределение ОЗУ с помощью метода nopage
Подготовка параллельного порта
Поддержка отладки в ядре
Подключение к ядру
Выгрузка модуля
Инициализация каждого устройства
Регистрация устройства
Подробности засыпания
Детали пробуждения
Древняя история: sleep_on
Как процесс засыпает
Ручное управление засыпанием
Эксклюзивные ожидания
Полный интерфейс класса
Интерфейсы класса
Управление классами
Устройства класса
Получение больших буферов
Получение выделенного буфера во время загрузки
Порты ввода/вывода и память ввода/вывода
Регистры ввода/вывода и обычная память
Предварительные замечания
Приём пакетов
Пример порта ввода/вывода
Обзор параллельного порта
Пример драйвера
Присоединение к сообществу разработчиков ядра Linux
Произвольный доступ в устройстве
Реализация llseek
Прямой доступ к памяти
DMA для устройств ISA
Выделение DMA буфера
Обзор передачи данных с прямым доступом к памяти
Универсальный уровень DMA
Шинные адреса
- Р -
Работа в пространстве пользователя
Работа со встроенным программным обеспечением
Интерфейс ядра для встроенного программного обеспечения
Как это работает
Разделяемые прерывания
Интерфейс /proc и разделяемые прерывания
Работа обработчика
Установка обработчика разделяемого прерывания
Разрешение MAC адреса
Использование ARP с Ethernet
Не-Ethernet заголовки
Подмена ARP
Разрешение и запрет прерываний
Запрет всех прерываний
Запрет одного прерывания
Реализация обработчика
Аргументы обработчика и возвращаемое значение
Разрешение и запрет прерываний
Регистрация
Замечание о размерах секторов
Инициализация в sbull
Регистрация блочного драйвера
Регистрация диска
Регистрация диска
Операции блочного устройства
Структура gendisk
Регистрация символьных устройств
Регистрация устройства в scull
Старый способ
Роль драйвера устройства
- С -
Связные списки
Семафоры и мьютексы
Использование семафоров в scull
Реализация семафоров в Linux
Чтение/Запись семафоров
Символьная таблица ядра
Система отладки неисправностей
Зависания системы
Сообщения Oops
Собираем всё вместе
Добавление драйвера
Добавление устройства
Удаление драйвера
Удаление устройства
Создание и уничтожение Urb-ов
Urb-ы прерывания
Изохронные Urb-ы
Поточные Urb-ы
Управляющие Urb-ы
Спин-блокировки
Знакомство с API спин-блокировки
Спин-блокировки и контекст атомарности
Функции спин-блокировки
Чтение/Запись спин-блокировок
Старший и младший номера устройств
Внутреннее представление номеров устройств
Динамическое выделение старших номеров
Получение и освобождение номеров устройств
Статистическая информация
Строение ядра Linux
Загружаемые модули
Структура net_device в деталях
Вспомогательные поля
Информация об интерфейсе
Информация об оборудовании
Методы устройства
Общая информация
Структура tty_driver в деталях
Структура tty_operations в деталях
Структура tty_struct в деталях
- Т -
Таймеры ядра
API таймера
Реализация таймеров ядра
Тасклеты
Типы, специфичные для интерфейса
- У -
Указатели на функции в tty_driver
open и close
Движение данных
Другие функции буферизации
Нет функции read?
Уменьшение числа прерываний
Универсальный уровень DMA
Двухадресный цикл отображения PCI
Одностраничные потоковые отображения
Отображения DMA
Преобразования разборки/сборки
Простой пример DMA для PCI
Пулы DMA
Работа с проблемным оборудованием
Создание потоковых отображений DMA
Создание согласованных отображений DMA
Управление памятью в Linux
Верхняя и нижняя память
Карта памяти и структура page
Карта памяти процесса
Области виртуальной памяти
Структура vm_area_struct
Таблицы страниц
Типы адресов
Физические адреса и страницы
Установка вашей тестовой системы
Установка обработчика прерывания
Автоопределение номера прерывания
Быстрые и медленные обработчики
Интерфейс /proc
Устройства
Атрибуты устройства
Внедрение структуры устройства
Регистрация устройства
Утилита /sbin/hotplug
IEEE1394 (FireWire)
PCI
S/390 и zSeries
SCSI
USB
Ввод
Сеть
Установочные станции ноутбуков
- Ф -
Функции завершения запроса
Блочные запросы и DMA
Работа без очереди запросов
Работа с bios
- Ш -
Шины
Атрибуты шины
Методы шины
Перебор устройств и драйверов
Регистрация шины
Шины, устройства и драйверы
Внедрение структуры драйвера
Драйверы устройств
Устройства
Шины