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