Драйвер “memory”: чтение устройства |
Предыдущая Содержание Следующая |
Для чтения устройства функцией пользователя fread или аналогичной, существует член read структуры file_operations, используемый в вызове register_chrdev. На этот раз это функция memory_read. Её аргументы: структура типа file; буфер (buf), из которого будет читать функция пользовательского пространства (fread); счётчик с числом байтов для передачи (count), который имеет такое же значение, как и обычный счётчик в функции пользовательского пространства (fread); и, наконец, позиция, с которой начинается чтение файла (f_pos). В этом простом случае функция memory_read передаёт один байт из буфера драйвера (memory_buffer) в пользовательское пространство с помощью функции copy_to_user:
<memory read> =
ssize_t memory_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) {
/* Передаём данные в пространство пользователя */ copy_to_user(buf,memory_buffer,1);
/* Изменяем позицию чтения, как это необходимо */ if (*f_pos == 0) { *f_pos+=1; return 1; } else { return 0; } }
Также изменяется позиция чтения в файле (f_pos). Если позиция находится в начале файла, она увеличивается на единицу, и количество байт, которые были надлежащим образом прочитаны, отдаётся в качестве возвращаемого значения, 1. Если не в начале файла, возвращается конец файла (0), так как файл сохраняет только один байт.
Теперь эта функция добавлена в Таблицу 7.
Таблица 7. События драйвера устройства и связанные с ними интерфейсные функции в пространстве ядра и пользовательском пространстве.
| |||||||||||||||||||||
Предыдущая Содержание Следующая |