本該定于周六的時候,分享這篇博文。怎奈雙十一定了好多書,周五晚上到的,周六的時候在家全天充電。是以隻好今天分享。各位還記得上篇博文有一問題: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 就是讀超級快的函數。
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檔案中。如下: