Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг     контакты
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

2.3.5.1. Усложненный механизм заморозки

Если механизм sleep_on()/wake_up() в Linux не удовлетворяет вашим требованиям, вы можете усовершенствовать его. В качестве примера тому можете посмотреть серийный драйвер устройства (/kernel/chr_drv/serial.c), функцию block_til_ready(), которая представляет собой несколько измененные add_wait_queue() и schedule()

2.3.6. VFS

VFS - Virtual Filesystem Switch (Система виртуального переключения файловой системы ) - механизм, позволяющий Linux поддерживать сразу несколько файловых систем. В первой версии Linux доступ к файловой системе осуществляется через подпрограммы, работающие с файловой системой minix. Для обеспечения возможности работы с другой файловой системой ее вызовы переопределяются как функции знакомой Linux системы файлов. Это делается с помощью программы, содержащей структуру указателей на функции, представляющие все возможные действия с файловой системой. Вызывает интерес структура file_operations :

                From /usr/include/linux/fs.h:

      struct file_operations {
          int  (*lseek)   (struct inode *, struct file *, off_t, int);
          int  (*read)    (struct inode *, struct file *, char *, int);
          int  (*write)   (struct inode *, struct file *, char *, int);
          int  (*readdir) (struct inode *, struct file *, struct dirent *,
                           int count);
          int  (*select)  (struct inode *, struct file *, int,
                           select_table *);
          int  (*ioctl)   (struct inode *, struct file *, unsigned int,
                           unsigned int);
          int  (*mmap)    (struct inode *, struct file *, unsigned long,
                           size_t, int, unsigned long);
          int  (*open)    (struct inode *, struct file *);
          void (*release) (struct inode *, struct file *);
      };

Эта структура содержит список функций, нужных для создания драйвера.

2.3.6.1. Функция lseek()

Функция вызывается, когда в специальном файле, представляющем устройство, появляется системный вызов lseek().Это функция перехода текущей позиции на заданное смещение.Ей задается четыре аргумента :

         struct inode * inode
             - Указатель на структуру inode для этого устройства.
         struct file * file
             - Указатель на файловую структуру для данного устройства.
         off_t offset
             - Смещение от ! origin !.
         int origin  0 = смещение от начала.
                     1 = смещение от текущей позиции.
                     2 = смещение от конца. 

lseek() возвращает -errno в случае ошибки или положительное смещение после выполнения.

Если lseek() отсутствует, ядро автоматически изменяет элемент file - f_pos.При origin = 2 в случае file - f_inode = NULL ему присваивается значение -EINVAL,иначе file - fpos принимает значение file - f_inode - i_size + offset.Поэтому в случае возврата ошибки устройства системным вызовом lseek() вы должны использовать функцию lseek для определения этой ошибки.


[ Назад | Оглавление | Далее ]









helloworld.ru © 2001-2021
Все права защищены