Структура bio

Структура bio

Основным контейнером для операций ввода-вывода в ядре является структура bio, которая определена в файле <linux/bio.h>. Эта структура представляет активные операции блочного ввода-вывода в виде списка сегментов (segment). Сегмент — это участок буфера, который является непрерывным в физической памяти, т.е. отдельные буферы не обязательно должны быть непрерывными в физической памяти. Благодаря тому, что буфер может представляться в виде нескольких участков, структура bio даст возможность выполнять операции блочного ввода-вывода, даже если данные одного буфера хранятся в разных местах памяти. Ниже показана структура bio с комментариями, описывающими назначение каждого поля.

struct bio {

 sector_t            bi_sector; /* соответствующий сектор на диске */

 struct bio          *bi_next;         /* список запросов */

 struct block_device *bi_bdev;  /* соответствующее блочное устройство */

 unsigned long       bi_flags;         /* состояние и флаги команды */

 unsigned long       bi_rw;            /* чтение или запись? */

 unsigned short      bi_vcnt;          /* количество структур bio vec

                                          в массиве bi_io_vec */

 unsigned short      bi_idx;    /* текущий индекс в массиве bi_io_vec */

 unsigned short      bi_phys_segments; /* количество сегментов

                                          после объединения */

 unsigned short      bi_hw_segments;   /* количество сегментов после

                                          перестройки отображения */

 unsigned int        bi_size;          /* объем данных для ввода-вывода */

 unsigned int        bi_hw_front_size; /* размер первого

                                          объединяемого сегмента */

 unsigned int        bi_hw_front_size; /* размер последнего объединяемого

                                          сегмента */

 unsigned int        bi_max_vecs;      /* максимально возможное количество

                                          структур bio_vecs */

 struct bio_vec      *bi_io_vec;       /* массив структур bio_vec */

 bio_end_io_t        *bi_end_io;       /* метод завершения ввода-вывода */

 atomic_t            bi_cnb;           /* счетчик использования */

 void                *bi_private;      /* поле для информации создателя */

 bio_destructor_t    *bi_destructor;   /* деструктор */

};

Главное назначение структуры bio — это представление активной (выполняющейся) операции блочного ввода-вывода. В связи с этим большинство полей этой структуры являются служебными. Наиболее важные поля — это bi_io_vecs, bi_vcnt и bi_idx.

Поле bi_io_vecs указывает на начало массива структур bio_vec. Эти структуры используются в качестве списка отдельных сегментов в соответствующей операции блочного ввода-вывода. Каждый экземпляр структуры bio_vec представляет собой вектор следующего вида: <страница памяти, смещение, размер>, который описывает определенный сегмент, соответственно страницу памяти, где этот сегмент хранится, положение блока — смещение внутри страницы — и размер блока. Массив рассмотренных векторов описывает весь буфер полностью. Структура bio_vec определена в файле <linux/bio.h> следующим образом.

struct bio_vec {

 /* указатель на страницу физической памяти, где находится этот буфер */

 struct page *bv_page;

 /* размер буфера в байтах */

 unsigned int bv_len;

 /* смещение в байтах внутри страницы памяти, где находится буфер */

 unsigned int bv_offset;

};

Для каждой операции блочного ввода-вывода создается массив из bi_vcnt элементов типа bio_vec, начало которого содержится в поле bi_io_vecs. В процессе выполнения операции блочного ввода-вывода поле bi_idx используется для указания на текущий элемент массива.

В общем, каждый запрос на выполнение блочного ввода-вывода представляется с помощью структуры bio. Каждый такой запрос состоит из одного или более блоков, которые хранятся в массиве структур bio_vec. Каждая из этих структур представляет собой вектор, который описывает положение в физической памяти каждого сегмента запроса. На первый сегмент для операции ввода-вывода указывает поле bi_io_vec. Каждый следующий сегмент следует сразу за предыдущим. Всего в массиве bi_vcnt сегментов. В процессе того, как уровень блочного ввода-вывода обрабатывает сегменты запроса, обновляется значение поля bi_idx, чтобы его значение соответствовало номеру текущего сегмента. На рис. 13.2 показана связь между структурами bio, bio_vec и page.

Рис. 13.2. Связь между структурами struct bio, struct bio_vec и struct page

Поле bi_idx указывает на текущую структуру bio_vec в массиве, что позволяет уровню блочного ввода-вывода поддерживать частично выполненные операции блочного ввода-вывода. Однако более важное использование состоит в том, что драйверы таких устройств, как RAID (Redundant Array of Inexpensive/Independent Disks, массив недорогих/независимых дисковых устройств с избыточностью — специальный способ использования жестких дисков, при котором один логический том может быть распределен но нескольким физическим дискам для увеличения надежности или производительности), могут одну структуру bio, которая изначально была адресована одному устройству, разбивать на несколько частей, которые предназначаются различным дискам RAID массива. Все, что необходимо сделать драйверу RAID, это создать необходимое количество копий структуры bio, которая предназначалась одному устройству, и изменить для каждой копии значение поля bi_idx, чтобы оно указывало на ту часть массива, откуда каждый диск должен начать свою операцию ввода-вывода.

