我先从sys_read入手,然后进入了函数vsf_read,在rw_verify_area()和 security_file_permission()处纠缠了很久(最后还是几乎无功而返),之后就遇到了 file->f_op->read()和do_sync_read()。
由于file->f_op->read()与具体的文件系统有关,于是我就先进入了do_sync_read(),在这里面 遇到了kiocb结构和filp->f_op->aio_read()函数,这又有具体的文件系统有关,在do_sync_read()中又 与wait_on_retry_sync_kiocb()、wait_on_sync()及EIOCBRETY、EIOCBQUEUE纠缠了一段时间。
借助《深入理解linux内核》我找到了与ext2文件系统中与度有关的函数generic_file_read(),这个函数再调用__generic_file_read()函数。
__generic_file_read()在文件设置了O_DIRECT时调用generic_file_direct_IO,否则调用 do_generic_file_read()函数,但函数do_generic_file_read()有个参数是函数 file_read_actor()。
接下来,阅读generic_file_direct_IO的代码,这里会用到 mapping->a_ops->direct_IO()函数,又是个不定的值,ext2文件系统应该是ext2_direct_IO,于是 我又看到了ext2_direct_IO代码。
ext2_direct_IO()函数调用blockdev_direct_IO,其中有个参数是ext2_get_block,这个函数参数用来确定文件系统的逻辑块号。
blockdev_dirdec_IO直接调用__blockdev_direct_IO(),而暂时就看到这里。
我今天看代码时,发现《深入理解linux内核》对文件系统和文件的读写都做了详细的介绍,主要是因为自己太浮躁了,没看多少就开始看代码了,以至于进度太慢了,还是先静下心来把书中的内容看完比较好。
此外,在看代码的过程中,一开始我没理清思路。不应该深入看每个被调用的函数,这样会主次不分,我觉得应该跟着被传输的数据走,才能更好的理清数据传输的流程。至于其他的代码理解它们的作用就应该可以了吧。