Шрифт:
Буферы и заголовки буферов
Когда блок хранится в памяти (скажем, после считывания или в ожидании записи), то он хранится в структуре данных, называемой буфером (buffer). Каждый буфер связан строго с одним блоком. Буфер играет роль объекта, который представляет блок в оперативной памяти. Вспомним, что блок состоит из одного или больше секторов, но по размеру не может быть больше одной страницы памяти. Поэтому одна страница памяти может содержать один или больше блоков. Поскольку для ядра требуется некоторая управляющая информация, связанная с данными (например, какому блочному устройству и какому блоку соответствует буфер), то каждый буфер связан со своим дескриптором. Этот дескриптор называется заголовком буфера (buffer head) и представляется с помощью структуры
Структура
Рассмотрим эту структуру с комментариями, которые описывают назначение каждого поля.
Поле b_
Таблица 13.1. Значения флагов поля
Флаг состояния | Назначение |
---|---|
BH_Uptodate | Буфер содержит действительные данные |
BH_Dirty | Буфер изменен (содержимое буфера новее соответствующих данных на диске, и поэтому буфер должен быть записан на диск) |
BH_Lock | Для буфера выполняется операция чтения-записи дисковых данных, и буфер заблокирован, чтобы предотвратить конкурентный доступ |
BH_Req | Буфер включен в запрос |
BH_Mapped | Буфер является действительным и отображается на дисковый блок |
BH_New | Буфер только что выделен и к нему еще не было доступа |
BH_Async_Read | Для буфера выполняется асинхронная операция чтения |
BH_Async_Write | Для буфера выполняется асинхронная операция записи |
BH_Delay | С буфером еще не связан дисковый блок |
BH_Boundary | Буфер является последним в последовательности смежных блоков — следующий за ним блок не является смежным с этой серией |
Перечисление
Флаги, которые используются драйверами, могут быть определены на основании значения этого флага, что позволяет гарантированно избежать перекрытия с битами, которые официально используются уровнем блочного ввода-вывода.
Поле
Перед тем как манипулировать заголовком буфера, необходимо увеличить значение счетчика использования с помощью функции