1

我编写了一个简单的字符设备驱动程序(mydev),其中包含“打开”文件操作。

在用户空间应用程序中,我打开此驱动程序节点。使用 open("/dev/mydev", O_RDONLY); open() 系统调用在内部调用 sys_open()。

我只想知道sys_open()函数如何调用我的驱动程序的打开文件操作。VFS 如何处理这个,它在内部调用哪个函数。

4

1 回答 1

4

我在《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 字段。

    C。调用 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.
    

    d。如果访问是用于写入,则检查 inode 对象的 i_writecount 字段的值。负值表示文件已被内存映射,指定必须拒绝写访问(参见第 15 章中的第 15.2 节)。在这种情况下,返回错误代码。任何其他值指定实际写入文件的进程数。在后一种情况下,递增计数器。

    e. 初始化文件对象的字段;特别是,将 f_op 字段设置为 inode 对象的 i_op->default_file_ops 字段的内容。这为将来的文件操作设置了所有正确的功能。

    F。如果定义了(默认)文件操作的 open 方法,则调用它。

    G。清除 f_flags 中的 O_CREAT、O_EXCL、O_NOCTTY 和 O_TRUNC 标志。

    H。返回文件对象的地址。

  4. 将 current->files->fd[fd] 设置为文件对象的地址。
  5. 返回 fd 。
于 2012-07-20T13:16:53.057 回答