Linux Kernel (Ядро линукса) (часть 2)


Управление блочными устройствами

В каждой операции с драйвером блочного устройства задействовано множество компонентов ядра. Предположим, например, что процесс сделал системный вызов read о для некоторого файла на диске (мы вскоре убедимся, что запросы на запись обрабатываются практически так же). Как правило, чтобы обслужить запрос процесса, ядро предпринимает следующие шаги:
1. Служебная процедура системного вызова read о активизирует соответствующую функцию VFS, передавая ей дескриптор файла и смещение внутри файла. Виртуальная файловая система является верхним слоем в архитектуре управления блочными устройствами. Она предоставляет общую файловую модель, принятую всеми файловыми системами, поддерживаемыми в Linux. Мы подробно описали слой виртуальной файловой системы
2. Функция виртуальной файловой системы определяет, доступны ли запрошенные данные, и, если потребуется, как именно должна быть выполнена
операция чтения. Иногда нет необходимости в обращении к диску, потому что ядро хранит в оперативной памяти данные, недавно прочитанные с блочного устройства (или записанные на него).
Предположим, что ядро должно прочитать данные с блочного устройства, т. е. оно должно определить физическое местонахождение данных. Эту задачу оно решает с помощью слоя отображения, который в типичном случае выполняет следующие действия:
- он определяет размер блока файловой системы, содержащей данный файл, и вычисляет объем запрошенных данных в терминах номеров блоков файла. Файл считается разбитым на множество блоков, и ядро выясняет номера (индексы относительно начала файла) блоков, содержащих запрошенные данные;
- затем слой отображения вызывает специфичную для файловой системы функцию, которая читает индексный дескриптор файла и определяет позицию запрошенных данных на диске в терминах номеров логических блоков. Диск считается разбитым на множество блоков, и ядро выясняет номера (индексы относительно начала диска или раздела) блоков, содержащих запрошенные данные. Поскольку файл может храниться не в смежных блоках диска, структура, хранящаяся в индексном дескрипторе, отображает номер каждого блока файла в номер логического блока1.
Теперь ядро может выполнять операцию чтения с блочного устройства. Для этого оно использует общий слой работы с блочными устройствами, который запускает операции ввода/вывода для пересылки запрошенных данных. Вообще, каждая операция ввода/вывода затрагивает группу смежных блоков на диске. Поскольку запрошенные данные необязательно хранятся в соседних блоках, общий слой работы с блочными устройствами, возможно, будет должен запустить несколько операций ввода/вывода. Каждая такая операция представлена структурой bio (сокр. от "block I/O", блочный ввод/вывод), которая собирает всю информацию, необходимую нижним слоям для удовлетворения запроса.

Общий слой работы с блочными устройствами скрывает особенности любого аппаратного блочного устройства, предлагая абстрактный взгляд на блочные устройства. Поскольку почти все они являются дисками, общий слой работы с блочными устройствами содержит некоторые общие структуры данных, описывающие диски и разделы на дисках. Мы обсудим этот слой и структуру bio в разд. "Общий слой работы с блочными устройствами" далее в этой главе.
Под общим слоем работы с блочными устройствами расположен планировщик ввода/вывода. Он сортирует невыполненные запросы на пересылку данных в соответствии с заранее определенной политикой ядра. Целью планировщика является группирование запросов по принципу близости расположения запрошенных данных на физическом носителе. Мы опишем этот слой в разд. "Планировщик ввода/вывода " далее в этой главе.

Наконец, драйверы блочных устройств берут на себя работу по фактической пересылке данных, отдавая команды аппаратным интерфейсам контроллеров диска. Общая организация типичного драйвера блочного устройства разъясняется в разд. "Драйверы блочных устройств” далее в этой главе.
Как видите, существует множество компонентов ядра, имеющих дело с данными, хранящимися в блочных устройствах, и каждый из них управляет порциями данных определенной длины.
- Контроллеры аппаратных блочных устройств передают данные порциями фиксированной длины, называемыми секторами. То есть планировщик ввода/вывода и драйверы блочных устройств должны оперировать секторами данных.
- Виртуальная файловая система, слой отображения и файловые системы группируют данные на диске в логические единицы, называемые блоками. Блок соответствует минимальной единице памяти на диске в данной файловой системе.
- Как мы вскоре убедимся, драйверы блочных устройств должны уметь обращаться с сегментами” данных. Каждый сегмент является страницей памяти или частью страницы и включает в себя порции данных, расположенные на диске по соседству.
- Кэши диска работают со страницами”, каждая из которых совпадает по размеру со страничным кадром.
- Общий слой работы с блочными устройствами склеивает” все верхние и нижние компоненты. Таким образом, он знает и о секторах, и о блоках, и о сегментах, и о страницах.

Даже при наличии большого количества разных порций данных они располагаются в одних и тех же ячейках оперативной памяти.
показана схема 4096-байтовой страницы. Верхние компоненты ядра воспринимают страницу как состоящую из четырех буферов по 1024 байтов. Последние три блоки страницы передаются драйвером блочного устройства и записываются в сегмент, занимающий последние 3072 байта страницы. Контроллер жесткого диска считает, что сегмент состоит из шести секторов по 512 байтов.

В этой главе мы опишем нижние компоненты ядра, управляющие блочными устройствами: общий слой работы с блочными устройствами, планировщик ввода/вывода и драйверы устройств. При этом мы, естественно, коснемся секторов, блоков и сегментов.

Предыдущая страница | 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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...