linux核心之chdir分析
阿新 • • 發佈:2019-02-01
今天我們看一些在linux系統裡邊經常使用的cd命令對應的核心實現,就是sys_chdir函式的實現。
sys_chdir函式在fs/open.c裡,定義如下
然後我們看set_fs_pwd函式,這個函式定義在fs/namespace.c裡,定義如下
從這裡我們就可以看書vfs_lookup是核心裡貫穿檔案系統的一個函式,理解了vfs_lookup函式,就基本上可以說是對於檔案系統有了一個大致的瞭解了。
sys_chdir函式在fs/open.c裡,定義如下
asmlinkage long sys_chdir(const char __user * filename) { /*路徑名查詢函式*/ struct nameidata nd; int error; /*之前我們分析過,根據得到的檔名,找到對應的dentry和mnt結構體放入nameidata結構體裡邊*/ error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY|LOOKUP_CHDIR, &nd); if (error) goto out; /*vfs層許可權檢查,前邊也分析過*/ error = vfs_permission(&nd, MAY_EXEC); if (error) goto dput_and_out; /*主要的工作函式,設定程序當前工作路徑*/ set_fs_pwd(current->fs, nd.mnt, nd.dentry); dput_and_out: /*釋放建立的nameidata結構體*/ path_release(&nd); out: return error; }
然後我們看set_fs_pwd函式,這個函式定義在fs/namespace.c裡,定義如下
void set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, struct dentry *dentry) { /*指向當前程序結構體裡的fs_struct裡的dentry和mnt結構體,就是原來的路徑*/ struct dentry *old_pwd; struct vfsmount *old_pwdmnt; write_lock(&fs->lock); old_pwd = fs->pwd; old_pwdmnt = fs->pwdmnt; /*把程序結構體task_struct裡的pwd和pwdmnt指向新的dentry和vfsmount結構體*/ fs->pwdmnt = mntget(mnt); fs->pwd = dget(dentry); write_unlock(&fs->lock); /*釋放原先的dentry和vfsmount*/ if (old_pwd) { dput(old_pwd); mntput(old_pwdmnt); } }
從這裡我們就可以看書vfs_lookup是核心裡貫穿檔案系統的一個函式,理解了vfs_lookup函式,就基本上可以說是對於檔案系統有了一個大致的瞭解了。