本该定于周六的时候,分享这篇博文。怎奈双十一定了好多书,周五晚上到的,周六的时候在家全天充电。所以只好今天分享。各位还记得上篇博文有一问题:file->f_op_read指向的函数是哪个?
带着这个问题我们继续:
文件系统(每个注册的文件系统)在内核中用一个类型为file_system_type的结构表示,当开机加载文件系统模块时,内核使用module_init(init_ext2_fs),初始化模块,具体位置在fs/ext2/super.c文件中,如下:
在函数init_ext2_fs()中,通过调用register_filesystem()注册ext2_fs_type,即将ext2_fs_type加入到文件系统的链表中。
看一下ext2_fs_type:
其中的字段get_sb 就是读超级快的函数。
ext2_read_inode函数在文件fs/ext2/inode.c中。
S_ISREG是否是一个常规文件,如果是常规文件,则将ext2_file_operations 变量的地址赋予
inode 对象的 i_fop 成员,那么inode->i_fop.read 函数指针所指向的函数,也就是ext2_file_operations
变量的成员 read 所指向的函数。
ext2_file_operations 变量定义在fs/ext2/file.c文件中,如下图
通过上面的层层分析,可以得出:generic_file_read 函数才是 ext2 层的真实入口。generic_file_read 函数定义在mm/filemap.c文件中。如下: