Учебное пособие по продвинутому программированию в Linux {Разработка} <br /> Часть 1 Ядро Linux Часть 2 Руководство по программированию модулей ядра Linux Часть 3 Руководство программиста Linux Часть 4 Концепция ядра Linux Структура системы Часть 5 Структура системы, специфичная для ядра Linux
Оглавление Введение в предисловие Рэймонда Группа разработки документации Linux «Анонс» Предисловие переводчика. Часть первая. Предисловие к ядру Linux. Глава 1 Основы аппаратного обеспечения и основы программного обеспечения 6 1.1 Основы аппаратного обеспечения 6 1.1.1 ЦП 7 1.1.2 Память 8 1.1.3 Автобус 8 1.1.4 Контроллеры и периферийные устройства 8 1.1.5 Адресное пространство 9 1.1.6 Часы 9 1.2 Основы программного обеспечения 9 1.2.1 Компьютерный язык 9 1.2.2 Что такое операционная система 11 1.2.3 Структура данных ядра 13 Глава 2 Управление памятью 15 2.1 Абстрактная модель виртуальной памяти 15 2.1.1 Пейджинг запроса 17 2.1.2 Обмен 17 2.1.3 Общая виртуальная память 18 2.1.4 Режим физической адресации и режим виртуальной адресации 18 2.1.5 Контроль доступа 18 2.2 Кэширование 19 2.3 Таблица страниц Linux 20 2.4 Распределение и переработка страниц 21 2.4.1 Распределение страниц 22 2.4.2 Переработка страниц 22 2.5 Отображение памяти 22 2.6 Запрос на пейджинг 23 2.7 Кэш страниц Linux 24 2.8 Замена и удаление страниц 25 2.8.1 Уменьшение размеров буфера и страничного кэша 25 2.8.2 Замена страниц общей памяти System V 26 2.8.3 Замена и удаление страниц 27 2.9 Кэш подкачки 27 2.10 смена страниц 28 Глава 3 Процесс 29 3.1 Процессы Linux 29 3.2 Идентификаторы 31 3.3 Планирование 32 3.4 Документация 34 3.5 Виртуальная память 35 3.6 Создание процесса 36 3.7 Время и таймеры 37 3.8 Выполнение программы 38 3.8.1 ЭЛЬФ 39 3.8.2 Файлы сценариев 40 Глава 4. Механизм межпроцессного взаимодействия 41 4.1 Механизм сигнализации 41 4.2 Трубы 42 4.3 Розетки 44 4.3.1 Механизм межпроцессного взаимодействия System V 44 4.3.2 Очередь сообщений 44 4.3.3 Семафор 45 4.3.4 Общее хранилище 47 Глава 5 PCI 49 5.1 Адресное пространство PCI 49 5.2 Заголовок конфигурации PCI 50 5.3 PCI I/O и адресное пространство хранилища 51 5.4 Мост PCI-ISA 51 5.5 Мост PCI-PCI 51 5.5.1 Мост PCI-PCI: адреса ввода-вывода PCI и адреса хранения Окно в космос 51 5.5.2 Мост PCI-PCI: цикл конфигурации PCI и PCI Автобус № 52 5.6 Инициализация PCI в Linux 53 5.6.1 Структура данных PCI ядра Linux 53 5.6.2 Драйвер устройства PCI 53 5.6.3 Функции PCI BIOS 56 5.6.4 Процесс коррекции PCI 57 Глава 6 Обработка прерываний и драйверы устройств 60 6.1 Прерывания и обработка прерываний 60 6.1.1 Программируемый контроллер прерываний 61 6.1.2 Инициализация структуры данных обработки прерываний 61 6.1.3 Обработка прерываний 62 6.2 Драйверы устройств 63 6.2.1 Тестирование и прерывание 64 6.2.2 Прямой доступ к памяти (DMA) 65 6.2.3 Память 66 6.2.4 Интерфейс между драйвером устройства и ядром 66 6.2.5 Жесткий диск 69 6.2.6 Сетевое оборудование 74 Глава 7 Файловые системы 77 7.1 Вторая расширенная файловая система EXT2 78 7.1.1 Узел Inode системы EXT2 79 7.1.2 Суперблок в системе EXT2 80 7.1.3 Групповые дескрипторы для систем EXT2 80 7.1.4 Каталог системы EXT2 81 7.1.5 Поиск файлов в файловой системе EXT2 81 7.1.6 Изменение файлов в файловой системе EXT2 Размер 82 7.2 Виртуальная файловая система 83 7.2.1 Суперблок файловой системы VFS 84 7.2.2 Inode-узел файловой системы VFS 84 7.2.3 Регистрация файловой системы 85 7.2.4 Сборка файловой системы 85 7.2.5 Поиск файлов в виртуальной файловой системе 87 7.2.6 Размонтирование файловой системы 87 7.2.7 Кэш индексных дескрипторов файловой системы VFS 87 7.2.8 Кэширование каталогов 88 7.3 Буферное кэширование 88 7.3.1 демон ядра bdflush 90 7.3.2 процесс обновления 90 7.4 /proc файловая система 91 7.5 Специальные файлы устройств 91 Глава 8 Сеть 92 8.1 Обзор сети TCP/IP 92 8.2 Сетевая иерархия TCP/IP в Linux 95 8.3 Интерфейс сокета BSD 96 8.4 Уровень сокетов INET 97 8.4.1 Создание BSD-сокета 98 8.4.2 Адрес привязки для INET BSD Socket 99 8.4.3 Установление соединения INET BSD Socket 99 8.4.4 Прослушивание сокетов INET BSD 100 8.4.5 Прием запросов на соединение 100 8.5 Уровень IP 100 8.5.1 Буфер сокетов 100 8.5.2 Получение IP-сообщений 101 8.5.3 Отправка IP-пакетов 102 8.5.4 Шардинг данных 102 8.6 Протокол разрешения адресов 103 8.7 IP-маршрутизация 104 Глава 9. Механизмы и модули ядра 107 9.1 Механизм ядра 107 9.1.1 Контроль нижней половины 107 9.1.2 Очередь задач 108 9.1.3 Таймеры 109 9.1.4 Очередь ожидания 110 9.1.5 Спин-блокировка 110 9.1.6 Семафор 110 9.2 Модули 111 9.2.1 Загрузка модуля 112 9.2.2 Удаление модуля 113 Глава 10 Процессоры 115 10,1х86 115 10.2 АРМ 115 10.3 Процессор Alpha AXP 115 Глава 11. Исходный код ядра Linux 117 11.1 Как получить исходный код ядра Linux 117 11.2 Расположение исходного кода ядра 117 11.3 С чего начать 118 Глава 12 Структуры данных Linux 120 Приложение A. Полезные веб-сайты и FTP-сайты 138 Приложение B Глоссарий 139 Часть 2. Руководство по программированию модуля ядра Linux. Выражение признательности. Предисловие Глава 1. Привет, мир 145 1.1 Makefile модуля ядра 146 1.2 Многофайловый модуль ядра 147 Глава 2. Файлы символьных устройств 149 Глава 3 /proc Файловая система 158 Глава 4. Использование /proc для ввода 162 Глава 5 Использование файлов устройств для ввода 170 Глава 6 Параметры запуска 182 Глава 7. Системные вызовы 185 Глава 8. Обработка блокировок 190. Глава 9. Замена printk 199 Глава 10. Планирование задач 202 Глава 11. Обработчики прерываний 207 Глава 12 Симметричная многопроцессорная обработка 211 Глава 13 Распространенные ошибки 212 Приложение А. Различия между версиями 2.0 и 2.2 213 Приложение Б. Другие ресурсы 214 Приложение C. Дайте свою оценку 215 Часть 3. Руководство программиста Linux. Глава 1. Операционная система Linux 219. Глава 2. Ядро Linux 220. Глава 3. Пакет libc Linux 221 Глава 4. Системные вызовы 222 Глава 5 «Швейцарский армейский нож»: ioctl 223 Глава 6. Межпроцессное взаимодействие Linux 224 6.1 Введение 224 6.2 Полудуплексные каналы Unix 224 6.2.1 Основные понятия 224 6.2.2 Создание конвейеров на языке C 225 6.2.3 Простой метод 229 6.2.4 Атомарные операции над трубами 233 6.2.5 Несколько замечаний о полудуплексных каналах Выпуск 233 6.3 Именованные каналы 234 6.3.1 Основные понятия 234 6.3.2 Создание FIFO 234 6.3.3 Операция FIFO 235 6.3.4 Действие блокировки в FIFO 236 6.3.5 Сигнал SIGPIPE 237 6.4 Система V МПК 237 6.4.1 Основные понятия 237 6.4.2 Очередь сообщений 239 6.4.3 Семафор 251 6.4.4 semtool: интерактивные операции с семафором Программа 260 6.4.5 Общая память 267 Глава 7 Звуковое программирование 274 7.1 Программирование внутреннего динамика 274 7.2 Программирование звуковой карты 274 Глава 8. Графика персонажей 276 8.1 Функции ввода-вывода в libc 277 8.1.1 Форматированный вывод 277 8.1.2 Форматированный ввод 278 8.2 библиотека termcap 278 8.2.1 Предисловие 278 8.2.2 Получение описания терминала 279 8.2.3 Просмотр описания терминала 279 8.2.4 возможности termcap 280 8.3 Введение в Ncurses 280 8.4 Инициализация 282 8.5 Виндовс 283 8.6 Выход 284 8.6.1 Форматированный вывод 285 8.6.2 Вставка символов/строки 286 8.6.3 Удаление символов/строк 286 8.6.4 Коробки и линии 287 8.6.5 Фоновые символы 287 8.7 Ввод 288 8.8 Опции 289 8.8.1 Опции вывода 289 8.8.2 Опции ввода 290 8.8.3 Свойства терминала 291 8.8.4 Использование опций 291 8.9 Обновление терминала 292 8.10 Свойства и цвета видео 293 8.11 Курсор и координаты экрана 294 8.12 Прокат 294 8.13 Клавиатура 295 8.14 Программные теги 295 8.15 Разное 295 8.16 Низкоуровневый доступ 296 8.17 Дамп экрана 296 8.18 Моделирование Termcap 296 8.19 Функция Термининформация 296 8.20 Функции отладки 297 8.21 Возможности Terminfo 297 8.21.1 Логические возможности 297 8.21.2 Числовые возможности 298 8.21.3 Возможности строк 299 8.22 Обзор функции [N]Проклятия 306 Глава 9. Программирование портов ввода-вывода 307 9.1 Программирование мыши 307 9.2 Программирование модема 308 9.3 Программирование принтера 308 9.4 Программирование джойстика 308 Глава 10. Перенос приложений в Linux 309 10.1 Введение 309 10.2 Обработка сигналов 309 10.2.1 В SVR4, BSD и POSIX.1 Сигнал 310 10.2.2 Параметры сигналов Linux 310 10.2.3 Сигналы в Linux 310 10.2.4 Сигналы, поддерживаемые Linux 311 10.3 Терминал ввода/вывода 311 10.4 Информация о процессе и управление 311 10.4.1 квм процесс 312 10.4.2 Файловая система ptrace и /proc 312 10.4.3 Управление процессом в Linux 312 10.5 Портативная условная компиляция 313 10.6 Дополнительные инструкции 314 Приложение Алфавитные системные вызовы 315 Часть 4. Краткое изложение концепции ядра Linux. Структура системы 323 Предисловие 324 Глава 1. Структура системы 325 1.1 Обзор системы 325 1.2 Цели ядра 325 1.3 Обзор структуры ядра 325 1.4 Поддержка нескольких разработчиков 327 1.5 Структура данных системы 328 1.5.1 Список задач 328 1.5.2 Отображение памяти 328 1.5.3 Индексные узлы 328 1.5.4 Соединение для передачи данных 329 Глава 2. Системная структура подсистем 330 2.1 Структура системы планировщика процессов 330 2.1.1 Цели 330 2.1.2 Модуль 330 2.1.3 Выражение данных 331 2.1.4 Зависимости, поток данных и поток управления 331 2.2 Структура системы менеджера памяти 331 2.2.1 Цели 331 2.2.2 Модули 331 2.2.3 Представление данных 331 2.2.4 Поток данных, поток управления и зависимости 332 2.3 Структура системы виртуальной файловой системы 333 2.3.1 Цели 333 2.3.2 Модули 333 2.3.3 Представление данных 333 2.3.4 Поток данных, поток управления и зависимости 334 2.4 Структура системы сетевого интерфейса 334 2.4.1 Цели 334 2.4.2 Модули 334 2.4.3 Представление данных 335 2.4.4 Поток данных, поток управления и зависимости 335 2.5 Структура системы межпроцессного взаимодействия 335 Глава 3. Заключение 336 Приложение А. Определение терминов 337 Приложение Б. Ссылки 338 Часть 5. Краткое описание конкретной системной структуры ядра Linux 341 Глава 1 Предисловие 342 1.1 Голы 342 1.2 Введение в Linux 342 1.3 Базовые знания структуры программной системы 342 1.4 Методы и подходы 343 1.5 Читатели, для которых предназначена эта книга 344 1.6 Расположение глав данной части 344 Глава 2. Структура системы 345 Глава 3. Структура подсистемы 346 3.1 Планировщик процессов 346 3.1.1 Цели 346 3.1.2 Внешний интерфейс 346 3.1.3 Описание подсистемы 346 3.1.4 Структура данных 347 3.1.5 Структура подсистемы 348 3.1.6 Зависимости подсистемы 348 3.2 Менеджер памяти 348 3.2.1 Цели 348 3.2.2 Внешний интерфейс 349 3.2.3 Описание подсистемы 349 3.2.4 Структура данных 350 3.2.5 Структура подсистемы 350 3.2.6 Зависимости подсистемы 351 3.3 Виртуальная файловая система 352 3.3.1 Цели 352 3.3.2 Внешний интерфейс 352 3.3.3 Описание подсистемы 353 3.3.4 Драйверы устройств 353 3.3.5 Логическая файловая система 354 3.3.6 Модули 354 3.3.7 Структура данных 355 3.3.8 Структура подсистемы 355 3.3.9 Зависимости подсистемы 355 3.4 Межпроцессное взаимодействие 355 3.4.1 Цели 355 3.4.2 Внешний интерфейс 357 3.4.3 Описание подсистемы 357 3.4.4 Структура данных 358 3.4.5 Структура подсистемы 359 3.4.6 Зависимости подсистемы 359 3.5 Сетевой интерфейс 360 3.5.1 Цели 360 3.5.2 Внешний интерфейс 361 3.5.3 Описание подсистемы 361 3.5.4 Структура данных 362 3.5.5 Структура подсистемы 363 3.5.6 Зависимости подсистемы 363 Глава 4. Заключение 365 Приложение А. Определение терминов 366 Приложение Б. Ссылки 368 Часть шестая Приложение Приложение A Лицензия на копирование проекта документа Linux 372 Приложение B Стандартная общественная лицензия GNU 374