Структура bio содержит счетчик использования, который хранится в поле bi_cnt. Когда значение этого поля становится равным нулю, структура удаляется, и занятая память освобождается. Следующие две функции позволяют управлять счетчиком использования.

void bio_get(struct bio *bio);

void bio_put(struct bio *bio);

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

И наконец, поле bio_private — это поле данных создателя (владельца) структуры. Как правило, это поле необходимо считывать или записывать только тому, кто создал данный экземпляр структуры bio.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Структура книги

Из книги Блеск и нищета информационных технологий. Почему ИТ не являются конкурентным преимуществом автора Карр Николас Дж.


8.1.1. Структура

Из книги Как писать драйвера автора Компьютеры Автор неизвестен -

8.1.1. Структура Это – структура, которой следуют все сценарии в этом руководстве. Если вы обнаружите, что это не так, то скорее всего это моя ошибка, если конечно я не объяснил, почему я нарушил эту структуру.1. Configuration – Прежде всего мы должны задать параметры конфигурации,


Структура книги

Из книги Word 2007.Популярный самоучитель автора Краинский И

Структура книги Книга содержит три части. Первая часть состоит из глав 1-3 с предварительными сведениями о базах данных, языке SQL и сервере баз данных SQL Server. Эти фундаментальные сведения позволят читателю познакомиться с основными концепциями и понятиями, используемыми в


Структура

Из книги Создание шаблонов Joomla автора Автор неизвестен

Структура Режим Структура используется при создании больших документов, насыщенных заголовками и подзаголовками (рис. 2.60). Для работы с этим режимом нужно, чтобы документ был отформатирован при помощи стилей (см. разд. 4.7), иначе этот режим в работе помочь не сможет. Рис.


Структура

Из книги Photoshop. Лучшие фильтры автора Бондаренко Сергей

Структура Так как вы имеете дело с отображением структурированных данных, необходимо определится с общим размещением. Обычно Joomla! использует структуру размещения элементов показанную ниже: Рис. 1: СтруктураСекция 1:  Часть 1: Тут стоит разместить логотип или название


Структура книги

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Структура книги В главах 2–8 фильтры сгруппированы по компаниям-производителям. Нередко подключаемые модули, выпускаемые одним и тем же разработчиком, дополняют друг друга и могут использоваться вместе. Примером может служить набор инструментов для корректировки


3.3. Структура ipc_perm

Из книги Интернет – легко и просто! автора Александров Егор

3.3. Структура ipc_perm Для каждого объекта IPC, как для обычного файла, в ядре хранится набор информации, объединенной в структуру.struct ipc_perm { uid_t uid; /*идентификатор пользователя владельца*/ gid_t gid; /*идентификатор группы владельца */ uid_t cuid; /*идентификатор пользователя


Структура

Из книги Фотоприколы с помощью Photoshop автора Гурский Юрий Анатольевич

Структура Первое, с чего следует начинать планирование, – это структура сайта. Структура главным образом определяется содержимым сайта и должна обеспечивать удобство доступа к нужной информации. Если неправильно выбрать структуру, то пользователь может очень быстро


Структура

Из книги Видеосамоучитель создания реферата, курсовой, диплома на компьютере автора Баловсяк Надежда Васильевна

Структура Одно из основных отличий хорошего резюме от плохого – это лаконичность. Работодатели – люди, как правило, занятые, а писем, подобных вашему, им предстоит прочесть не один десяток, и тратить свое время на изучение вашей подробной биографии они наверняка не будут.


Структура книги

Из книги Разработка ядра Linux автора Лав Роберт

Структура книги Первая часть книги – теоретическая, она содержит тот базовый набор знаний, без которых работать с программой невозможно. Вы познакомитесь с самыми важными понятиями компьютерной графики, узнаете, зачем в Photoshop так много непонятных и страшных (на первый


1.2. Структура работы

Из книги автора

1.2. Структура работы Дипломная и курсовая работы должны состоять из следующих разделов.1. Титульный лист.2. Содержание.3. Список условных сокращений (при необходимости).4. Введение.5. Основная часть.6. Выводы.7. Список используемых источников.8. Приложения (при


12.3. Структура работы

Из книги автора

12.3. Структура работы Обычно структура курсовой или дипломной работы детально описана в методических указаниях к выполнению, которые можно получить в любом вузе. Однако такие работы состоят из набора общих компонентов, о которых будет рассказано ниже.Аннотация. Обычно


Структура bio

Из книги автора

Структура bio Основным контейнером для операций ввода-вывода в ядре является структура bio, которая определена в файле <linux/bio.h>. Эта структура представляет активные операции блочного ввода-вывода в виде списка сегментов (segment). Сегмент — это участок буфера, который