2.3.6.5. Функция ioctl()
Функция ioctl() осуществляет функцию передачи контроля ввода/вывода. Структура вашей функции должна быть следующей: первичная проверка ошибок, затем переключение, дающее вам право контролировать все ioctl. Номер ioctl находится в аргументе cmd, аргумент контролируемой команды находится в arg. Для работы с ioctl() вы должны иметь подробное представление о контроле над вводом/выводом. Если вы сомневаетесь в правильности использования ioctl(), спросите кого-нибудь, так как эта функция в текущий момент может оказаться ненужной. Так как ioctl() является частью интерфейса драйверов, вам придется уделить ей внимание.
- struct inode * inode
- Указатель на inode структуру данного устройства;
- struct file * file
- Указатель на файловую структуру устройства;
- unsigned int cmd
- Команда, над которой осуществляется контроль;
- unsigned int arg
- Это аргумент для команды, определяется пользователем. В случае, если он вида (void *), он может быть использован как указатель на область пользователя, обычно находящуюся в регистре fs.
- Возвращаемое значение :
-errno в случае ошибки, все другие значения определяются пользователем.
Если слот ioctl() в file_operations не заполнен, VFS возвращает значение -EINVAL, однако в любом другом случае, кесли cmd принимант одно из значений - FIOCLEX, FIONCLEX,FIONBIO, FIOASYNC, будет происходить следующее:
- FIOCLEX 0x5451
Устанавливает бит "закрытие для запуска"
- FIONCLEX 0x5450
Очищает бит "закрытие для запуска"
- FIONBIO 0x5421
Если аргумент не равен 0, устанавливает O_NONBLOCK, иначе очищает O_NONBLOCK.
- FIOASYNC 0x5421
Если аргумент не равен 0, устанавливает O_SYNC, иначе очищает O_SYNC. Пока еще не описано, но для полноты вставлено в ядро.
Помните, что вам надо учитывать эти четыре номера при написании своих ioctl(), так как они могут быть несовместимы между собой, откуда в программе может возникнуть тяжело обнаруживаемая ошибка.
2.3.6.6. Функция mmap()
- struct inode *inode
- Указатель на inode
- struct file *file
- Указатель на файловую структуру
- unsigned long addr
- Начальный адрес блока, используемого mmap()
- size_t len - Общая длина блока.
- int prot - Принимает значения:
PROT_READ читаемый кусок PROT_WRITE перезаписываемый кусок PROT_EXEC кусок, доступный для запуска PROT_NONE недоступный кусок
- unsigned long off
- Внутрифайловое смещение, от которого производится перестановка. Этот адрес будет переставлен на адрес addr.
[В описании распределения памяти описано, как функции интерфейса Менеджера виртуальной памяти могут быть использованы mmap().]
2.3.6.7. Функции open() и release()
- struct inode *inode
- Указатель на inode
- struct file *file
- Указатель на файловую структуру
Функция вызывается после открытия специальных файлов устройств. Она является механизмом слежения за последовательностью выполняемых действий. Если устройством пользуется лишь один процесс, функция open() закроет устройство любым доступным в данный момент способом, обычно устанавливая нужный бит в положение "занято". Если процесс уже использует устройство (бит уже установлен), open() возвращает -EBUSY.
Если же устройство необходимо нескольким процессам, эта функция обладает возможностью любой очередности.
Если устройство не существует, open() вернет -ENODEV.
Функция release() вызывается лишь тогда, когда процесс закрывает последний файловый дескриптор. release() может переустанавливать бит "занято". После вызова release(), вы можете очистить куски выделенной kmalloc() памятью под очереди процессов.
[ Назад | Оглавление | Далее ]
|