Linux kernel open()系统调用被传输到内核模块的原因是什么?

Linux kernel open()系统调用被传输到内核模块的原因是什么?,linux-kernel,kernel,linux-device-driver,Linux Kernel,Kernel,Linux Device Driver,我正在写一个字符设备驱动程序。在我在互联网上找到的示例代码中,提到我们需要将一些文件操作附加到这个字符设备。在这些文件操作中,有一个函数名为open。但在那次公开呼吁中,没有任何重大行动。 但是如果我们想使用这个字符设备,首先我们需要打开这个设备,然后只有我们才能在上面读/写任何东西。所以我想知道open()调用到底是如何工作的。以下是我所指的字符设备驱动程序链接: 用户端的open()序列非常简单:它将在内核路径上调用sys\u open(),将执行一些路径解析和权限检查,然后将其得到的所有内

我正在写一个字符设备驱动程序。在我在互联网上找到的示例代码中,提到我们需要将一些文件操作附加到这个字符设备。在这些文件操作中,有一个函数名为open。但在那次公开呼吁中,没有任何重大行动。 但是如果我们想使用这个字符设备,首先我们需要打开这个设备,然后只有我们才能在上面读/写任何东西。所以我想知道
open()
调用到底是如何工作的。以下是我所指的字符设备驱动程序链接:

用户端的
open()
序列非常简单:它将在内核路径上调用
sys\u open()
,将执行一些路径解析和权限检查,然后将其得到的所有内容都传递到
dev\u open()
(并且不会执行任何其他操作)

dev_open()
获取通过
open()
系统调用传递给它的参数(+相当多的特定于内核vfs子系统的信息,但这很少引起关注)

请注意,您将获得传入的
struct file
参数。它有几个有用的字段:

struct file {
   ....
   struct path        f_path; // path of the file passed to open()
   ....
   unsigned int       f_flags; // 'flags' + 'mode' as passed to open()
   fmode_t            f_mode;  // 'mode' as set by kernel (FMODE_READ/FMODE_WRITE)
   loff_t             f_pos;   // position in file used by _llseek
   struct fown_struct f_owner; // opening process credentials, like uid and euid
   ....
}

剩下的你可以通过查看源代码中的示例来挖掘自己。

实际上,我想知道它是如何获取文件描述符的。它从
path\u openat()
中调用
get\u empty\u filp()
,恰好位于/fs/namei.c中
get\u empty\u filp()
本质上是对内核malloc的调用+一些初始化和限制检查代码。除此之外什么都不会发生,没有更多的魔法。