sys_open如何工作?

问题描述 投票:0回答:1

我已经编写了一个简单的char设备驱动程序(mydev),其中包含“open”文件操作。

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

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

linux-device-driver system-calls
1个回答
2
投票

我在第12.5.1节中找到了解Linux内核本书的答案

步骤是,

  1. 调用getname()以从进程地址空间读取文件路径名。
  2. 调用get_unused_fd()在current-> files-> fd中查找空槽。相应的索引(新文件描述符)存储在fd局部变量中。
  3. 调用filp_open()函数,将路径名,访问模式标志和权限位掩码作为参数传递。反过来,该函数执行以下步骤: 一个。调用get_empty_filp()以获取新的文件对象。 湾根据flags和modes参数的值设置文件对象的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节)。在这种情况下,返回错误代码。任何其他值指定实际写入文件的进程数。在后一种情况下,递增计数器。 即初始化文件对象的字段;特别是,将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。
© www.soinside.com 2019 - 2024. All rights reserved.