Перейти на главную   
  helloworld.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
Все права защищены