Общий слой работы с блочными устройствами
Общий слой работы с блочными устройствами является компонентом ядра, который обрабатывает запросы всех блочных устройств в системе. Благодаря его функциям, ядро может:
- помещать буферы данных в верхнюю память — страничные кадры будут отображаться в линейное адресное пространство ядра только тогда, когда центральному процессору нужно обратиться к данным, а сразу после этого отображение будет отменено;
- реализовать (с некоторыми дополнительными усилиями) схему "нуль- копирования", при которой данные с диска помещаются прямо в адресное пространство режима пользователя без предварительного копирования в
память ядра. Фактически буфер, используемый ядром, для ввода/вывода находится на страничном кадре, который отображается в линейное адресное пространство режима пользователя, принадлежащее некоторому процессу;
- управлять логическими томами, например, такими, которые используются в LVM (Logical Volume Manager, Менеджер логических томов) и RAID (Redundant Array of Inexpensive Disks, Избыточный массив недорогих дисков), несколько разделов на диске или даже на разных блочных устройствах видны как один раздел;
- задействовать передовые функции, предлагаемые самыми современными контроллерами дисков — большие встроенные кэши, улучшенный механизм DMA, аппаратное планирование запросов ввода/вывода и т. д.
Структура bio
Основной структурой данных общего слоя работы с блочными устройствами является дескриптор текущей операции ввода/вывода для блочного устройства, который называется bio. Каждый дескриптор bio включает в себя идентификатор для области памяти на диске (номер первого сектора и количество секторов в этой области) и один или несколько сегментов, описывающих области памяти, вовлеченные в операцию ввода/вывода. Дескриптор bio реализован структурой bio Каждый сегмент в bio представлен структурой bio vec Поле bi io vec указывает на первый элемент массива структур bio vec, а поле bi vcnt хранит текущее количество элементов в массиве.
Содержимое дескриптора bio меняется по ходу операции ввода/вывода. Например, если драйвер блочного устройства не может выполнить DMA-
пересылку всех данных вразброс за одну операцию, то поле bi idx обновляется, чтобы драйвер помнил о первом сегменте в bio, который еще не переслан. Для перебора сегментов bio (начиная с текущего, с индексом bi idx) драйвер может ВЫПОЛНИТЬ макрос bio_for_each_segment.
Когда общий слой работы с блочными устройствами начнет новую операцию ввода/вывода, он выделит новую структуру bio с помощью функции bio_aiioc. Обычно структуры bio выделяются slab-аллокатором, но ядро поддерживает небольшой пул памяти, который используется при нехватке оперативной памяти. Ядро поддерживает также и пул для структур bio vec: в конце концов, нет смысла выделять bio, не имея возможности выделить дескрипторы сегментов, которые нужно включить в состав bio. Функция bio put уменьшает счетчик ссылок bio (bi cnt) и, когда счетчик доходит до нуля, освобождает структуру bio и связанные с ней структуры bio_vec.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница