1 过程全调试
filp_open()
这里以 filp_open(“/dev/console”); 为例.
file_open_name()
AT_FDCWD 表示当前的工作目录.
do_filp_open()
path_openat()
do_open()
vfs_open()
do_dentry_open()
取得f_op,这里为 def_chr_fops.
f_op->open为 chrdev_open.
chrdev_open
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: 路径中的最后一段,通常是目标文件/目录/链接名.