1 过程全调试
filp_open()
这里以 filp_open(“/dev/console”); 为例.
file_open_name()
AT_FDCWD 表示当前的工作目录.
/image.png)
do_filp_open()
/image-1.png)
path_openat()
/image-2.png)
do_open()
/image-3.png)
/image-4.png)
vfs_open()
/image-5.png)
do_dentry_open()
/image-6.png)
取得f_op,这里为 def_chr_fops.
f_op->open为 chrdev_open.
/image-7.png)
chrdev_open
/image-8.png)
2 总结
2.1 全过程
调用 open 接口,通过 path walking 拿到 last component 的 inode,之后进入vfs_open,填充file结构体,如果file->f_op->open被填充就继续执行该设备层的open函数,否则返回。
随后在driver层继续通过 i_rdev 获取设备的信息,如果设备层的f_fop有open,函数,则继续执行驱动层的open.
2.2 基本概念
path walking: 内核要把这个 路径字符串 转换成一个 实际的对象 (struct path → dentry → inode),这个逐级解析路径的过程就叫 path walking.
component: 路径中的一段(由 / 分隔).
last component: 路径中的最后一段,通常是目标文件/目录/链接名.