Учебное пособие по продвинутому программированию в Linux {Разработка}
Часть 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
Расширять