как работает sys_open?

Я написал простой драйвер устройства char (mydev) с операцией «открыть» файл.

В приложении пользовательского пространства я открываю этот узел драйвера. используя open("/dev/mydev", O_RDONLY); Системный вызов open() внутренне вызывает sys_open().

Я просто хочу знать, как функция sys_open() вызывает операцию открытия файла моего драйвера. Как VFS справляется с этим, какую функцию она вызывает внутри.


person beparas    schedule 20.07.2012    source источник


Ответы (1)


Я нашел ответ в книге Understanding Linux Kernel, в разделе 12.5.1.

Шаги есть,

  1. Вызывает функцию getname() для чтения пути к файлу из адресного пространства процесса.

  2. Вызывает get_unused_fd(), чтобы найти пустой слот в current->files->fd. Соответствующий индекс (новый файловый дескриптор) хранится в локальной переменной fd.

  3. Вызывает функцию filp_open(), передавая в качестве параметров имя пути, флаги режима доступа и битовую маску разрешения. Эта функция, в свою очередь, выполняет следующие шаги:

    а. Вызывает get_empty_filp() для получения нового файлового объекта.

    б. Устанавливает поля f_flags и f_mode файлового объекта в соответствии со значениями параметров флагов и режимов.

    в. Вызывает функцию open_namei(), которая выполняет следующие операции:

       i. Invokes lookup_dentry( ) to interpret the file pathname and gets the
          dentry object associated with the requested file.
    
       ii. Performs a series of checks to verify whether the process is permitted
          to open the file as specified by the values of the flags parameter. If so,
          returns the address of the dentry object; otherwise, returns an error code.
    

    д. Если доступ предназначен для записи, проверяет значение поля i_writecount объекта inode. Отрицательное значение означает, что файл был сопоставлен с памятью, указывая, что доступ для записи должен быть запрещен (см. Раздел 15.2 в Главе 15). В этом случае возвращает код ошибки. Любое другое значение указывает количество процессов, которые фактически выполняют запись в файл. В последнем случае увеличивает счетчик.

    е. Инициализирует поля файлового объекта; в частности, устанавливает в поле f_op содержимое поля i_op->default_file_ops объекта inode. Это устанавливает все правильные функции для будущих операций с файлами.

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

    грамм. Очищает флаги O_CREAT, O_EXCL, O_NOCTTY и O_TRUNC в f_flags.

    час Возвращает адрес файлового объекта.

  4. Устанавливает current->files->fd[fd] в адрес файлового объекта.
  5. Возвращает фд.
person beparas    schedule 20.07.2012