Ядро Linux [3 ed.] 9785941579570

В книге «Ядро Linux» описывается большинство структур данных, а также алгоритмы и приемы программирования, которые испол

146 122 14MB

Russian Pages 1105 Year 2007

Report DMCA / Copyright

DOWNLOAD FILE

Ядро Linux [3 ed.]
 9785941579570

Table of contents :
Оглавление......Page 5
Об авторах......Page 19
Наша читательская аудитория......Page 21
Организация материала......Page 22
Уровень описания......Page 23
Обзор книги......Page 24
Благодарности......Page 26
Глава 1. Введение......Page 29
Сравнение Linux с другими Unix-подобными ядрами......Page 30
Монолитное ядро......Page 31
Вытеснение в ядре......Page 32
STREAMS......Page 33
Зависимость от оборудования......Page 35
Версии Linux......Page 36
Основные понятия операционных систем......Page 37
Пользователи и группы......Page 39
Процессы......Page 40
Архитектура ядра......Page 42
Файлы......Page 43
Типы файлов......Page 45
Дескриптор файла и индексный дескриптор......Page 46
Права доступа и режим файла......Page 47
Системные вызовы для работы с файлами......Page 48
Модель процесс/ядро......Page 51
Реентерабельные ядра......Page 53
Адресное пространство процесса......Page 55
Синхронизация и критические области......Page 56
Сигналы и взаимодействие между процессами......Page 60
Управление процессами......Page 61
Управление памятью......Page 63
Драйверы устройств......Page 67
Адреса памяти......Page 71
Селектор сегментов и сегментные регистры......Page 73
Дескрипторы сегментов......Page 74
Быстрый доступ к дескрипторам сегментов......Page 76
Блок сегментации......Page 77
Сегментация в Linux......Page 78
Глобальная таблица дескрипторов Linux......Page 80
Локальные таблицы дескрипторов Linux......Page 82
Управление страницами на аппаратном уровне......Page 83
Обычное управление страницами......Page 84
Расширенное управление страницами......Page 87
Пример обычного управления страницами......Page 88
Механизм расширения физических адресов (PAE)......Page 90
Управление страницами в 64-разрядных архитектурах......Page 92
Аппаратный кэш......Page 93
Управление страницами в Linux......Page 96
Поля линейного адреса......Page 99
Работа с Таблицей Страниц......Page 100
Схема разбивки физической памяти......Page 107
Таблицы страниц ядра......Page 111
Фиксированно отображенные линейные адреса......Page 116
Работа с аппаратным кэшем и TLB-буфером......Page 118
Процессы, облегченные процессы и потоки......Page 123
Дескриптор процесса......Page 125
Состояние процесса......Page 126
Идентификация процесса......Page 128
Взаимоотношения между процессами......Page 136
Как организованы процессы......Page 143
Ограничения на ресурсы процесса......Page 149
Аппаратный контекст......Page 151
Сегмент состояния задачи......Page 152
Выполнение переключения процессов......Page 154
Сохранение и загрузка регистров FPU, MMX и XMM......Page 161
Системные вызовы clone(), fork() и vfork()......Page 166
Потоки ядра......Page 177
Завершение процесса......Page 180
Удаление процессов......Page 183
Глава 4. Прерывания и исключения......Page 187
Роль сигналов прерываний......Page 188
Исключения......Page 189
IRQ и прерывания......Page 191
Исключения......Page 195
Таблица дескрипторов прерываний......Page 198
Аппаратная обработка прерываний и исключений......Page 199
Вложенное выполнение обработчиков исключений и прерываний......Page 202
Шлюзы прерываний, ловушек и системы......Page 204
Предварительная инициализация таблицы IDT......Page 206
Обработка исключений......Page 207
Сохранение регистров для обработчика исключений......Page 209
Вход и выход из обработчика исключений......Page 210
Обработка прерываний......Page 211
Обработка прерываний ввода/вывода......Page 212
Обработка межпроцессорных прерываний......Page 235
Softirq-функции и тасклеты......Page 236
Softirq-функции......Page 238
Тасклеты......Page 245
Рабочие очереди......Page 247
Структуры данных для рабочих очередей......Page 248
Возврат из прерываний и исключений......Page 251
Точки входа......Page 254
Проверка вытеснения в ядре......Page 255
Проверка необходимости перепланирования......Page 256
Обработка висящих сигналов, режима virtual-8086 и пошагового режима......Page 257
Как ядро обслуживает запросы......Page 259
Вытеснение в ядре......Page 260
Когда синхронизация необходима......Page 263
Когда в синхронизации нет необходимости......Page 264
Примитивы синхронизации......Page 265
Процессорные переменные......Page 266
Атомарные операции......Page 267
Барьеры оптимизации и барьеры памяти......Page 270
Спин-блокировки......Page 272
Спин-блокировки чтения/записи......Page 277
Seqlock-блокировки......Page 280
Обновление копии для чтения (RCU)......Page 282
Семафоры......Page 284
Семафоры чтения/записи......Page 289
Completion-блокировки......Page 290
Отключение локальных прерываний......Page 291
Запрет и разрешение функций отложенного выполнения......Page 292
Синхронизация обращений к структурам данных ядра......Page 293
Выбор между спин-блокировками, семафорами и отключением прерываний......Page 295
Глобальная блокировка ядра......Page 301
Семафор для индексного дескриптора......Page 304
Глава 6. Хронометраж......Page 307
Часы реального времени......Page 308
Программируемый таймер интервалов......Page 309
Локальный таймер процессора......Page 311
Высокоточный таймер событий......Page 312
Архитектура хронометрирования в Linux......Page 313
Структуры данных в архитектуре хронометрирования......Page 314
Архитектура хронометрирования в однопроцессорных системах......Page 318
Архитектура хронометрирования в многопроцессорных системах......Page 321
Обновление времени и даты......Page 323
Обновление статистики локального процессора......Page 324
Отслеживание нагрузки на систему......Page 325
Профилирование кода ядра......Page 326
Программные таймеры и функции задержки......Page 327
Динамические таймеры......Page 328
Применение динамических таймеров: системный вызов nanosleep()......Page 335
Функции задержки......Page 337
Системные вызовы time() и gettimeofday()......Page 338
Системный вызов adjtimex()......Page 340
Системные вызовы setitimer() и alarm()......Page 341
Системные вызовы для таймеров POSIX......Page 342
Политика планирования......Page 345
Вытеснение процессов......Page 348
Сколько должен длиться квант времени?......Page 349
Алгоритм планирования......Page 350
Планирование обычных процессов......Page 351
Планирование процессов реального времени......Page 355
Структура runqueue......Page 356
Дескриптор процесса......Page 359
Функция scheduler_tick()......Page 361
Функция try_to_wake_up()......Page 365
Функция recalc_task_prio()......Page 367
Функция schedule()......Page 369
Балансирование очередей на выполнение в многопроцессорных системах......Page 378
Области планирования......Page 380
Функция rebalance_tick()......Page 382
Функция load_balance()......Page 383
Функция move_tasks()......Page 384
Системный вызов nice()......Page 385
Системные вызовы getpriority() и setpriority()......Page 386
Системные вызовы sched_getaffinity() и sched_setaffinity()......Page 387
Системные вызовы, относящиеся к процессам реального времени......Page 388
Управление страничными кадрами......Page 391
Дескрипторы страниц......Page 392
Доступ к неоднородной памяти (NUMA)......Page 395
Зоны памяти......Page 397
Пул зарезервированных страничных кадров......Page 401
Зонный аллокатор страничных кадров......Page 402
Отображение ядром страничных кадров верхней памяти......Page 405
Алгоритм "buddy-система"......Page 413
Кэш страничных кадров процессора......Page 419
Аллокатор зон......Page 422
Slab-аллокатор......Page 427
Дескриптор кэша......Page 429
Дескриптор участка памяти......Page 431
Общие и специальные кэши......Page 432
Интерфейс между slab-аллокатором и зонным аллокатором страничных кадров......Page 434
Выделение участка памяти кэшу......Page 436
Освобождение участка памяти из кэша......Page 437
Дескриптор объекта......Page 438
Окрашивание участков памяти......Page 439
Локальные кэши свободных объектов-участков памяти......Page 441
Выделение объекта в участке......Page 443
Освобождение объекта в участке......Page 445
Объекты общего назначения......Page 447
Пулы памяти......Page 448
Управление несмежными областями памяти......Page 450
Дескрипторы несмежных областей памяти......Page 451
Выделение несмежной области памяти......Page 453
Освобождение несмежной области памяти......Page 457
Глава 9. Адресное пространство процесса......Page 461
Адресное пространство процесса......Page 462
Дескриптор памяти......Page 464
Дескриптор памяти для потоков ядра......Page 468
Области памяти......Page 470
Структуры данных для областей памяти......Page 472
Права доступа к области памяти......Page 475
Работа с областями памяти......Page 479
Выделение интервала линейных адресов......Page 484
Освобождение интервала линейных адресов......Page 488
Обработчик исключения "ошибка обращения к странице"......Page 493
Обработка ошибочного адреса, не входящего в адресное пространство......Page 499
Обработка ошибочного адреса, входящего в адресное пространство......Page 500
Выделение страниц по требованию......Page 503
Копирование при записи......Page 507
Обработка обращений к несмежным областям памяти......Page 510
Создание адресного пространства процесса......Page 512
Удаление адресного пространства процесса......Page 514
Управление кучей......Page 515
API-интерфейсы стандарта POSIX и системные вызовы......Page 519
Обработчик системного вызова и служебные процедуры......Page 521
Выполнение системного вызова с помощью инструкции int $0x80......Page 523
Выполнение системного вызова с помощью инструкции sysenter......Page 526
Передача параметров......Page 532
Проверка параметров......Page 534
Доступ к адресному пространству процесса......Page 536
Динамическая проверка адресов: код обработки исключения......Page 538
Таблицы исключений......Page 539
Генерирование таблицы исключений и кода обработки......Page 540
Интерфейсные процедуры ядра......Page 543
Роль сигналов......Page 545
Действия, выполняемые при доставке сигнала......Page 550
Сигналы POSIX и многопоточные приложения......Page 551
Структуры данных, ассоциированные с сигналами......Page 552
Операции над сигнальными структурами......Page 558
Генерирование сигнала......Page 560
Функция specific_send_sig_info()......Page 561
Функция send_signal()......Page 562
Функция group_send_sig_info()......Page 564
Доставка сигнала......Page 567
Выполнение действия по умолчанию по обработке сигнала......Page 569
Обработка сигнала......Page 571
Повторное выполнение системных вызовов......Page 576
Системный вызов kill()......Page 580
Системные вызовы tkill() и tgkill()......Page 581
Изменение действия сигнала......Page 582
Просмотр висящих заблокированных сигналов......Page 583
Модификация набора заблокированных сигналов......Page 584
Приостановка выполнения процесса......Page 585
Системные вызовы для сигналов реального времени......Page 586
Роль виртуальной файловой системы (VFS)......Page 587
Общая файловая модель......Page 590
Системные вызовы, обрабатываемые VFS......Page 593
Структуры данных VFS......Page 594
Суперблоки......Page 595
Индексный дескриптор......Page 600
Файловые объекты......Page 605
Элемент каталога......Page 610
Кэш элементов каталога......Page 613
Файлы, связанные с процессом......Page 615
Специальные файловые системы......Page 618
Регистрация типа файловой системы......Page 620
Пространства имен......Page 622
Монтирование файловых систем......Page 623
Монтирование типичной файловой системы......Page 627
Монтирование корневой файловой системы......Page 632
Размонтирование файловой системы......Page 635
Анализ пути......Page 636
Стандартный анализ пути......Page 640
Анализ пути к родительскому каталогу......Page 645
Анализ символьных ссылок......Page 647
Системный вызов open()......Page 649
Системные вызовы read() и write()......Page 652
Блокировка файлов......Page 654
Блокировка файлов в Linux......Page 656
Структуры данных для блокировок файлов......Page 657
Блокировки FL_FLOCK......Page 659
Блокировки FL_POSIX......Page 662
Архитектура ввода/вывода......Page 667
Порты ввода/вывода......Page 669
Интерфейсы ввода/вывода......Page 672
Контроллеры устройств......Page 674
Модель драйвера устройства......Page 675
Файловая система sysfs......Page 676
Объекты kobject......Page 677
Компоненты модели драйвера устройства......Page 681
Файлы устройств......Page 687
Работа с файлами устройств в режиме пользователя......Page 689
Работа с файлами устройств в VFS......Page 691
Драйверы устройств......Page 692
Регистрация драйвера устройства......Page 693
Мониторинг операций ввода/вывода......Page 694
Обращение к совместно используемой памяти ввода/вывода......Page 698
Прямой доступ к памяти (DMA)......Page 700
Уровни поддержки ядра......Page 705
Драйверы символьных устройств......Page 707
Присваивание номеров устройств......Page 709
Обращение к драйверу символьного устройства......Page 712
Стратегии буферизации для символьных устройств......Page 713
Глава 14. Драйверы блочных устройств......Page 715
Управление блочными устройствами......Page 716
Секторы......Page 719
Блоки......Page 720
Сегменты......Page 721
Общий слой работы с блочными устройствами......Page 722
Структура bio......Page 723
Представление дисков и разделов на диске......Page 725
Выдача запроса......Page 728
Планировщик ввода/вывода......Page 730
Дескрипторы очередей запросов......Page 731
Дескриптор запросов......Page 734
Активизация драйвера блочного устройства......Page 739
Алгоритмы планирования ввода/вывода......Page 740
Выдача запроса планировщику ввода/вывода......Page 744
Блочные устройства......Page 747
Регистрация и инициализация драйвера устройства......Page 751
Процедура-стратег......Page 755
Обработчик прерываний......Page 758
Открытие файла блочного устройства......Page 759
Глава 15. Кэш страниц......Page 763
Кэш страниц......Page 764
Объект address_space......Page 765
Базисное дерево......Page 769
Функции для работы с кэшем страниц......Page 772
Теги базисного дерева......Page 776
Хранение блоков в кэше страниц......Page 778
Буферы блоков и головы буферов......Page 779
Работа с головами буферов......Page 780
Страницы буферов......Page 781
Выделение страниц буферов блочных устройств......Page 783
Поиск блоков в кэше страниц......Page 785
Передача голов буферов общему слою работы с блочными устройствами......Page 788
Запись грязных страниц на диск......Page 791
Потоки ядра pdflush......Page 792
Поиск грязных страниц для записи на диск......Page 794
Запись старых грязных страниц на диск......Page 799
Системный вызов sync()......Page 800
Системные вызовы fsync() и fdatasync()......Page 801
Глава 16. Работа с файлами......Page 803
Чтение и запись файла......Page 804
Чтение из файла......Page 805
Опережающее чтение файлов......Page 817
Запись в файл......Page 824
Запись грязных страниц на диск......Page 831
Отображение в память......Page 834
Структуры отображения в память......Page 835
Создание отображения в память......Page 837
Выделение страниц по требованию для отображения в память......Page 840
Принудительная запись на диск грязных страниц отображения в память......Page 844
Нелинейные отображения в память......Page 845
Прямой ввод/вывод......Page 847
Асинхронный ввод/вывод......Page 850
Асинхронный ввод/вывод в Linux 2.6......Page 852
Алгоритм утилизации страничных кадров......Page 857
Выбор целевой страницы......Page 858
Описание алгоритма PFRA......Page 861
Обратное отображение......Page 863
Обратное отображение для анонимных страниц......Page 865
Обратное отображение для отображающих страниц......Page 870
Реализация алгоритма PFRA......Page 874
Списки давно неиспользуемых страниц (LRU)......Page 876
Утилизация при дефиците памяти......Page 884
Утилизация страниц сокращаемых кэшей диска......Page 893
Периодическая утилизация......Page 896
Уничтожение процессов из-за нехватки памяти......Page 899
Жетон защиты от выгрузки......Page 901
Подкачка......Page 902
Область подкачки......Page 904
Дескриптор области подкачки......Page 906
Идентификатор выгруженной страницы......Page 909
Перевод области подкачки в активное и неактивное состояние......Page 911
Выделение и освобождение страничного слота......Page 919
Кэш подкачки......Page 922
Выгрузка страниц......Page 926
Загрузка выгруженных страниц......Page 929
Глава 18. Файловые системы Ext2 и Ext3......Page 935
Общие характеристики файловой системы Ext2......Page 936
Структуры Ext2 на диске......Page 939
Суперблок......Page 940
Дескриптор группы и битовая карта......Page 943
Таблица индексных дескрипторов......Page 944
Расширенные атрибуты индексного дескриптора......Page 946
Списки управления доступом......Page 947
Как файлы разных типов используют блоки на диске......Page 948
Структуры Ext2 в памяти......Page 950
Объект-суперблок Ext2......Page 951
Индексный дескриптор Ext2......Page 953
Создание файловой системы Ext2......Page 954
Операции индексного дескриптора Ext2......Page 956
Файловые операции Ext2......Page 958
Управление пространством на диске в Ext2......Page 959
Создание индексных дескрипторов......Page 960
Удаление индексных дескрипторов......Page 963
Адресация блоков данных......Page 964
Дыры в файлах......Page 967
Выделение блоков данных......Page 968
Освобождение блока данных......Page 969
Файловая система Ext3......Page 970
Ext3 — журналируемая файловая система......Page 971
Слой журналирующего блочного устройства......Page 973
Как ведется журнал......Page 977
Глава 19. Взаимодействие процессов......Page 981
Каналы......Page 982
Работа с каналом......Page 983
Структуры данных для канала......Page 985
Создание и уничтожение канала......Page 989
Чтение из канала......Page 990
Запись в канал......Page 993
FIFO-файлы......Page 995
Создание и открытие FIFO-файлов......Page 996
Работа с ресурсом IPC......Page 999
Системный вызов ipc()......Page 1003
Семафоры IPC......Page 1004
Сообщения IPC......Page 1009
Совместно используемая память IPC......Page 1013
Очереди сообщений POSIX......Page 1018
Глава 20. Выполнение программ......Page 1021
Исполняемые файлы......Page 1022
Права и способности процесса......Page 1023
Аргументы командной строки и окружение оболочки......Page 1030
Библиотеки......Page 1031
Сегменты программы и области памяти процесса......Page 1033
Отслеживание выполнения......Page 1038
Форматы исполняемых файлов......Page 1041
Области выполнения......Page 1043
Функции exec......Page 1045
Доисторические времена: BIOS......Page 1053
Античность: загрузчик......Page 1055
Загрузка Linux с диска......Page 1056
Средние века: функция setup()......Page 1057
Эпоха Возрождения: функции startup_32()......Page 1058
Новейшее время: функция start_kernel()......Page 1060
Быть (модулем) или не быть?......Page 1061
Лицензии на модули......Page 1062
Реализация модулей......Page 1063
Счетчики обращений......Page 1066
Зависимости модулей......Page 1067
Подключение и выгрузка модулей......Page 1068
Программа modprobe......Page 1071
Функция request_module()......Page 1072
Предметный указатель......Page 1073
Обложка......Page 1104
Обложка......Page 1105

Polecaj historie