Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Обзор системы ввода/вывода Перемещение данных внутри ядра

Перемещение данных внутри ядра

Внутри ядра данные ввода/вывода описываются массивом векторов. Каждый вектор ввода/вывода, или iovec\ имеет базовый адрес и размер. Эти векторы ввода/вывода идентичны векторам ввода/вывода, использующимся системными вызовами readv и writev.

Ядро поддерживает другую структуру, называемую структурой uio, которая содержит дополнительные сведения об операции ввода/вывода. Пример структуры uio показан на рисунке ниже; она содержит следующее.

· Указатель на массив iovec.

· Число элементов в массиве iovec.

· Смещение в файле, с которого должна начаться операция. Сумма размеров векторов ввода/вывода.

· Флаг, указывающий, находились ли источник и место назначения оба внутри ядра, или они разнесены между пространством пользователя и ядром.

· Флаг, указывающий, копируются ли данные из структуры uio в ядро или из ядра в структуру uio (UIOREAD).

· Указатель на поток, область данных которого описывается структурой uio (указатель равен NULL, если структура uio описывает область внутри ядра).

Весь ввод/вывод внутри ядра описывается структурами iovec и uio. Системные вызовы, такие, как read и write, которым не передается iovec, создают uio для описания своих аргументов; эта структура uio передается нижележащим уровням ядра для указания параметров операции ввода/вывода. В конечном счете структура uio достигает той части ядра, которая отвечает за перемещение данных в и из адресного пространства процесса: файловой системы, сети или драйвера устройства. Вообще эти части ядра не интерпретируют структуру uio непосредственно. Вместо этого они организуют буфер ядра для хранения данных, а затем используют uiomove() для копирования данных в или из буфера или буферов, описываемых структурой uio. Процедура xdomove() вызывается с указателем на область данных ядра, объемом данных и структурой uio. Когда она перемещает данные, она обновляет счетчики и указатели структур iovec и uio на соответствующие величины. Если буфер ядра не настолько большой, как области, описываемые структурой uio, структура uio будет указывать на часть адресного пространства сразу за расположением, заполненным последним. Таким образом, при обслуживании запроса ядро может вызывать uiomove() несколько раз, каждый раз предоставляя указатель на новый буфер ядра для следующего блока данных.

Драйверы символьных устройств, которые, как правило, не копируют данные из процесса, не интерпретируют структуру uio. Вместо этого имеется одна низкоуровневая процедура ядра, которая организует прямую передачу в или из адресного пространства процесса. В этом случае для каждого элемента iovec выполняется отдельная операция ввода/вывода с обратным вызовом драйвера с одним участком за раз.


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 62 гостей онлайн

Реклама на сайте:

Slando продажа земельных участков дач в Воронеже.

Доставка, доставка в день заказа margaroli полотенцесушители в москве.

Рейтинг инверторные кондиционеры преимущества набор.