sys_open是如何工作的?

问题描述:

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

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

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

我发现在了解Linux内核的书的答案,在部分12.5.1

操作步骤,

  1. 调用的getName()来读取进程的地址空间中的文件路径名。

  2. 调用get_unused_fd()在current-> files-> fd中查找一个空插槽。 对应的索引(新文件描述符)存储在fd局部变量中。

  3. 调用filp_open()函数,以参数的形式传递路径名,访问模式标志和权限位掩码 。该功能依次执行以下步骤: 步骤:

    a。调用get_empty_filp()来获得一个新的文件对象。

    b。根据标志和模式参数值 设置文件对象的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.2中的第15.2节)。在这种情况下,返回一个错误代码。任何其他值都指定实际写入文件的进程数量为 。在后一种情况下, 递增计数器。

    e。初始化文件对象的字段;特别是将f_op字段设置为inode对象的i_op-> default_file_ops字段的内容。这将为将来的文件操作设置所有正确的功能。 f。如果定义了(默认)文件操作的打开方法,则调用它。 g。清除f_flags中的O_CREAT,O_EXCL,O_NOCTTY和O_TRUNC标志。 h。返回文件对象的地址。

  4. 将current-> files-> fd [fd]设置为文件对象的地址。
  5. 返回fd。