在閱讀源代碼的時候,經常會發現在跟蹤函數調用時跟蹤不下去了,如result = dir->i_op->lookup(parent_inode, child_dentry, nd);
這類似于C++中的多态。inode_operations中的lookup函數指針具體指向哪個函數,不是在編譯時确定的,而是在運作期确定的。具體地說,就是在從磁盤上讀入inode時才對對應inode的inode_operations結構體指派。在ext2_read_inode()中
inode->i_fop = &ext2_file_operations;
也就是在inode對象建立的同時也對inode對應的操作進行了綁定。
但是為了确定函數指針具體指向的是哪一個函數,而去找函數指針的指派的地方,未免有些麻煩。而通過核心變量的命名規則猜測對應的函數倒不失為一個好辦法。在這個例子中,我們使用的檔案系統是ext2。于是猜測lookup對應的函數是ext2_lookup。很幸運,我們猜對了。為了保證擴充性,核心中使用了大量的函數指針,采用了大量的“動态綁定”。在這種情況下,總結一下核心變量的命名規則是很有必要的。
我個人認為變量的命名是很重要的,因為這關系到代碼的可讀性。通常每個公司都有自己的一套變量命名規範。比較有名的有微軟的匈牙利命名法,以及Unix應用程式的命名方式。Linux核心采用的是Unix應用程式的命名方式,标志符通常采用“小寫加下劃線”的方式。
sys_+系統調用名:是系統調用在核心中的入口處理函數如sys_fork(),因為所有的socket通信相關的系統調都通過sys_socketcall,是以他們的命名形式也像普通系統調用一樣。如sys_socket,sys_bind等等,
do_+系統調用/中斷操作名等等:具體的處理函數,如do_fork(被sys_fork,sys_vfork,sys_clone調用),do_page_fault,do_mmap.
vfs_+VFS相關的系統調用名:第二層的處理函數,如vfs_read,vfs_write,vfs_ioctrl。
檔案系統函數方面:
檔案系統名稱_+操作名:該檔案系統對應的操作。如ext2_lookup對應inode_operations中的lookup操作。
檔案系統名稱_+接口名:該檔案系統針對該接口實作的操作:如
ext2_file_operations。當然,實際情況比較複雜,如ext2中對inode的操作又分為普通檔案的inode(ext2_file_inode_operations),目錄檔案的inode(ext2_dir_inode_operations),特殊檔案如裝置檔案的inode(ext2_special_inode_operations)等等。
結構體名稱縮寫_+成員變量名:結構體成員變量的命名,如inode的成員變量前面都有i_,dentry的成員變量前面都有d_,super_block的為s,file的為f等等。
一些縮寫,有助于了解變量的含義。nr:number
bh:bottom half
ops:operations如f_ops,i_ops
在新版本的核心代碼裡,一些縮寫開始用完整的單詞來代替。這使代碼的可讀性進一步提高。