Внутри ядра данные ввода/вывода описываются массивом векторов. Каждый вектор ввода/вывода, или 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 выполняется отдельная операция ввода/вывода с обратным вызовом драйвера с одним участком за раз.
- 16/11/2010 03:20 - Службы экспортированных файловых систем
- 15/11/2010 15:49 - Трансляция имен путей
- 14/11/2010 09:58 - Операции vnode
- 12/11/2010 12:38 - Содержимое vnode
- 10/11/2010 06:57 - Интерфейс виртуальной файловой системы
- 09/11/2010 18:56 - Реализация select
- 08/11/2010 02:22 - Мультиплексирование ввода/вывода для дескрипторов
- 04/11/2010 08:33 - Блокировка дескриптора файла
- 03/11/2010 00:01 - Асинхронный ввод/вывод
- 02/11/2010 10:14 - Управление дескрипторами