Драйвер “memory”: чтение устройства

Предыдущая  Содержание  Следующая V*D*V

Для чтения устройства функцией пользователя 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.

 

События

Пользовательские функции

Функции ядра

Загрузка модуля

insmod

module_init()

Открытие устройства

fopen

file_operations: open

Чтение устройства

fread

file_operations: read

Запись в устройство

 

 

Закрытие устройства

fclose

file_operations: release

Удаление модуля

rmmod

module_exit()

 

Таблица 7. События драйвера устройства и связанные с ними интерфейсные функции в пространстве ядра и пользовательском пространстве.

 

Предыдущая  Содержание  Следующая