Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 9


iomove(bp->b_addr + u_pboff, u_pbsize, B_READ);

Функция iomove копирует данные

bp->b_addr[ u_pboff..u_pboff+u_pbsize-1 ]

из адресного пространства ядра (из буфера в ядре) в адресное пространство процесса по адресам

u_base[ 0..u_pbsize-1 ]

то есть пересылает u_pbsize байт между ядром и процессом (u_base попадает в iomove

через статическую переменную). При записи вызовом write(), iomove с флагом B_WRITE

производит обратное копирование - из памяти процесса в память ядра. Продолжим:

// продвинуть счетчики и указатели: u_count -= u_pbsize; u_base += u_pbsize; fp->f_offset += u_pbsize; // RWptr } while( u_count != 0 ); break; ... return( srccount - u_count ); } // end read

Теперь обсудим некоторые места этого алгоритма. Сначала посмотрим, как происходит обращение к байтовому устройству. Вместо адресов блоков мы получаем код устройства i_rdev. Коды устройств в UNIX (тип dev_t) представляют собой пару двух чисел, называемых мажор и минор, хранимых в старшем и младшем байтах кода устройства:

#define major(dev) ((dev >> 8) & 0x7F) #define minor(dev) ( dev & 0xFF)

Мажор обозначает тип устройства (диск, терминал, и.т.п.) и приводит к одному из драйверов (если у нас есть 8 терминалов, то их обслуживает один и тот же драйвер); а минор обозначает номер устройства данного типа (... каждый из терминалов имеет миноры 0..7). Миноры обычно служат индексами в некоторой таблице структур внутри выбранного драйвера. Мажор же служит индексом в переключательной таблице устройств. При этом блочно-ориентированные устройства выбираются в одной таблице - bdevsw[], а байтоориентированные - в другой - cdevsw[] (см. <sys/conf.h>; имена таблиц означают block/character device switch). Каждая строка таблицы содержит адреса функций, выполняющих некоторые предопределенные операции способом, зависимым от устройства. Сами эти функции реализованы в драйверах устройств. Аргументом для этих функций обычно служит минор устройства, к которому производится обращение. Функция в драйвере использует этот минор как индекс для выбора конкретного экземпляра устройства данного типа; как индекс в массиве управляющих структур (содержащих текущее состояние, режимы работы, адреса функций прерываний, адреса очередей данных и.т.п. каждого конкретного устройства) для данного типа устройств. Эти управляющие структуры различны для разных типов устройств (и их драйверов).




Содержание  Назад  Вперед