Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Внешние интерфейсы модуля | Вперед |
Блочные устройства
Блочные устройства во многом наследуют технику символьных устройств, детально рассматриваемых на примерах ранее, но должны отрабатывать и дополнительные возможности API, связанные с произвольным (не последовательным) доступом. Регистраций таких устройств производится отдельным API:
int register_blkdev( unsigned major, const char* );
void unregister_blkdev( unsigned major, const char* );
Но главное отличие, от рассмотренного выше, состоит в использовании в качестве таблицы функций , реализующих операции, вместо struct file_operations используется struct block_device_operations (ищите её в <linux/blkdev.h>):
struct block_device_operations { int (*open) ( struct block_device *, fmode_t ); int (*release) ( struct gendisk *, fmode_t ); int (*locked_ioctl) ( struct block_device *, fmode_t, unsigned, unsigned long ); int (*ioctl) ( struct block_device *, fmode_t, unsigned, unsigned long ); int (*compat_ioctl) ( struct block_device *, fmode_t, unsigned, unsigned long ); int (*direct_access) ( struct block_device *, sector_t, void **, unsigned long * ); int (*media_changed) ( struct gendisk * ); unsigned long long (*set_capacity) ( struct gendisk *, unsigned long long ); int (*revalidate_disk) ( struct gendisk * ); int (*getgeo)( struct block_device *, struct hd_geometry * ); struct module *owner; };
Но смысл и логика основных шагов при разработке драйвера блочного устройства остаётся той же. Разработка модулей поддержки блочных устройства является крайне редкой необходимостью для сторонних разработчиков (не самих производителей нового устройства прямого доступа), поэтому детально здесь не рассматривается, тем более, что она как ничто другое хорошо описана в литературе.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Неблокирующий ввод-вывод и мультиплексирование | Интерфейс /proc |