1 过程全调试

filp_open()

这里以 filp_open(“/dev/console”); 为例.

file_open_name()

AT_FDCWD 表示当前的工作目录.

alt text

do_filp_open()

alt text

path_openat()

alt text

do_open()

alt text

alt text

vfs_open()

alt text

do_dentry_open()

alt text

取得f_op,这里为 def_chr_fops.

f_op->open为 chrdev_open.

alt text

chrdev_open

alt text

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 基本概念

  1. path walking: 内核要把这个 路径字符串 转换成一个 实际的对象 (struct path → dentry → inode),这个逐级解析路径的过程就叫 path walking.

  2. component: 路径中的一段(由 / 分隔).

  3. last component: 路径中的最后一段,通常是目标文件/目录/链接名.