我已经编写了一个简单的char设备驱动程序(mydev),其中包含“open”文件操作。
在用户空间应用程序中,我打开此驱动程序节点。使用open(“/ dev / mydev”,O_RDONLY); open()系统调用在内部调用sys_open()。
我只想了解sys_open()函数如何调用我的驱动程序的打开文件操作。 VFS如何处理它,它在内部调用哪个函数。
答案 0 :(得分:1)
我在第12.5.1节“了解Linux内核”一书中找到了答案
步骤是,
调用getname()从进程地址空间读取文件路径名。
调用get_unused_fd()在current-> files-> fd中查找空槽。该 相应的索引(新文件描述符)存储在fd局部变量中。
调用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.
d。如果访问是用于写入,则检查i_writecount字段的值 inode对象。负值表示文件已经过内存映射, 指定必须拒绝写访问(参见第15.2节) 第15章)。在这种情况下,返回错误代码。任何其他值指定 实际写入文件的进程数。在后一种情况下, 递增计数器。
即初始化文件对象的字段;特别是,将f_op字段设置为inode对象的i_op-> default_file_ops字段的内容。这套 为将来的文件操作提供所有正确的功能。
F。如果定义了(默认)文件操作的open方法,则调用它。
克。清除f_flags中的O_CREAT,O_EXCL,O_NOCTTY和O_TRUNC标志。
小时。返回文件对象的地址。