锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 銆銆鏈枃闃愯堪 Linux 涓殑鏂囦歡緋葷粺閮ㄥ垎錛屾簮浠g爜鏉ヨ嚜鍩轟簬 IA32 鐨?2.4.20 鍐呮牳銆傛諱綋涓婅 Linux 涓嬬殑鏂囦歡緋葷粺涓昏鍙垎涓轟笁澶у潡錛氫竴鏄笂灞傜殑鏂囦歡緋葷粺鐨勭郴緇熻皟鐢紝浜屾槸铏氭嫙鏂囦歡緋葷粺 VFS(Virtual Filesystem Switch)錛屼笁鏄寕杞藉埌 VFS 涓殑鍚勫疄闄呮枃浠剁郴緇燂紝渚嬪 ext2錛宩ffs 絳夈傛湰鏂囦晶閲嶄簬閫氳繃鍏蜂綋鐨勪唬鐮佸垎鏋愭潵瑙i噴 Linux 鍐呮牳涓?VFS 鐨勫唴鍦ㄦ満鍒訛紝鍦ㄨ繖榪囩▼涓細娑夊強鍒頒笂灞傛枃浠剁郴緇熻皟鐢ㄥ拰涓嬪眰瀹為檯鏂囦歡緋葷粺鐨勫浣曟寕杞姐傛枃绔犺瘯鍥句粠涓涓瘮杈冮珮鐨勮搴︽潵瑙i噴 Linux 涓嬬殑 VFS 鏂囦歡緋葷粺鏈哄埗銆?/p>
銆銆1. 鎽樿 銆銆鏈枃闃愯堪 Linux 涓殑鏂囦歡緋葷粺閮ㄥ垎錛屾簮浠g爜鏉ヨ嚜鍩轟簬 IA32 鐨?2.4.20 鍐呮牳銆傛諱綋涓婅 Linux 涓嬬殑鏂囦歡緋葷粺涓昏鍙垎涓轟笁澶у潡錛氫竴鏄笂灞傜殑鏂囦歡緋葷粺鐨勭郴緇熻皟鐢紝浜屾槸铏氭嫙鏂囦歡緋葷粺 VFS(Virtual Filesystem Switch)錛屼笁鏄寕杞藉埌 VFS 涓殑鍚勫疄闄呮枃浠剁郴緇燂紝渚嬪 ext2錛宩ffs 絳夈傛湰鏂囦晶閲嶄簬閫氳繃鍏蜂綋鐨勪唬鐮佸垎鏋愭潵瑙i噴 Linux 鍐呮牳涓?VFS 鐨勫唴鍦ㄦ満鍒訛紝鍦ㄨ繖榪囩▼涓細娑夊強鍒頒笂灞傛枃浠剁郴緇熻皟鐢ㄥ拰涓嬪眰瀹為檯鏂囦歡緋葷粺鐨勫浣曟寕杞姐傛枃绔犺瘯鍥句粠涓涓瘮杈冮珮鐨勮搴︽潵瑙i噴 Linux 涓嬬殑 VFS 鏂囦歡緋葷粺鏈哄埗錛屾墍浠ュ湪鍙欒堪涓洿渚ч噸浜庢暣涓ā鍧楃殑涓昏剦緇滐紝鑰屼笉鎷樻償浜庣粏鑺傦紝鍚屾椂閰嶆湁鑻ュ共寮犳彃鍥撅紝浠ュ府鍔╄鑰呯悊瑙c?/p>
銆銆鐩稿鏉ヨ錛孷FS 閮ㄥ垎鐨勪唬鐮佹瘮杈冪箒鐞愬鏉傦紝甯屾湜璇昏呭湪闃呰瀹屾湰鏂囦箣鍚庯紝鑳藉 Linux 涓嬬殑 VFS 鏁翠綋榪愪綔鏈哄埗鏈変釜娓呮鐨勭悊瑙c傚緩璁鑰呭湪闃呰鏈枃鍓嶏紝鍏堝皾璇曠潃鑷繁闃呰涓涓嬫枃浠剁郴緇熺殑婧愪唬鐮侊紝浠ヤ究寤虹珛璧?Linux 涓嬫枃浠剁郴緇熸渶鍩烘湰鐨勬蹇碉紝姣斿鑷沖皯搴旂啛鎮?super block, dentry, inode錛寁fsmount 絳夋暟鎹粨鏋勬墍琛ㄧず鐨勬剰涔夛紝榪欐牱鍐嶆潵闃呰鏈枃浠ヤ究鍔犳繁鐞嗚В銆?/p>
銆銆2. VFS 姒傝堪 銆銆VFS 鏄竴縐嶈蔣浠舵満鍒訛紝涔熻縐板畠涓?Linux 鐨勬枃浠剁郴緇熺鐞嗚呮洿紜垏鐐癸紝涓庡畠鐩稿叧鐨勬暟鎹粨鏋勫彧瀛樺湪浜庣墿鐞嗗唴瀛樺綋涓傛墍浠ュ湪姣忔緋葷粺鍒濆鍖栨湡闂達紝Linux 閮介鍏堣鍦ㄥ唴瀛樺綋涓瀯閫犱竴媯?VFS 鐨勭洰褰曟爲(鍦?Linux 鐨勬簮浠g爜閲岀О涔嬩負 namespace)錛屽疄闄呬笂渚挎槸鍦ㄥ唴瀛樹腑寤虹珛鐩稿簲鐨勬暟鎹粨鏋勩俈FS 鐩綍鏍戝湪 Linux 鐨勬枃浠剁郴緇熸ā鍧椾腑鏄釜寰堥噸瑕佺殑姒傚康錛屽笇鏈涜鑰呬笉瑕佸皢鍏朵笌瀹為檯鏂囦歡緋葷粺鐩綍鏍戞販娣嗭紝鍦ㄧ瑪鑰呯湅鏉ワ紝VFS 涓殑鍚勭洰褰曞叾涓昏鐢ㄩ旀槸鐢ㄦ潵鎻愪緵瀹為檯鏂囦歡緋葷粺鐨勬寕杞界偣錛屽綋鐒跺湪 VFS 涓篃浼氭秹鍙婂埌鏂囦歡綰х殑鎿嶄綔錛屾湰鏂囦笉闃愯堪榪欑鎯呭喌銆備笅鏂囨彁鍒扮洰褰曟爲鎴栫洰褰曪紝濡傛灉涓嶇壒鍒鏄庯紝鍧囨寚 VFS 鐨勭洰褰曟爲鎴栫洰褰曘傚浘 1 鏄竴縐嶅彲鑳界殑鐩綍鏍戝湪鍐呭瓨涓殑褰卞儚錛?/p>
銆銆鍥?1錛歏FS 鐩綍鏍戠粨鏋?/p>
銆銆 銆銆3. 鏂囦歡緋葷粺鐨勬敞鍐?/p>
銆銆榪欓噷鐨勬枃浠剁郴緇熸槸鎸囧彲鑳戒細琚寕杞藉埌鐩綍鏍戜腑鐨勫悇涓疄闄呮枃浠剁郴緇燂紝鎵璋撳疄闄呮枃浠剁郴緇燂紝鍗蟲槸鎸嘨FS 涓殑瀹為檯鎿嶄綔鏈緇堣閫氳繃瀹冧滑鏉ュ畬鎴愯屽凡錛屽茍涓嶆剰鍛崇潃瀹冧滑涓瀹氳瀛樺湪浜庢煇縐嶇壒瀹氱殑瀛樺偍璁懼涓娿傛瘮濡傚湪絎旇呯殑 Linux 鏈哄櫒涓嬪氨娉ㄥ唽鏈?"rootfs"銆?proc"銆?ext2"銆?sockfs" 絳夊崄鍑犵鏂囦歡緋葷粺銆?/p>
銆銆3.1 鏁版嵁緇撴瀯 銆銆鍦?Linux 婧愪唬鐮佷腑錛屾瘡縐嶅疄闄呯殑鏂囦歡緋葷粺鐢ㄤ互涓嬬殑鏁版嵁緇撴瀯琛ㄧず錛?/p>
銆銆娉ㄥ唽榪囩▼瀹為檯涓婂皢琛ㄧず鍚勫疄闄呮枃浠剁郴緇熺殑 struct file_system_type 鏁版嵁緇撴瀯鐨勫疄渚嬪寲錛岀劧鍚庡艦鎴愪竴涓摼琛紝鍐呮牳涓敤涓涓悕涓?file_systems 鐨勫叏灞鍙橀噺鏉ユ寚鍚戣閾捐〃鐨勮〃澶淬?/p>
銆銆3.2 娉ㄥ唽 rootfs 鏂囦歡緋葷粺 銆銆鍦ㄤ紬澶氱殑瀹為檯鏂囦歡緋葷粺涓紝涔嬫墍浠ュ崟鐙粙緇?rootfs 鏂囦歡緋葷粺鐨勬敞鍐岃繃紼嬶紝瀹炲湪鏄洜涓鴻鏂囦歡緋葷粺 VFS 鐨勫叧緋誨お榪囧瘑鍒囷紝濡傛灉璇?ext2/ext3 鏄?Linux 鐨勬湰鍦熸枃浠剁郴緇燂紝閭d箞 rootfs 鏂囦歡緋葷粺鍒欐槸 VFS 瀛樺湪鐨勫熀紜銆備竴鑸枃浠剁郴緇熺殑娉ㄥ唽閮芥槸閫氳繃 module_init 瀹忎互鍙?do_initcalls() 鍑芥暟鏉ュ畬鎴?璇昏呭彲閫氳繃闃呰module_init 瀹忕殑澹版槑鍙?archi386vmlinux.lds 鏂囦歡鏉ョ悊瑙h繖涓榪囩▼)錛屼絾鏄?rootfs 鐨勬敞鍐屽嵈鏄氳繃 init_rootfs() 榪欎竴鍒濆鍖栧嚱鏁版潵瀹屾垚錛岃繖鎰忓懗鐫 rootfs 鐨勬敞鍐岃繃紼嬫槸 Linux 鍐呮牳鍒濆鍖栭樁孌典笉鍙垎鍓茬殑涓閮ㄥ垎銆?/p>
銆銆init_rootfs() 閫氳繃璋冪敤 register_filesystem(&rootfs_fs_type) 鍑芥暟鏉ュ畬鎴?rootfs 鏂囦歡緋葷粺娉ㄥ唽鐨勶紝鍏朵腑rootfs_fs_type 瀹氫箟濡備笅錛?/p>
銆銆娉ㄥ唽涔嬪悗鐨?file_systems 閾捐〃緇撴瀯濡備笅鍥?鎵紺猴細 銆銆鍥?2: file_systems 閾捐〃緇撴瀯 銆銆 銆銆4. VFS 鐩綍鏍戠殑寤虹珛 銆銆鏃㈢劧鏄爲錛屾墍浠ユ牴鏄叾璧栦互瀛樺湪鐨勫熀紜錛屾湰鑺傞槓榪?Linux 鍦ㄥ垵濮嬪寲闃舵鏄浣曞緩绔嬫牴緇撶偣鐨勶紝鍗?"/"鐩綍銆傝繖鍏朵腑浼氬寘鎷寕杞?rootfs 鏂囦歡緋葷粺鍒版牴鐩綍 "/" 鐨勫叿浣撹繃紼嬨傛瀯閫犳牴鐩綍鐨勪唬鐮佹槸鍦?init_mount_tree錛堬級 鍑芥暟 錛坒s amespace.c錛?涓?/p>
銆銆棣栧厛錛宨nit_mount_tree() 鍑芥暟浼氳皟鐢?do_kern_mount("rootfs", 0, "rootfs", NULL) 鏉ユ寕杞藉墠闈㈠凡緇忔敞鍐屼簡鐨?rootfs 鏂囦歡緋葷粺銆傝繖鐪嬭搗鏉ヤ技涔庢湁鐐瑰鎬紝鍥犱負鏍規嵁鍓嶉潰鐨勮娉曪紝浼間箮鏄簲璇ュ厛鏈夋寕杞界洰褰曪紝鐒跺悗鍐嶅湪鍏朵笂鎸傝澆鐩稿簲鐨勬枃浠剁郴緇燂紝鐒惰屾鏃?VFS 浼間箮騫舵病鏈夊緩绔嬪叾鏍圭洰褰曘傛病鍏崇郴錛岃繖鏄洜涓鴻繖閲屾垜浠皟鐢ㄧ殑鏄?do_kern_mount()錛岃繖涓嚱鏁板唴閮ㄨ嚜鐒朵細鍒涘緩鎴戜滑鏈鍏沖績涔熸槸鏈鍏抽敭鐨勬牴鐩綍(鍦?Linux 涓紝鐩綍瀵瑰簲鐨勬暟鎹粨鏋勬槸 struct dentry)銆?/p>
銆銆鍦ㄨ繖涓満鏅噷錛宒o_kern_mount() 鍋氱殑宸ヤ綔涓昏鏄細 銆銆1錛夎皟鐢?alloc_vfsmnt() 鍑芥暟鍦ㄥ唴瀛橀噷鐢寵浜嗕竴鍧楄綾誨瀷鐨勫唴瀛樼┖闂達紙struct vfsmount *mnt錛夛紝騫跺垵濮嬪寲鍏墮儴鍒嗘垚鍛樺彉閲忋?/p>
銆銆2) 璋冪敤 get_sb_nodev錛堬級 鍑芥暟鍦ㄥ唴瀛樹腑鍒嗛厤涓涓秴綰у潡緇撴瀯 (struct super_block) sb錛屽茍鍒濆鍖栧叾閮ㄥ垎鎴愬憳鍙橀噺錛屽皢鎴愬憳 s_instances 鎻掑叆鍒?rootfs 鏂囦歡緋葷粺綾誨瀷緇撴瀯涓殑 fs_supers 鎸囧悜鐨勫弻鍚戦摼琛ㄤ腑銆?/p>
銆銆3) 閫氳繃 rootfs 鏂囦歡緋葷粺涓殑 read_super 鍑芥暟鎸囬拡璋冪敤 ramfs_read_super() 鍑芥暟銆傝繕璁板緱褰撳垵娉ㄥ唽rootfs 鏂囦歡緋葷粺鏃訛紝鍏舵垚鍛?read_super 鎸囬拡鎸囧悜浜?ramfs_read_super() 鍑芥暟錛屽弬瑙佸浘2. 銆銆4) ramfs_read_super() 鍑芥暟璋冪敤 ramfs_get_inode() 鍦ㄥ唴瀛樹腑鍒嗛厤浜嗕竴涓?inode 緇撴瀯 (struct inode) inode錛屽茍鍒濆鍖栧叾閮ㄥ垎鎴愬憳鍙橀噺錛屽叾涓瘮杈冮噸瑕佺殑鏈?i_op銆乮_fop 鍜?i_sb錛?/p>
銆銆榪欎嬌寰楀皢鏉ラ氳繃鏂囦歡緋葷粺璋冪敤瀵?VFS 鍙戣搗鐨勬枃浠舵搷浣滅瓑鎸囦護灝嗚 rootfs 鏂囦歡緋葷粺涓浉搴旂殑鍑芥暟鎺ュ彛鎵鎺ョ銆?/p>
銆銆鍥? 銆銆 銆銆5) ramfs_read_super() 鍑芥暟鍦ㄥ垎閰嶅拰鍒濆鍖栦簡 inode 緇撴瀯涔嬪悗錛屼細璋冪敤 d_alloc_root() 鍑芥暟鏉ヤ負 VFS鐨勭洰褰曟爲寤虹珛璧峰叧閿殑鏍圭洰褰?(struct dentry)dentry錛屽茍灝?dentry 涓殑 d_sb 鎸囬拡鎸囧悜 sb錛宒_inode 鎸囬拡鎸囧悜 inode銆?/p>
銆銆6) 灝?mnt 涓殑 mnt_sb 鎸囬拡鎸囧悜 sb錛宮nt_root 鍜?mnt_mountpoint 鎸囬拡鎸囧悜 dentry錛岃?mnt_parent鎸囬拡鍒欐寚鍚戣嚜韜?/p>
銆銆榪欐牱錛屽綋 do_kern_mount() 鍑芥暟榪斿洖鏃訛紝浠ヤ笂鍒嗛厤鍑烘潵鐨勫悇鏁版嵁緇撴瀯鍜?rootfs 鏂囦歡緋葷粺鐨勫叧緋誨皢濡備笂鍥?3 鎵紺恒傚浘涓?mnt銆乻b銆乮node銆乨entry 緇撴瀯鍧椾笅鏂圭殑鏁板瓧琛ㄧず瀹冧滑鍦ㄥ唴瀛橀噷琚垎閰嶇殑鍏堝悗欏哄簭銆傞檺浜庣瘒騫呯殑鍘熷洜錛屽悇緇撴瀯涓彧緇欏嚭浜嗛儴鍒嗘垚鍛樺彉閲忥紝璇昏呭彲浠ュ鐓ф簮浠g爜鏍規嵁鍥句腑鎵紺烘寜鍥劇儲楠ワ紝浠ュ姞娣辯悊瑙c?/p>
銆銆鏈鍚庯紝init_mount_tree() 鍑芥暟浼氫負緋葷粺鏈寮濮嬬殑榪涚▼(鍗?init_task 榪涚▼)鍑嗗瀹冪殑榪涚▼鏁版嵁鍧椾腑鐨刵amespace 鍩燂紝涓昏鐩殑鏄皢 do_kern_mount() 鍑芥暟涓緩绔嬬殑 mnt 鍜?dentry 淇℃伅璁板綍鍦ㄤ簡 init_task 榪涚▼鐨勮繘紼嬫暟鎹潡涓紝榪欐牱鎵鏈変互鍚庝粠 init_task 榪涚▼ fork 鍑烘潵鐨勮繘紼嬩篃閮藉厛澶╁湴緇ф壙浜嗚繖涓淇℃伅錛屽湪鍚庨潰鐢╯ys_mkdir 鍦?VFS 涓垱寤轟竴涓洰褰曠殑榪囩▼涓紝鎴戜滑鍙互鐪嬪埌榪欓噷涓轟粈涔堣榪欐牱鍋氥備負榪涚▼寤虹珛 namespace 鐨勪富瑕佷唬鐮佸涓嬶細 銆銆璇ユ浠g爜鐨勬渶鍚庝袱琛屼究鏄皢 do_kern_mount() 鍑芥暟涓緩绔嬬殑 mnt 鍜?dentry 淇℃伅璁板綍鍦ㄤ簡褰撳墠榪涚▼鐨?fs緇撴瀯涓?/p>
銆銆浠ヤ笂璁蹭簡涓澶у爢鏁版嵁緇撴瀯鐨勬潵鍘嗭紝鍏跺疄鏈緇堢洰鐨勪笉榪囨槸瑕佸湪鍐呭瓨涓緩绔嬩竴棰?VFS 鐩綍鏍戣屽凡錛屾洿紜垏鍦拌錛?init_mount_tree() 榪欎釜鍑芥暟涓?VFS 寤虹珛浜嗘牴鐩綍 "/"錛岃屼竴鏃︽湁浜嗘牴錛岄偅涔堣繖媯墊暟灝卞彲浠ュ彂灞曞.澶э紝姣斿鍙互閫氳繃緋葷粺璋冪敤 sys_mkdir 鍦ㄨ繖媯墊爲涓婂緩绔嬫柊鐨勫彾瀛愯妭鐐圭瓑錛屾墍浠ョ郴緇熻璁¤呭張灝?rootfs 鏂囦歡緋葷粺鎸傝澆鍒頒簡榪欐5鏍戠殑鏍圭洰褰曚笂銆傚叧浜?rootfs 榪欎釜鏂囦歡緋葷粺錛岃鑰呭鏋滅湅涓涓嬪墠闈㈠浘 2 涓畠鐨刦ile_system_type 緇撴瀯錛屼細鍙戠幇瀹冪殑涓涓垚鍛樺嚱鏁版寚閽?read_super 鎸囧悜鐨勬槸 ramfs_read_super錛屽崟浠庤繖涓嚱鏁板悕縐頒腑鐨?ramfs錛岃鑰呭ぇ姒傝兘鐚滄祴鍑鴻繖涓枃浠舵墍娑夊強鐨勬枃浠舵搷浣滈兘鏄拡瀵瑰唴瀛樹腑鐨勬暟鎹璞★紝浜嬪疄涓婁篃鐨勭‘濡傛銆備粠鍙︿竴涓搴﹁岃█錛屽洜涓?VFS 鏈韓灝辨槸鍐呭瓨涓殑涓涓暟鎹璞★紝鎵浠ュ湪鍏朵笂鐨勬搷浣滀粎闄愪簬鍐呭瓨錛岄偅涔熸槸闈炲父鍚堜箮閫昏緫鐨勪簨銆傚湪鎺ヤ笅鏉ョ殑绔犺妭涓紝鎴戜滑浼氱敤涓涓叿浣撶殑渚嬪瓙鏉ヨ璁哄浣曞埄鐢?rootfs鎵鎻愪緵鐨勫嚱鏍戜負 VFS 澧炲姞涓涓柊鐨勭洰褰曡妭鐐廣?/p>
銆銆VFS 涓悇鐩綍鐨勪富瑕佺敤閫旀槸涓轟互鍚庢寕杞芥枃浠剁郴緇熸彁渚涙寕杞界偣銆傛墍浠ョ湡姝g殑鏂囦歡鎿嶄綔榪樻槸瑕侀氳繃鎸傝澆鍚庣殑鏂囦歡緋葷粺鎻愪緵鐨勫姛鑳芥帴鍙f潵榪涜銆?/p>
銆銆5. VFS 涓嬬洰褰曠殑寤虹珛 銆銆涓轟簡鏇村ソ鍦扮悊瑙?VFS錛屼笅闈㈡垜浠敤涓涓疄闄呬緥瀛愭潵鐪嬬湅 Linux 鏄浣曞湪 VFS 鐨勬牴鐩綍涓嬪緩绔嬩竴涓柊鐨勭洰褰?"/dev" 鐨勩?/p>
銆銆瑕佸湪 VFS 涓緩绔嬩竴涓柊鐨勭洰褰曪紝棣栧厛鎴戜滑寰楀璇ョ洰褰曡繘琛屾悳绱紝鎼滅儲鐨勭洰鐨勬槸鎵懼埌灝嗚寤虹珛鐨勭洰褰曞叾鐖剁洰褰曠殑鐩稿叧淇℃伅錛屽洜涓?鐨箣涓嶅瓨錛屾瘺灝嗙剦闄?銆傛瘮濡傝寤虹珛鐩綍 /home/ricard錛岄偅涔堥鍏堝繀欏繪部鐩綍璺緞榪涜閫愬眰鎼滅儲錛屾湰渚嬩腑鍏堜粠鏍圭洰褰曟壘璧鳳紝鐒跺悗鍦ㄦ牴鐩綍涓嬫壘鍒扮洰褰?home錛岀劧鍚庡啀寰涓嬶紝渚挎槸瑕佹柊寤虹殑鐩綍鍚?ricard錛岄偅涔堝墠闈㈣寰楄鍏堝鐩綍鎼滅儲錛屽湪璇ヤ緥涓究鏄鎵懼埌 ricard 榪欎釜鏂扮洰褰曠殑鐖剁洰褰曪紝涔熷氨鏄?home 鐩綍鎵瀵瑰簲鐨勪俊鎭?/p>
銆銆褰撶劧錛屽鏋滄悳绱㈢殑榪囩▼涓彂鐜伴敊璇紝姣斿瑕佸緩鐩綍鐨勭埗鐩綍騫朵笉瀛樺湪錛屾垨鑰呭綋鍓嶈繘紼嬪茍鏃犵浉搴旂殑鏉冮檺絳夌瓑錛岃繖縐嶆儏鍐電郴緇熷繀鐒朵細璋冪敤鐩稿叧榪囩▼榪涜澶勭悊錛屽浜庢縐嶆儏鍐碉紝鏈枃鐣ヨ繃涓嶆彁銆?/p>
銆銆Linux 涓嬬敤緋葷粺璋冪敤 sys_mkdir 鏉ュ湪 VFS 鐩綍鏍戜腑澧炲姞鏂扮殑鑺傜偣銆傚悓鏃朵負閰嶅悎璺緞鎼滅儲錛屽紩鍏ヤ簡涓嬮潰涓涓暟鎹粨鏋勶細 銆銆榪欎釜鏁版嵁緇撴瀯鍦ㄨ礬寰勬悳绱㈢殑榪囩▼涓敤鏉ヨ褰曠浉鍏充俊鎭紝璧風潃綾諱技"璺爣"鐨勪綔鐢ㄣ傚叾涓墠涓ら」涓殑 dentry璁板綍鐨勬槸瑕佸緩鐩綍鐨勭埗鐩綍鐨勪俊鎭紝mnt 鎴愬憳鎺ヤ笅鏉ヤ細瑙i噴鍒般傚悗涓夐」璁板綍鐨勬槸鎵鏌ユ壘璺緞鐨勬渶鍚庝竴涓妭鐐?鍗沖緟寤虹洰褰曟垨鏂囦歡)鐨勪俊鎭?鐜板湪涓哄緩绔嬬洰褰?"/dev" 鑰岃皟鐢?sys_mkdir("/dev", 0700)錛屽叾涓弬鏁?0700 鎴戜滑涓嶅幓綆″畠錛屽畠鍙槸闄愬畾灝嗚寤虹珛鐨勭洰褰曠殑鏌愮妯″紡銆俿ys_mkdir 鍑芥暟棣栧厛璋冪敤 path_lookup("/dev", LOOKUP_PARENT, &nd)錛涙潵瀵硅礬寰勮繘琛屾煡鎵撅紝鍏朵腑 nd 涓?struct nameidata nd 澹版槑鐨勫彉閲忋傚湪鎺ヤ笅鏉ョ殑鍙欒堪涓紝鍥犱負鍑芥暟璋冪敤鍏崇郴鐨勭箒鐞愶紝涓轟簡紿佸嚭榪囩▼涓葷嚎錛屽皢涓嶅啀涓ユ牸鎸夌収鍑芥暟鐨勮皟鐢ㄥ叧緋繪潵榪涜鎻忚堪銆?/p>
銆銆path_lookup 鍙戠幇 "/dev" 鏄互 "/" 寮澶達紝鎵浠ュ畠浠庡綋鍓嶈繘紼嬬殑鏍圭洰褰曞紑濮嬪線涓嬫煡鎵撅紝鍏蜂綋浠g爜濡備笅錛?/p>
銆銆璁板緱鍦?init_mount_tree() 鍑芥暟鐨勫悗鍗婃鏇劇粡灝嗘柊寤虹珛鐨?VFS 鏍圭洰褰曠浉鍏充俊鎭褰曞湪浜?init_task 榪涚▼鐨勮繘紼嬫暟鎹潡涓紝閭d箞鍦ㄨ繖涓満鏅噷錛宯d->mnt 渚挎寚鍚戜簡鍥?3 涓?mnt 鍙橀噺錛宯d->dentry 渚挎寚鍚戜簡鍥?3 涓殑 dentry 鍙橀噺銆?/p>
銆銆鐒跺悗璋冪敤鍑芥暟 path_walk 鎺ョ潃寰涓嬫煡鎵撅紝鎵懼埌鏈鍚庨氳繃鍙橀噺 nd 榪斿洖鐨勪俊鎭槸 nd.last.name="dev"錛宯d.last.len=3錛宯d.last_type=LAST_NORM錛岃嚦浜?nd 涓?mnt 鍜?dentry 鎴愬憳錛屽湪榪欎釜鍦烘櫙閲岃繕鏄墠闈㈣緗殑鍊鹼紝騫舵棤鍙樺寲銆傝繖鏍蜂竴鍦堜笅鏉ワ紝鍙槸鐢?nd 璁板綍涓嬬浉鍏充俊鎭紝瀹為檯鐨勭洰褰曞緩绔嬪伐浣滃茍娌℃湁鐪熸灞曞紑錛屼絾鏄墠闈㈡墍鍋氱殑宸ヤ綔鍗翠負鎺ヤ笅鏉ュ緩绔嬫柊鐨勮妭鐐規敹闆嗕簡蹇呰鐨勪俊鎭?/p>
銆銆濂斤紝鍒版涓烘鐪熸寤虹珛鏂扮洰褰曡妭鐐圭殑宸ヤ綔灝嗕細灞曞紑錛岃繖鏄敱鍑芥暟 lookup_create 鏉ュ畬鎴愮殑錛岃皟鐢ㄨ繖涓嚱鏁版椂浼氫紶鍏ヤ袱涓弬鏁幫細lookup_create(&nd, 1)錛涘叾涓弬鏁?nd 渚挎槸鍓嶉潰鎻愬埌鐨勫彉閲忥紝鍙傛暟1琛ㄦ槑瑕佸緩绔嬩竴涓柊鐩綍銆?/p>
銆銆榪欓噷鐨勫ぇ浣撹繃紼嬫槸錛氭柊鍒嗛厤浜嗕竴涓?struct dentry 緇撴瀯鐨勫唴瀛樼┖闂達紝鐢ㄤ簬璁板綍 dev 鐩綍鎵瀵瑰簲鐨勪俊鎭紝璇entry 緇撴瀯灝嗕細鎸傛帴鍒板叾鐖剁洰褰曚腑錛屼篃灝辨槸鍥?3 涓?"/" 鐩綍瀵瑰簲鐨?dentry 緇撴瀯涓紝鐢遍摼琛ㄥ疄鐜拌繖涓鍏崇郴銆傛帴涓嬫潵浼氬啀鍒嗛厤涓涓?struct inode 緇撴瀯銆侷node 涓殑 i_sb 鍜?dentry 涓殑 d_sb 鍒嗗埆閮芥寚鍚戝浘 3 涓殑 sb錛岃繖鏍風湅鏉ワ紝鍦ㄥ悓涓鏂囦歡緋葷粺涓嬪緩绔嬫柊鐨勭洰褰曟椂騫朵笉闇瑕侀噸鏂板垎閰嶄竴涓秴綰у潡緇撴瀯錛屽洜涓烘瘯绔熷畠浠兘灞炰簬鍚屼竴鏂囦歡緋葷粺錛屽洜姝や竴涓枃浠剁郴緇熷彧瀵瑰簲涓涓秴綰у潡銆?/p>
銆銆榪欐牱錛屽綋璋冪敤 sys_mkdir 鎴愬姛鍦板湪 VFS 鐨勭洰褰曟爲涓柊寤虹珛涓涓洰褰?"/dev" 涔嬪悗錛屽湪鍥?3 鐨勫熀紜涓婏紝鏂扮殑鏁版嵁緇撴瀯涔嬮棿鐨勫叧緋諱究濡傚浘 4 鎵紺恒傚浘 4 涓鑹茶緝娣辯殑涓や釜鐭╁艦鍧?new_inode 鍜?new_entry 渚挎槸鍦╯ys_mkdir() 鍑芥暟涓柊鍒嗛厤鐨勫唴瀛樼粨鏋勶紝鑷充簬鍥句腑鐨?mnt,sb,dentry,inode 絳夌粨鏋勶紝浠嶄負鍥?3 涓浉搴旂殑鏁版嵁緇撴瀯錛屽叾鐩鎬簰涔嬮棿鐨勯摼鎺ュ叧緋諱笉鍙?鍥句腑涓洪伩鍏嶈繃澶氱殑閾炬帴鏇茬嚎錛屽拷鐣ヤ簡涓浜涢摼鎺ュ叧緋伙紝濡?mnt 鍜?sb,dentry涔嬮棿鐨勯摼鎺ワ紝璇昏呭彲鍦ㄥ浘 3 鐨勫熀紜涓婂弬鐪嬪浘 4)銆?/p>
銆銆闇瑕佸己璋冧竴鐐圭殑鏄紝鏃㈢劧 rootfs 鏂囦歡緋葷粺琚?mount 鍒頒簡 VFS 鏍戜笂錛岄偅涔堝畠鍦?sys_mkdir 鐨勮繃紼嬩腑蹇呯劧浼氬弬涓庤繘鏉ワ紝浜嬪疄涓婂湪鏁翠釜榪囩▼涓紝rootfs 鏂囦歡緋葷粺涓殑 ramfs_mkdir銆乺amfs_lookup 絳夊嚱鏁伴兘鏇捐璋冪敤榪囥?/p>
銆銆鍥?4: 鍦?VFS 鏍戜腑鏂板緩涓鐩綍 "dev" 銆銆 銆銆6. 鍦?VFS 鏍戜腑鎸傝澆鏂囦歡緋葷粺 銆銆鍦ㄦ湰鑺備腑錛屽皢鎻忚堪鍦?VFS 鐨勭洰褰曟爲涓悜鍏朵腑鏌愪釜鐩綍(瀹夎鐐?mount point)涓婃寕杞?mount)涓涓枃浠剁郴緇熺殑榪囩▼銆?/p>
銆銆榪欎竴榪囩▼鍙畝鍗曟弿榪頒負錛氬皢鏌愪竴璁懼(dev_name)涓婃煇涓鏂囦歡緋葷粺(file_system_type)瀹夎鍒癡FS鐩綍鏍戜笂鐨勬煇涓瀹夎鐐?dir_name)銆傚畠瑕佽В鍐崇殑闂鏄細灝嗗 VFS 鐩綍鏍戜腑鏌愪竴鐩綍鐨勬搷浣滆漿鍖栦負鍏蜂綋瀹夎鍒板叾涓婄殑瀹為檯鏂囦歡緋葷粺鐨勫搴旀搷浣溿傛瘮濡傝錛屽鏋滃皢 hda2 涓婄殑鏍規枃浠剁郴緇?鍋囪鏂囦歡緋葷粺綾誨瀷涓?ext2)瀹夎鍒頒簡鍓嶄竴鑺備腑鏂板緩绔嬬殑 "/dev" 鐩綍涓?姝ゆ椂錛?/dev" 鐩綍灝辨垚涓轟簡瀹夎鐐?錛岄偅涔堝畨瑁呮垚鍔熶箣鍚庡簲杈懼埌榪欐牱鐨勭洰鐨勶紝鍗籌細瀵?VFS 鏂囦歡緋葷粺鐨?"/dev" 鐩綍鎵ц "ls" 鎸囦護錛岃鏉℃寚浠ゅ簲鑳藉垪鍑?hda2 涓?ext2 鏂囦歡緋葷粺鐨勬牴鐩綍涓嬫墍鏈夌殑鐩綍鍜屾枃浠躲傚緢鏄劇劧錛岃繖閲岀殑鍏抽敭鏄浣曞皢瀵?VFS 鏍戜腑 "/dev" 鐨勭洰褰曟搷浣滄寚浠よ漿鍖栦負瀹夎鍦ㄥ叾涓婄殑 ext2 榪欎竴瀹為檯鏂囦歡緋葷粺涓殑鐩稿簲鎸囦護銆傛墍浠ワ紝鎺ヤ笅鏉ョ殑鍙欒堪灝嗘姄浣忓浣曡漿鍖栬繖涓鏍稿績闂銆傚湪鍙欒堪涔嬪墠錛岃鑰呬笉濡ㄨ嚜宸辮鎯充竴涓?Linux 緋葷粺浼氬浣曡В鍐寵繖涓闂銆傝浣忥細瀵圭洰褰曟垨鏂囦歡鐨勬搷浣滃皢鏈緇堢敱鐩綍鎴栨枃浠舵墍瀵瑰簲鐨?inode 緇撴瀯涓殑 i_op 鍜?i_fop 鎵鎸囧悜鐨勫嚱鏁拌〃涓搴旂殑鍑芥暟鏉ユ墽琛屻傛墍浠ワ紝涓嶇鏈緇堣В鍐蟲柟妗堝浣曪紝閮藉彲浠ヨ鎯沖繀鐒惰閫氳繃灝嗗 "/dev" 鐩綍鎵瀵瑰簲鐨?inode 涓?i_op 鍜?i_fop 鐨勮皟鐢ㄨ漿鎹㈠埌 hda2 涓婃牴鏂囦歡緋葷粺 ext2 涓牴鐩綍鎵瀵瑰簲鐨?inode 涓?i_op 鍜?i_fop 鐨勬搷浣溿?/p>
銆銆鍒濆榪囩▼鐢?sys_mount() 緋葷粺璋冪敤鍑芥暟鍙戣搗錛岃鍑芥暟鍘熷瀷澹版槑濡備笅錛?/p>
銆銆鍏朵腑錛屽弬鏁?char *type 涓烘爣璇嗗皢瑕佸畨瑁呯殑鏂囦歡緋葷粺綾誨瀷瀛楃涓詫紝瀵逛簬 ext2 鏂囦歡緋葷粺鑰岃█錛屽氨鏄?ext2"銆傚弬鏁?flags 涓哄畨瑁呮椂鐨勬ā寮忔爣璇嗘暟錛屽拰鎺ヤ笅鏉ョ殑 data 鍙傛暟涓鏍鳳紝鏈枃涓嶅皢鍏跺仛涓洪噸鐐廣?/p>
銆銆涓轟簡甯姪璇昏呮洿濂藉湴鐞嗚В榪欎竴榪囩▼錛岀瑪鑰呯敤涓涓叿浣撶殑渚嬪瓙鏉ヨ鏄庯細鎴戜滑鍑嗗灝嗘潵鑷富紜洏絎?2 鍒嗗尯(hda2)涓婄殑 ext2 鏂囦歡緋葷粺瀹夎鍒板墠闈㈠垱寤虹殑 "/dev" 鐩綍涓傞偅涔堝浜?sys_mount() 鍑芥暟鐨勮皟鐢ㄤ究鍏蜂綋涓猴細 銆銆璇ュ嚱鏁板湪灝嗚繖浜涙潵鑷敤鎴峰唴瀛樼┖闂?user space)鐨勫弬鏁版嫹璐濆埌鍐呮牳絀洪棿鍚庯紝渚胯皟鐢?do_mount() 鍑芥暟寮濮嬬湡姝g殑瀹夎鏂囦歡緋葷粺鐨勫伐浣溿傚悓鏍鳳紝涓轟簡渚夸簬鍙欒堪鍜岃娓呮涓繪祦紼嬶紝鎺ヤ笅鏉ョ殑璇存槑灝嗕笉涓ユ牸鎸夌収鍏蜂綋鐨勫嚱鏁拌皟鐢ㄧ粏鑺傛潵榪涜銆?/p>
銆銆do_mount() 鍑芥暟浼氶鍏堣皟鐢?path_lookup() 鍑芥暟鏉ュ緱鍒板畨瑁呯偣鐨勭浉鍏充俊鎭紝濡傚悓鍒涘緩鐩綍榪囩▼涓彊榪扮殑閭f牱錛岃瀹夎鐐圭殑淇℃伅鏈緇堣褰曞湪 struct nameidata 綾誨瀷鐨勪竴涓彉閲忓綋涓紝涓哄彊榪版柟渚匡紝璁拌鍙橀噺涓簄d銆傚湪鏈緥涓綋 path_lookup() 鍑芥暟榪斿洖鏃訛紝nd 涓褰曠殑淇℃伅濡備笅錛歯d.entry = new_entry; nd.mnt = mnt; 榪欓噷鐨勫彉閲忓鍥?3 鍜?4 涓墍紺恒?/p>
銆銆鐒跺悗錛宒o_mount() 鍑芥暟浼氭牴鎹皟鐢ㄥ弬鏁?flags 鏉ュ喅瀹氳皟鐢ㄤ互涓嬪洓涓嚱鏁頒箣涓錛歞o_remount()銆?do_loopback()銆乨o_move_mount()銆乨o_add_mount()銆?/p>
銆銆鍦ㄦ垜浠綋鍓嶇殑渚嬪瓙涓紝緋葷粺浼氳皟鐢?do_add_mount() 鍑芥暟鏉ュ悜 VFS 鏍戜腑瀹夎鐐?"/dev " 瀹夎涓涓疄闄呯殑鏂囦歡緋葷粺銆傚湪 do_add_mount() 涓紝涓昏瀹屾垚浜嗕袱浠墮噸瑕佷簨鎯咃細涓鏄幏寰椾竴涓柊鐨勫畨瑁呭尯鍩熷潡錛屼簩鏄皢璇ユ柊鐨勫畨瑁呭尯鍩熷潡鍔犲叆浜嗗畨瑁呯郴緇熼摼琛ㄣ傚畠浠垎鍒槸璋冪敤 do_kern_mount() 鍑芥暟鍜?graft_tree() 鍑芥暟鏉ュ畬鎴愮殑銆傝繖閲岀殑鎻忚堪鍙兘鏈夌偣鎶借薄錛岃濡傚畨瑁呭尯鍩熷潡銆佸畨瑁呯郴緇熼摼琛ㄧ瓑錛屼笉榪囦笉鐢ㄧ潃鎬ワ紝鍥犱負瀹冧滑閮芥槸絎旇呰嚜宸卞畾涔夊嚭鏉ョ殑姒傚康錛岀瓑涓涓嬪埌鍚庨潰浼氭湁涓撻棬鐨勫浘琛ㄨВ閲婏紝鍒版椂渚夸細娓呮銆?/p>
銆銆do_kern_mount() 鍑芥暟瑕佸仛鐨勪簨鎯咃紝渚挎槸寤虹珛涓鏂扮殑瀹夎鍖哄煙鍧楋紝鍏蜂綋鐨勫唴瀹瑰湪鍓嶉潰鐨勭珷鑺?VFS 鐩綍鏍戠殑寤虹珛涓凡緇忓彊榪拌繃錛岃繖閲屼笉鍐嶈禈榪般?/p>
銆銆graft_tree() 鍑芥暟瑕佸仛鐨勪簨鎯呬究鏄皢 do_kern_mount() 鍑芥暟榪斿洖鐨勪竴 struct vfsmount 綾誨瀷鐨勫彉閲忓姞鍏ュ埌瀹夎緋葷粺閾捐〃涓紝鍚屾椂 graft_tree() 榪樿灝嗘柊鍒嗛厤鐨?struct vfsmount 綾誨瀷鐨勫彉閲忓姞鍏ュ埌涓涓猦ash琛ㄤ腑錛屽叾鐩殑鎴戜滑灝嗕細鍦ㄤ互鍚庣湅鍒般?/p>
銆銆榪欐牱錛屽綋 do_kern_mount() 鍑芥暟榪斿洖鏃訛紝鍦ㄥ浘 4 鐨勫熀紜涓婏紝鏂扮殑鏁版嵁緇撴瀯闂寸殑鍏崇郴灝嗗鍥?5 鎵紺恒傚叾涓紝綰㈠湀鍖哄煙閲岄潰鐨勬暟鎹粨鏋勪究鏄縐板仛瀹夎鍖哄煙鍧楃殑涓滆タ錛屽叾涓笉濡ㄧО e2_mnt 涓哄畨瑁呭尯鍩熷潡鐨勬寚閽堬紝钃濊壊綆ご鏇茬嚎鍗蟲瀯鎴愪簡鎵璋撶殑瀹夎緋葷粺閾捐〃銆?/p>
銆銆鍦ㄦ妸榪欎簺鍑芥暟璋冪敤鍚庡艦鎴愮殑鏁版嵁緇撴瀯鍏崇郴鐞嗘竻妤氫箣鍚庯紝璁╂垜浠洖鍒版湰绔犺妭寮濮嬫彁鍒扮殑闂錛屽嵆灝?ext2 鏂囦歡緋葷粺瀹夎鍒頒簡 "/dev " 涓婁箣鍚庯紝瀵硅鐩綍涓婄殑鎿嶄綔濡備綍杞寲涓哄 ext2 鏂囦歡緋葷粺鐩稿簲鐨勬搷浣溿備粠鍥?5涓婄湅鍒幫紝瀵?sys_mount() 鍑芥暟鐨勮皟鐢ㄥ茍娌℃湁鐩存帴鏀瑰彉 "/dev " 鐩綍鎵瀵瑰簲鐨?inode (鍗沖浘涓殑 new_inode鍙橀噺)緇撴瀯涓殑 i_op 鍜?i_fop 鎸囬拡錛岃屼笖 "/dev " 鎵瀵瑰簲鐨?dentry(鍗沖浘涓殑 new_dentry 鍙橀噺)緇撴瀯浠嶇劧鍦?VFS 鐨勭洰褰曟爲涓紝騫舵病鏈夎浠庡叾涓殣钘忚搗鏉ワ紝鐩稿簲鍦幫紝鏉ヨ嚜 hda2 涓婄殑 ext2 鏂囦歡緋葷粺鐨勬牴鐩綍鎵瀵瑰簲鐨?e2_entry 涔熶笉鏄褰撳垵絎旇呮墍鎯寵薄鍦伴偅鏍峰皢 VFS 鐩綍鏍戜腑鐨?new_dentry 鍙栬屼唬涔嬶紝閭d箞榪欎箣闂寸殑杞寲鍒板簳鏄浣曞疄鐜扮殑鍛紵 銆銆璇瘋鑰呮敞鎰忎笅闈㈢殑榪欐浠g爜錛?/p>
銆銆榪欐浠g爜鍦?link_path_walk() 鍑芥暟涓璋冪敤錛岃?link_path_walk() 鏈緇堝張浼氳 path_lookup() 鍑芥暟璋冪敤錛屽鏋滆鑰呴槄璇昏繃 Linux 鍏充簬鏂囦歡緋葷粺閮ㄥ垎鐨勪唬鐮侊紝搴旇鐭ラ亾 path_lookup() 鍑芥暟鍦ㄦ暣涓?Linux 綣佺悙鐨勬枃浠剁郴緇熶唬鐮佷腑灞炰簬涓涓噸瑕佺殑鍩虹鎬х殑鍑芥暟銆傜畝鍗曡鏉ワ紝榪欎釜鍑芥暟鐢ㄤ簬瑙f瀽鏂囦歡璺緞鍚嶏紝榪欓噷鐨勬枃浠惰礬寰勫悕鍜屾垜浠鉤鏃跺湪搴旂敤紼嬪簭涓墍娑夊強鍒扮殑姒傚康鐩稿悓錛屾瘮濡傚湪 Linux 鐨勫簲鐢ㄧ▼搴忎腑 open 鎴?read 涓涓枃浠?/home/windfly.cs 鏃訛紝榪欓噷鐨?/home/windfly.cs 灝辨槸鏂囦歡璺緞鍚嶏紝path_lookup() 鍑芥暟鐨勮矗浠誨氨鏄鏂囦歡璺緞鍚嶄腑榪涜鎼滅儲錛岀洿鍒版壘鍒扮洰鏍囨枃浠舵墍灞炵洰褰曟墍瀵瑰簲鐨?dentry 鎴栬呯洰鏍囩洿鎺ュ氨鏄竴涓洰褰曪紝絎旇呬笉鎯沖湪鏈夐檺鐨勭瘒騫呴噷璇︾粏瑙i噴榪欎釜鍑芥暟錛岃鑰呭彧瑕佽浣?path_lookup() 浼氳繑鍥炰竴涓洰鏍囩洰褰曞嵆鍙?/p>
銆銆涓婇潰鐨勪唬鐮侀潪甯稿湴涓嶈搗鐪鹼紝浠ヨ嚦浜庡垵嬈¢槄璇繪枃浠剁郴緇熺殑浠g爜鏃剁粡甯鎬細蹇界暐鎺夊畠錛屼絾鏄墠鏂囨墍鎻愬埌浠?VFS 鐨勬搷浣滃埌瀹為檯鏂囦歡緋葷粺鎿嶄綔鐨勮漿鍖栧嵈鏄敱瀹冨畬鎴愮殑錛屽 VFS 涓疄鐜扮殑鏂囦歡緋葷粺鐨勫畨瑁呭彲璋撳姛涓嶅彲娌°傜幇鍦ㄨ鎴戜滑浠旂粏鍓栨瀽涓涓嬭孌典唬鐮侊細 d_mountpoint(dentry) 鐨勪綔鐢ㄥ緢綆鍗曪紝瀹冨彧鏄繑鍥?dentry 涓?d_mounted 鎴愬憳鍙橀噺鐨勫箋傝繖閲岀殑dentry 浠嶇劧榪樻槸 VFS 鐩綍鏍戜笂鐨勪笢瑗褲傚鏋?VFS 鐩綍鏍戜笂鏌愪釜鐩綍琚畨瑁呰繃涓嬈★紝閭d箞璇ュ間負 1銆傚VFS 涓殑涓涓洰褰曞彲榪涜澶氭瀹夎錛屽悗闈細鏈変緥瀛愯鏄庤繖縐嶆儏鍐點傚湪鎴戜滑鐨勪緥瀛愪腑錛?/dev" 鎵瀵瑰簲鐨刵ew_dentry 涓?d_mounted=1錛屾墍浠?while 寰幆涓涓涓潯浠舵弧瓚熾備笅闈㈠啀鏉ョ湅__follow_down(&nd->mnt, &dentry)浠?/p>
銆銆鍥?5錛氬畨瑁?ext2 綾誨瀷鏍規枃浠剁郴緇熷埌 "/dev " 鐩綍涓?/p>
銆銆 銆銆鐮佸仛浜嗕粈涔堬紵鍒版鎴戜滑搴旇璁頒綇錛岃繖閲?nd 涓殑 dentry 鎴愬憳灝辨槸鍥?5 涓殑 new_dentry錛宯d 涓殑 mnt鎴愬憳灝辨槸鍥?5 涓殑 mnt錛屾墍浠ユ垜浠幇鍦ㄥ彲浠ユ妸 __follow_down(&nd->mnt, &dentry) 鏀瑰啓鎴恄_follow_down(&mnt, &new_dentry)錛屾帴涓嬫潵鎴戜滑灝?__follow_down() 鍑芥暟鐨勪唬鐮佹敼鍐?鍙槸鍘誨鎺変竴浜涗笉澶浉鍏崇殑浠g爜錛屽茍涓斾負浜嗕究浜庤鏄庯紝鍦ㄩ儴鍒嗕唬鐮佽鍓嶅姞涓婁簡搴忓彿)濡備笅錛?/p>
銆銆浠g爜琛孾1]涓殑 lookup_mnt() 鍑芥暟鐢ㄤ簬鏌ユ壘涓涓?VFS 鐩綍鏍戜笅鏌愪竴鐩綍鏈榪戜竴嬈¤ mount 鏃剁殑瀹夎鍖哄煙鍧楃殑鎸囬拡錛屽湪鏈緥涓渶緇堜細榪斿洖鍥?5 涓殑 e2_mnt銆傝嚦浜庢煡鎵劇殑鍘熺悊錛岃繖閲岀矖鐣ュ湴鎻忚堪涓涓嬨傝寰楀綋鎴戜滑鍦ㄥ畨瑁?ext2 鏂囦歡緋葷粺鍒?"/dev" 鏃訛紝鍦ㄥ悗鏈熶細璋冪敤 graft_tree() 鍑芥暟錛屽湪榪欎釜鍑芥暟閲屼細鎶婂浘 5 涓殑瀹夎鍖哄煙鍧楁寚閽?e2_mnt 鎸傚埌涓 hash 琛?Linux 2.4.20婧愪唬鐮佷腑縐頒箣涓?mount_hashtable)涓殑鏌愪竴欏癸紝鑰岃欏圭殑閿煎氨鏄敱琚畨瑁呯偣鎵瀵瑰簲鐨?dentry(鏈緥涓負 new_dentry)鍜?mount(鏈緥涓負 mnt)鎵鍏卞悓浜х敓錛屾墍浠ヨ嚜鐒跺湴錛屽綋鎴戜滑鐭ラ亾 VFS 鏍戜腑鏌愪竴 dentry 琚畨瑁呰繃(璇?dentry 鍙樻垚涓轟竴瀹夎鐐?錛岃岃鍘繪煡鎵懼叾鏈榪戜竴嬈¤瀹夎鐨勫畨瑁呭尯鍩熷潡鎸囬拡鏃訛紝鍚屾牱鐢辮瀹夎鐐規墍瀵瑰簲鐨?dentry 鍜?mount 鏉ヤ駭鐢熶竴閿鹼紝浠ユ鍊煎幓绱㈠紩 mount_hashtable錛岃嚜鐒跺彲鎵懼埌璇ュ畨瑁呯偣瀵瑰簲鐨勫畨瑁呭尯鍩熷潡鎸囬拡褰㈡垚鐨勯摼琛ㄧ殑澶存寚閽堬紝鐒跺悗閬嶅巻璇ラ摼琛紝褰撳彂鐜版煇涓瀹夎鍖哄煙鍧楁寚閽堬紝璁頒負 p錛屾弧瓚充互涓嬫潯浠舵椂錛?/p>
銆銆P 渚夸負璇ュ畨瑁呯偣鎵瀵瑰簲鐨勫畨瑁呭尯鍩熷潡鎸囬拡銆傚綋鎵懼埌璇ユ寚閽堝悗錛屼究灝?nd 涓殑 mnt 鎴愬憳鎹㈡垚璇ュ畨瑁呭尯鍩熷潡鎸囬拡錛屽悓鏃跺皢 nd 涓殑 dentry 鎴愬憳鎹㈡垚瀹夎鍖哄煙鍧椾腑鐨?dentry 鎸囬拡銆傚湪鎴戜滑鐨勪緥瀛愪腑錛宔2_mnt->mnt_root鎴愬憳鎸囧悜 e2_dentry錛屼篃灝辨槸 ext2 鏂囦歡緋葷粺鐨?"/" 鐩綍銆傝繖鏍鳳紝褰?path_lookup() 鍑芥暟鎼滅儲鍒?"/dev"鏃訛紝nd 涓殑 dentry 鎴愬憳涓?e2_dentry錛岃屼笉鍐嶆槸鍘熸潵鐨?new_dentry錛屽悓鏃?mnt 鎴愬憳琚崲鎴?e2_mnt錛岃漿鍖栦究鍦ㄤ笉鐭ヤ笉瑙変腑瀹屾垚浜嗐?/p>
銆銆鐜板湪鑰冭檻涓涓嬪鏌愪竴瀹夎鐐瑰嬈″畨瑁呯殑鎯呭喌錛屽悓鏍蜂綔涓轟緥瀛愶紝鎴戜滑鍋囪鍦?"/dev" 涓婂畨瑁呭畬涓涓?ext2鏂囦歡緋葷粺鍚庯紝鍐嶅湪鍏朵笂瀹夎涓涓?ntfs 鏂囦歡緋葷粺銆傚湪瀹夎涔嬪墠錛屽悓鏍蜂細瀵瑰畨瑁呯偣鎵鍦ㄧ殑璺緞璋冪敤path_lookup() 鍑芥暟榪涜鎼滅儲錛屼絾鏄繖嬈$敱浜庡湪 "/dev" 鐩綍涓婂凡緇忓畨瑁呰繃浜?ext2 鏂囦歡緋葷粺錛屾墍浠ユ悳绱㈠埌鏈鍚庯紝鐢?nd 榪斿洖鐨勪俊鎭槸錛歯d.dentry = e2_dentry, nd.mnt = e2_mnt銆傜敱姝ゅ彲瑙侊紝鍦ㄧ浜屾瀹夎鏃訛紝瀹夎鐐瑰凡緇忕敱 dentry 鍙樻垚浜?e2_dentry銆傛帴涓嬫潵錛屽悓鏍峰湴錛岀郴緇熶細鍐嶅垎閰嶄竴涓畨瑁呭尯鍩熷潡錛屽亣璁捐瀹夎鍖哄煙鍧楃殑鎸囬拡涓?ntfs_mnt錛屽尯鍩熷潡涓殑 dentry 涓?ntfs_dentry銆俷tfs_mnt 鐨勭埗鎸囬拡鎸囧悜浜唀2_mnt錛宮nfs_mnt 涓殑 mnt_root 鎸囧悜浜嗕唬琛?ntfs 鏂囦歡緋葷粺鏍圭洰褰曠殑 ntfs_dentry銆傜劧鍚庯紝緋葷粺閫氳繃 e2_dentry鍜?e2_mnt 鏉ョ敓鎴愪竴涓柊鐨?hash 閿鹼紝鍒╃敤璇ュ間綔涓虹儲寮曪紝灝?ntfs_mnt 鍔犲叆鍒?mount_hashtable 涓紝鍚屾椂灝?e2_dentry 涓殑鎴愬憳 d_mounted 鍊艱瀹氫負 1銆傝繖鏍鳳紝瀹夎榪囩▼渚垮憡緇撴潫銆?/p>
銆銆璇昏呭彲鑳藉凡緇忕煡閬擄紝瀵瑰悓涓瀹夎鐐逛笂鐨勬渶榪戜竴嬈″畨瑁呬細闅愯棌璧峰墠闈㈢殑鑻ュ共嬈″畨瑁咃紝涓嬮潰鎴戜滑閫氳繃涓婅堪鐨勪緥瀛愯В閲婁竴涓嬭榪囩▼錛?/p>
銆銆鍦ㄥ厛鍚庡皢 ext2 鍜?ntfs 鏂囦歡緋葷粺瀹夎鍒?"/dev" 鐩綍涔嬪悗錛屾垜浠啀璋冪敤 path_lookup() 鍑芥暟鏉ュ"/dev" 榪涜鎼滅儲錛屽嚱鏁伴鍏堟壘鍒?VFS 鐩綍鏍戜笅鐨勫畨瑁呯偣 "/dev" 鎵瀵瑰簲鐨?dentry 鍜?mnt錛屾鏃跺畠鍙戠幇dentry 鎴愬憳涓殑 d_mounted 涓?1錛屼簬鏄畠鐭ラ亾宸茬粡鏈夋枃浠剁郴緇熷畨瑁呭埌浜嗚 dentry 涓婏紝浜庢槸瀹冮氳繃 dentry 鍜?mnt 鏉ョ敓鎴愪竴涓?hash 鍊鹼紝閫氳繃璇ュ兼潵瀵?mount_hashtable 榪涜鎼滅儲錛屾牴鎹畨瑁呰繃紼嬶紝瀹冨簲璇ヨ兘鎵懼埌 e2_mnt 鎸囬拡騫惰繑鍥炰箣錛屽悓鏃跺師鍏堢殑 dentry 涔熷凡緇忚鏇挎崲鎴?e2_dentry銆傚洖澶村啀鐪嬩竴涓嬪墠闈㈠凡緇忔彁鍒扮殑涓嬪垪浠g爜錛?while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry)); 褰撶涓嬈″驚鐜粨鏉熷悗, nd->mnt 宸茬粡鏄?e2_mnt錛岃?dentry 鍒欏彉鎴?e2_dentry銆傛鏃剁敱浜?e2_dentry 涓殑鎴愬憳 d_mounted 鍊間負 1錛屾墍浠?while 寰幆鐨勭涓涓潯浠舵弧瓚籌紝瑕佺戶緇皟鐢?__follow_down() 鍑芥暟錛岃繖涓嚱鏁板墠闈㈠凡緇忓墫鏋愯繃錛屽綋瀹冭繑鍥炲悗 nd->mnt 鍙樻垚浜?ntfs_mnt錛宒entry 鍒欏彉鎴愪簡 ntfs_dentry銆傜敱浜庢鏃?ntfs_dentry 娌℃湁琚畨瑁呰繃鍏朵粬鏂囦歡錛屾墍浠ュ畠鐨勬垚鍛?d_mounted 搴旇涓?0錛屽驚鐜粨鏉熴傚 "/dev" 鍙戣搗鐨?path_lookup() 鍑芥暟鏈緇堣繑鍥炰簡 ntfs 鏂囦歡緋葷粺鏍圭洰褰曟墍瀵瑰簲鐨?dentry銆傝繖灝辨槸涓轟粈涔?"/dev" 鏈韓鍜屽畨瑁呭湪鍏朵笂鐨?ext2 閮借闅愯棌鐨勫師鍥犮傚鏋滄鏃跺 "/dev" 鐩綍榪涜涓涓?ls 鍛戒護錛屽皢榪斿洖瀹夎涓婂幓鐨?ntfs 鏂囦歡緋葷粺鏍圭洰褰曚笅鎵鏈夌殑鏂囦歡鍜岀洰褰曘?/p>
銆銆7. 瀹夎鏍規枃浠剁郴緇?/p>
銆銆鏈変簡鍓嶉潰绔犺妭 5 鐨勫熀紜錛岀悊瑙?Linux 涓嬫牴鏂囦歡緋葷粺鐨勫畨瑁呭茍涓嶅洶闅撅紝鍥犱負涓嶇鎬庝箞鏍鳳紝瀹夎涓涓枃浠剁郴緇熷埌 VFS 涓煇涓瀹夎鐐圭殑榪囩▼鍘熺悊姣曠珶閮芥槸涓鏍風殑銆?/p>
銆銆榪欎釜榪囩▼澶ц嚧鏄細棣栧厛瑕佺‘瀹氬緟瀹夎鐨?ext2 鏂囦歡緋葷粺鐨勬潵婧愶紝鍏舵鏄‘瀹?ext2 鏂囦歡緋葷粺鍦?VFS涓殑瀹夎鐐癸紝鐒跺悗渚挎槸鍏蜂綋鐨勫畨瑁呰繃紼嬨?/p>
銆銆鍏充簬絎竴闂錛孡inux 2.4.20 鐨勫唴鏍稿彟鏈変竴澶у爢鐨勪唬鐮佸幓瑙e喅錛岄檺浜庣瘒騫咃紝絎旇呬笉鎯沖湪榪欓噷鍘誨叿浣撹鏄庤繖涓繃紼嬶紝澶ф璁頒綇瀹冩槸瑕佽В鍐沖埌鍝噷鍘繪壘瑕佸畨瑁呯殑鏂囦歡緋葷粺鐨勫氨鍙互浜嗭紝榪欓噷鎴戜滑涓嶅Θ灝辮涓鴻瀹夎鐨勬牴鏂囦歡緋葷粺灝辨潵鑷簬涓葷‖鐩樼殑絎竴鍒嗗尯 hda1. 銆銆鍏充簬絎簩涓棶棰橈紝Linux 2.4.20 鐨勫唴鏍告妸鏉ヨ嚜浜?hda1 涓?ext2 鏂囦歡緋葷粺瀹夎鍒頒簡 VFS 鐩綍鏍戜腑鐨?/root" 鐩綍涓娿傚叾瀹烇紝鎶?ext2 鏂囦歡緋葷粺瀹夎鍒?VFS 鐩綍鏍戜笅鐨勫摢涓畨瑁呯偣騫朵笉閲嶈(VFS 鐨勬牴鐩綍闄ゅ)錛屽彧瑕佹槸榪欎釜瀹夎鐐瑰湪 VFS 鏍戜腑鏄瓨鍦ㄧ殑錛屽茍涓斿唴鏍稿瀹冩病鏈夊彟澶栫殑鐢ㄩ斻傚鏋滆鑰呭枩嬈紝灝藉彲浠ヨ嚜宸卞湪 VFS 涓垱寤轟竴涓?"/Windows" 鐩綍錛岀劧鍚庡皢 ext2 鏂囦歡緋葷粺瀹夎涓婂幓浣滀負灝嗘潵鐢ㄦ埛榪涚▼鐨勬牴鐩綍錛屾病鏈変粈涔堜笉鍙互鐨勩傞棶棰樼殑鍏抽敭鏄灝嗚繘紼嬬殑鏍圭洰褰曞拰褰撳墠宸ヤ綔鐩綍璁懼畾濂斤紝鍥犱負姣曠珶鍙敤鐢ㄦ埛榪涚▼鎵嶅幓鍏沖績鐜板疄鐨勬枃浠剁郴緇燂紝瑕佺煡閬撶瑪鑰呯殑榪欑瘒紼垮瓙鍙槸瑕佸瓨鍒扮‖鐩樹笂鍘葷殑銆?/p>
銆銆鍦?Linux 涓嬶紝璁懼畾涓涓繘紼嬬殑褰撳墠宸ヤ綔鐩綍鏄氳繃緋葷粺璋冪敤 sys_chdir() 榪涜鐨勩傚垵濮嬪寲鏈熼棿錛孡inux 鍦ㄥ皢 hda1 涓婄殑 ext2 鏂囦歡緋葷粺瀹夎鍒頒簡 "/root" 涓婂悗錛岄氳繃璋冪敤 sys_chdir("/root") 灝嗗綋鍓嶈繘紼嬶紝涔熷氨鏄?init_task 榪涚▼鐨勫綋鍓嶅伐浣滅洰褰?pwd)璁懼畾涓?ext2 鏂囦歡緋葷粺鐨勬牴鐩綍銆傝浣忔鏃?init_task榪涚▼鐨勬牴鐩綍浠嶇劧鏄浘 3 涓殑 dentry錛屼篃灝辨槸 VFS 鏍戠殑鏍圭洰褰曪紝榪欐樉鐒舵槸涓嶈鐨勶紝鍥犱負浠ュ悗 Linux 涓栫晫涓殑鎵鏈夎繘紼嬮兘鐢辮繖涓?init_task 榪涚▼媧劇敓鍑烘潵錛屾棤涓渚嬪鍦拌緇ф壙璇ヨ繘紼嬬殑鏍圭洰褰曪紝濡傛灉鏄繖鏍鳳紝鎰忓懗鐫鐢ㄦ埛榪涚▼浠庢牴鐩綍鎼滅儲鏌愪竴鐩綍鏃訛紝瀹為檯涓婃槸浠?VFS 鐨勬牴鐩綍寮濮嬬殑錛岃屼簨瀹炰笂鍗存槸浠?ext2 鐨勬牴鏂囦歡寮濮嬫悳绱㈢殑銆傝繖涓煕鐩劇殑瑙e喅鏄潬浜嗗湪璋冪敤瀹?mount_root() 鍑芥暟鍚庯紝緋葷粺璋冪敤鐨勪笅闈袱涓嚱鏁幫細 銆銆鍏朵富瑕佷綔鐢ㄤ究鏄皢 init_task 榪涚▼鐨勬牴鐩綍杞寲鎴愬畨瑁呬笂鍘葷殑 ext2 鏂囦歡緋葷粺鐨勬牴鐩綍銆傛湁鍏磋叮鐨勮鑰呭彲浠ヨ嚜琛屽幓鐮旂┒榪欎竴榪囩▼銆?/p>
銆銆鎵浠ュ湪鐢ㄦ埛絀洪棿涓嬶紝鏇村鍦版儏鍐墊槸鍙兘瑙佸埌 VFS 榪欐5澶ф爲鐨勪竴鍙訛紝鑰屼笖榪樻槸琚畨瑁呰繃鏂囦歡緋葷粺浜嗙殑錛屽疄闄呬笂瀵圭敤鎴風┖闂存潵璇磋繕鏄笉鍙銆傛垜鎯籌紝VFS 鏇村鍦拌鍐呮牳鐢ㄦ潵瀹炵幇鑷繁鐨勫姛鑳斤紝騫朵互緋葷粺璋冪敤鐨勬柟寮忔彁渚涜繃鐢ㄦ埛榪涚▼浣跨敤錛岃嚦浜庡湪鍏朵笂瀹炵幇鐨勪笉鍚屾枃浠剁郴緇熺殑瀹夎錛屼篃鍙槸鍏朵腑鐨勪竴涓姛鑳界艦浜嗐?/p>
銆銆8. 緇撴潫璇?/p>
銆銆鏂囦歡緋葷粺鍦ㄦ暣涓?Linux 鐨勫唴鏍鎬腑鍏鋒湁涓捐凍杞婚噸鐨勫湴浣嶏紝浠g爜閲忎篃寰堝鏉傜箒鐞愩備絾鏄洜涓哄叾閲嶈鐨勫湴浣嶏紝瑕佹兂瀵?Linux 鐨勫唴鏍告湁姣旇緝娣卞叆鐨勭悊瑙o紝蹇呴』瑕佽兘瓚婅繃鏂囦歡緋葷粺榪欎竴鍏熾傚綋鐒墮槄璇誨叾婧愪唬鐮佷究鏄叾涓渶濂界殑鏂規硶錛屾湰鏂囪瘯鍥劇粰閭d簺宸茬粡灝濊瘯鐫鍘婚槄璇伙紝浣嗘槸鐩墠灝氭湁鍥版儜鐨勮鑰呯敾涓寮?VFS 鏂囦歡緋葷粺鐨勮崏鍥撅紝甯屾湜鑳藉璇昏呮湁浜涜鍚彂銆備絾鏄兂鍦ㄥ姝ゆ湁闄愮殑綃囧箙閲屽幓闃愯堪娓呮 Linux 涓暣涓枃浠剁郴緇熺殑鏉ラ緳鍘昏剦錛屾槸鏍規湰涓嶇幇瀹炵殑銆傝屼笖鏈枃涔熷彧鏄晶閲嶄簬鍓栨瀽 VFS 鐨勬満鍒訛紝瀵逛簬璞″叿浣撶殑鏂囦歡璇誨啓錛屼負鎻愰珮鏁堢巼鑰屽紩鍏ョ殑鍚勭 buffer,hash 絳夊唴瀹逛互鍙婃枃浠剁郴緇熺殑瀹夊叏鎬ф柟闈紝閮芥病鏈夋彁鍒般傛瘯绔燂紝鏈枃鍙兂甯姪璇昏呯悊娓呬竴涓ぇ浣撶殑鑴夌粶錛屾渶緇堢殑鐞嗚В涓庨鎮燂紝榪樺緱闈犺鑰呰嚜宸卞幓娼滃績鐮旂┒婧愪唬鐮併傛渶鍚庯紝瀵規湰鏂囩浉鍏崇殑浠諱綍闂鎴栧緩璁紝閮芥榪庣敤 email 鍜岀瑪鑰呰仈緋匯?/p>
銆銆鑷粠璇炵敓浠ユ潵錛孡inux 灝辮涓嶆柇瀹屽杽鍜屾櫘鍙婏紝鐩墠瀹冨凡緇忔垚涓轟富嫻侀氱敤鎿嶄綔緋葷粺涔嬩竴錛屼嬌鐢ㄥ緱闈炲父騫挎硾錛屽畠涓?Windows銆乁NIX 涓璧峰崰鎹簡鎿嶄綔緋葷粺棰嗗煙鍑犱箮鎵鏈夌殑甯傚満浠介銆傜壒鍒槸鍦ㄩ珮鎬ц兘璁$畻棰嗗煙錛孡inux 宸茬粡鎴愪負涓涓崰涓誨鍦頒綅鐨勬搷浣滅郴緇燂紝鍦?005騫?鏈堝叏鐞僒OP500 璁$畻鏈轟腑錛屾湁 301 鍙伴儴緗茬殑鏄?Linux 鎿嶄綔緋葷粺銆傚洜姝わ紝鐮旂┒鍜屼嬌鐢?Linux 宸茬粡鎴愪負寮鍙戣呯殑涓嶅彲鍥為伩鐨勯棶棰樹簡銆?
銆銆涓嬮潰鎴戜滑浠嬬粛涓涓?Linux 鍐呮牳涓枃浠?Cache 綆$悊鐨勬満鍒躲傛湰鏂囦互 2.6 緋誨垪鍐呮牳涓哄熀鍑嗭紝涓昏璁茶堪宸ヤ綔鍘熺悊銆佹暟鎹粨鏋勫拰綆楁硶錛屼笉娑夊強鍏蜂綋浠g爜銆?
銆銆2 鎿嶄綔緋葷粺鍜屾枃浠?Cache 綆$悊
銆銆鎿嶄綔緋葷粺鏄綆楁満涓婃渶閲嶈鐨勭郴緇熻蔣浠訛紝瀹冭礋璐g鐞嗗悇縐嶇墿鐞嗚祫婧愶紝騫跺悜搴旂敤紼嬪簭鎻愪緵鍚勭鎶借薄鎺ュ彛浠ヤ究鍏朵嬌鐢ㄨ繖浜涚墿鐞嗚祫婧愩備粠搴旂敤紼嬪簭鐨勮搴︾湅錛屾搷浣滅郴緇熸彁渚涗簡涓涓粺涓鐨勮櫄鎷熸満錛屽湪璇ヨ櫄鎷熸満涓病鏈夊悇縐嶆満鍣ㄧ殑鍏蜂綋緇嗚妭錛屽彧鏈夎繘紼嬨佹枃浠躲佸湴鍧絀洪棿浠ュ強榪涚▼闂撮氫俊絳夐昏緫姒傚康銆傝繖縐嶆娊璞¤櫄鎷熸満浣垮緱搴旂敤紼嬪簭鐨勫紑鍙戝彉寰楃浉瀵瑰鏄擄細寮鍙戣呭彧闇涓庤櫄鎷熸満涓殑鍚勭閫昏緫瀵硅薄浜や簰錛岃屼笉闇瑕佷簡瑙e悇縐嶆満鍣ㄧ殑鍏蜂綋緇嗚妭銆傛澶栵紝榪欎簺鎶借薄鐨勯昏緫瀵硅薄浣垮緱鎿嶄綔緋葷粺鑳藉寰堝鏄撻殧紱誨茍淇濇姢鍚勪釜搴旂敤紼嬪簭銆?
銆銆瀵逛簬瀛樺偍璁懼涓婄殑鏁版嵁錛屾搷浣滅郴緇熷悜搴旂敤紼嬪簭鎻愪緵鐨勯昏緫姒傚康灝辨槸"鏂囦歡"銆傚簲鐢ㄧ▼搴忚瀛樺偍鎴栬闂暟鎹椂錛屽彧闇璇繪垨鑰呭啓"鏂囦歡"鐨勪竴緇村湴鍧絀洪棿鍗沖彲錛岃岃繖涓湴鍧絀洪棿涓庡瓨鍌ㄨ澶囦笂瀛樺偍鍧椾箣闂寸殑瀵瑰簲鍏崇郴鍒欑敱鎿嶄綔緋葷粺緇存姢銆?
銆銆鍦?Linux 鎿嶄綔緋葷粺涓紝褰撳簲鐢ㄧ▼搴忛渶瑕佽鍙栨枃浠朵腑鐨勬暟鎹椂錛屾搷浣滅郴緇熷厛鍒嗛厤涓浜涘唴瀛橈紝灝嗘暟鎹粠瀛樺偍璁懼璇誨叆鍒拌繖浜涘唴瀛樹腑錛岀劧鍚庡啀灝嗘暟鎹垎鍙戠粰搴旂敤紼嬪簭錛涘綋闇瑕佸線鏂囦歡涓啓鏁版嵁鏃訛紝鎿嶄綔緋葷粺鍏堝垎閰嶅唴瀛樻帴鏀剁敤鎴鋒暟鎹紝鐒跺悗鍐嶅皢鏁版嵁浠庡唴瀛樺啓鍒扮鐩樹笂銆傛枃浠?Cache 綆$悊鎸囩殑灝辨槸瀵硅繖浜涚敱鎿嶄綔緋葷粺鍒嗛厤錛屽茍鐢ㄦ潵瀛樺偍鏂囦歡鏁版嵁鐨勫唴瀛樼殑綆$悊銆?Cache 綆$悊鐨勪紭鍔i氳繃涓や釜鎸囨爣琛¢噺錛氫竴鏄?Cache 鍛戒腑鐜囷紝Cache 鍛戒腑鏃舵暟鎹彲浠ョ洿鎺ヤ粠鍐呭瓨涓幏鍙栵紝涓嶅啀闇瑕佽闂綆閫熷璁撅紝鍥犺屽彲浠ユ樉钁楁彁楂樻ц兘錛涗簩鏄湁鏁?Cache 鐨勬瘮鐜囷紝鏈夋晥 Cache 鏄寚鐪熸浼氳璁塊棶鍒扮殑 Cache 欏癸紝濡傛灉鏈夋晥 Cache 鐨勬瘮鐜囧亸浣庯紝鍒欑浉褰撻儴鍒嗙鐩樺甫瀹戒細琚氮璐瑰埌璇誨彇鏃犵敤 Cache 涓婏紝鑰屼笖鏃犵敤 Cache 浼氶棿鎺ュ鑷寸郴緇熷唴瀛樼揣寮狅紝鏈鍚庡彲鑳戒細涓ラ噸褰卞搷鎬ц兘銆?
銆銆涓嬮潰鍒嗗埆浠嬬粛鏂囦歡 Cache 綆$悊鍦?Linux 鎿嶄綔緋葷粺涓殑鍦頒綅鍜屼綔鐢ㄣ丩inux 涓枃浠?Cache鐩稿叧鐨勬暟鎹粨鏋勩丩inux 涓枃浠?Cache 鐨勯璇誨拰鏇挎崲銆丩inux 涓枃浠?Cache 鐩稿叧 API 鍙婂叾瀹炵幇銆?
銆銆2銆?鏂囦歡 Cache 鐨勫湴浣嶅拰浣滅敤
銆銆鏂囦歡 Cache 鏄枃浠舵暟鎹湪鍐呭瓨涓殑鍓湰錛屽洜姝ゆ枃浠?Cache 綆$悊涓庡唴瀛樼鐞嗙郴緇熷拰鏂囦歡緋葷粺閮界浉鍏籌細涓鏂歸潰鏂囦歡 Cache 浣滀負鐗╃悊鍐呭瓨鐨勪竴閮ㄥ垎錛岄渶瑕佸弬涓庣墿鐞嗗唴瀛樼殑鍒嗛厤鍥炴敹榪囩▼錛屽彟涓鏂歸潰鏂囦歡 Cache 涓殑鏁版嵁鏉ユ簮浜庡瓨鍌ㄨ澶囦笂鐨勬枃浠訛紝闇瑕侀氳繃鏂囦歡緋葷粺涓庡瓨鍌ㄨ澶囪繘琛岃鍐欎氦浜掋備粠鎿嶄綔緋葷粺鐨勮搴﹁冭檻錛屾枃浠?Cache 鍙互鐪嬪仛鏄唴瀛樼鐞嗙郴緇熶笌鏂囦歡緋葷粺涔嬮棿鐨勮仈緋葷航甯︺傚洜姝わ紝鏂囦歡 Cache 綆$悊鏄搷浣滅郴緇熺殑涓涓噸瑕佺粍鎴愰儴鍒嗭紝瀹冪殑鎬ц兘鐩存帴褰卞搷鐫鏂囦歡緋葷粺鍜屽唴瀛樼鐞嗙郴緇熺殑鎬ц兘銆?
銆銆鍥?鎻忚堪浜?Linux 鎿嶄綔緋葷粺涓枃浠?Cache 綆$悊涓庡唴瀛樼鐞嗕互鍙婃枃浠剁郴緇熺殑鍏崇郴紺烘剰鍥俱備粠鍥句腑鍙互鐪嬪埌錛屽湪 Linux 涓紝鍏蜂綋鏂囦歡緋葷粺錛屽 ext2/ext3銆乯fs銆乶tfs 絳夛紝璐熻矗鍦ㄦ枃浠?Cache鍜屽瓨鍌ㄨ澶囦箣闂翠氦鎹㈡暟鎹紝浣嶄簬鍏蜂綋鏂囦歡緋葷粺涔嬩笂鐨勮櫄鎷熸枃浠剁郴緇烿FS璐熻矗鍦ㄥ簲鐢ㄧ▼搴忓拰鏂囦歡 Cache 涔嬮棿閫氳繃 read/write 絳夋帴鍙d氦鎹㈡暟鎹紝鑰屽唴瀛樼鐞嗙郴緇熻礋璐f枃浠?Cache 鐨勫垎閰嶅拰鍥炴敹錛屽悓鏃惰櫄鎷熷唴瀛樼鐞嗙郴緇?VMM)鍒欏厑璁稿簲鐢ㄧ▼搴忓拰鏂囦歡 Cache 涔嬮棿閫氳繃 memory map鐨勬柟寮忎氦鎹㈡暟鎹傚彲瑙侊紝鍦?Linux 緋葷粺涓紝鏂囦歡 Cache 鏄唴瀛樼鐞嗙郴緇熴佹枃浠剁郴緇熶互鍙婂簲鐢ㄧ▼搴忎箣闂寸殑涓涓仈緋繪灑綰姐?

銆銆鍦?Linux 鐨勫疄鐜頒腑錛屾枃浠?Cache 鍒嗕負涓や釜灞傞潰錛屼竴鏄?Page Cache錛屽彟涓涓?Buffer Cache錛屾瘡涓涓?Page Cache 鍖呭惈鑻ュ共 Buffer Cache銆傚唴瀛樼鐞嗙郴緇熷拰 VFS 鍙笌 Page Cache 浜や簰錛屽唴瀛樼鐞嗙郴緇熻礋璐g淮鎶ゆ瘡欏?Page Cache 鐨勫垎閰嶅拰鍥炴敹錛屽悓鏃跺湪浣跨敤 memory map 鏂瑰紡璁塊棶鏃惰礋璐e緩绔嬫槧灝勶紱VFS 璐熻矗 Page Cache 涓庣敤鎴風┖闂寸殑鏁版嵁浜ゆ崲銆傝屽叿浣撴枃浠剁郴緇熷垯涓鑸彧涓?Buffer Cache 浜や簰錛屽畠浠礋璐e湪澶栧洿瀛樺偍璁懼鍜?Buffer Cache 涔嬮棿浜ゆ崲鏁版嵁銆侾age Cache銆丅uffer Cache銆佹枃浠朵互鍙婄鐩樹箣闂寸殑鍏崇郴濡傚浘 2 鎵紺猴紝Page 緇撴瀯鍜?buffer_head 鏁版嵁緇撴瀯鐨勫叧緋誨鍥?3 鎵紺恒傚湪涓婅堪涓や釜鍥句腑錛屽亣瀹氫簡 Page 鐨勫ぇ灝忔槸 4K錛岀鐩樺潡鐨勫ぇ灝忔槸 1K銆傛湰鏂囨墍璁茶堪鐨勶紝涓昏鏄寚瀵?Page Cache 鐨勭鐞嗐?
銆銆鍦?Linux 鍐呮牳涓紝鏂囦歡鐨勬瘡涓暟鎹潡鏈澶氬彧鑳藉搴斾竴涓?Page Cache 欏癸紝瀹冮氳繃涓や釜鏁版嵁緇撴瀯鏉ョ鐞嗚繖浜?Cache 欏癸紝涓涓槸 radix tree錛屽彟涓涓槸鍙屽悜閾捐〃銆俁adix tree 鏄竴縐嶆悳绱㈡爲錛孡inux 鍐呮牳鍒╃敤榪欎釜鏁版嵁緇撴瀯鏉ラ氳繃鏂囦歡鍐呭亸縐誨揩閫熷畾浣?Cache 欏癸紝鍥?4 鏄?radix tree鐨勪竴涓ず鎰忓浘錛岃 radix tree 鐨勫垎鍙変負4(22)錛屾爲楂樹負4錛岀敤鏉ュ揩閫熷畾浣?浣嶆枃浠跺唴鍋忕Щ銆侺inux(2.6.7) 鍐呮牳涓殑鍒嗗弶涓?64(26)錛屾爲楂樹負 6(64浣嶇郴緇?鎴栬?11(32浣嶇郴緇?錛岀敤鏉ュ揩閫熷畾浣?32 浣嶆垨鑰?64 浣嶅亸縐伙紝radix tree 涓殑姣忎竴涓彾瀛愯妭鐐規寚鍚戞枃浠跺唴鐩稿簲鍋忕Щ鎵瀵瑰簲鐨凜ache欏廣?
銆銆鍙︿竴涓暟鎹粨鏋勬槸鍙屽悜閾捐〃錛孡inux鍐呮牳涓烘瘡涓鐗囩墿鐞嗗唴瀛樺尯鍩?zone)緇存姢active_list鍜?inactive_list涓や釜鍙屽悜閾捐〃錛岃繖涓や釜list涓昏鐢ㄦ潵瀹炵幇鐗╃悊鍐呭瓨鐨勫洖鏀躲傝繖涓や釜閾捐〃涓婇櫎浜嗘枃浠禖ache涔嬪錛岃繕鍖呮嫭鍏跺畠鍖垮悕 (Anonymous)鍐呭瓨錛屽榪涚▼鍫嗘爤絳夈?



銆銆Linux鍐呮牳涓枃浠墮璇葷畻娉曠殑鍏蜂綋榪囩▼鏄繖鏍風殑錛氬浜庢瘡涓枃浠剁殑絎竴涓璇鋒眰錛岀郴緇熻鍏ユ墍璇鋒眰鐨勯〉闈㈠茍璇誨叆绱ч殢鍏跺悗鐨勫皯鏁板嚑涓〉闈?涓嶅皯浜庝竴涓〉闈紝閫氬父鏄笁涓〉闈?錛岃繖鏃剁殑棰勮縐頒負鍚屾棰勮銆傚浜庣浜屾璇昏姹傦紝濡傛灉鎵璇婚〉闈笉鍦–ache涓紝鍗充笉鍦ㄥ墠嬈¢璇葷殑group涓紝鍒欒〃鏄庢枃浠惰闂笉鏄『搴忚闂紝緋葷粺緇х畫閲囩敤鍚屾棰勮錛涘鏋滄墍璇婚〉闈㈠湪Cache涓紝鍒欒〃鏄庡墠嬈¢璇誨懡涓紝鎿嶄綔緋葷粺鎶婇璇籫roup鎵╁ぇ涓鍊嶏紝騫惰搴曞眰鏂囦歡緋葷粺璇誨叆 group涓墿涓嬪皻涓嶅湪Cache涓殑鏂囦歡鏁版嵁鍧楋紝榪欐椂鐨勯璇葷О涓哄紓姝ラ璇匯傛棤璁虹浜屾璇昏姹傛槸鍚﹀懡涓紝緋葷粺閮借鏇存柊褰撳墠棰勮group鐨勫ぇ灝忋傛澶栵紝緋葷粺涓畾涔変簡涓涓獁indow錛屽畠鍖呮嫭鍓嶄竴嬈¢璇葷殑group鍜屾湰嬈¢璇葷殑group銆備換浣曟帴涓嬫潵鐨勮璇鋒眰閮戒細澶勪簬涓ょ鎯呭喌涔嬩竴錛氱涓縐嶆儏鍐墊槸鎵璇鋒眰鐨勯〉闈㈠浜庨璇粀indow涓紝榪欐椂緇х畫榪涜寮傛棰勮騫舵洿鏂扮浉搴旂殑window鍜実roup錛涚浜岀鎯呭喌鏄墍璇鋒眰鐨勯〉闈㈠浜庨璇粀indow涔嬪錛岃繖鏃剁郴緇熷氨瑕佽繘琛屽悓姝ラ璇誨茍閲嶇疆鐩稿簲鐨剋indow鍜実roup銆傚浘5鏄疞inux鍐呮牳棰勮鏈哄埗鐨勪竴涓ず鎰忓浘錛屽叾涓璦鏄煇嬈¤鎿嶄綔涔嬪墠鐨勬儏鍐碉紝b鏄鎿嶄綔鎵璇鋒眰欏甸潰涓嶅湪window涓殑鎯呭喌錛岃宑鏄鎿嶄綔鎵璇鋒眰欏甸潰鍦╳indow涓殑鎯呭喌銆?
銆銆Linux鍐呮牳涓枃浠禖ache鏇挎崲鐨勫叿浣撹繃紼嬫槸榪欐牱鐨勶細鍒氬垰鍒嗛厤鐨凜ache欏歸摼鍏ュ埌inactive_list澶撮儴錛屽茍灝嗗叾鐘舵佽緗負active錛屽綋鍐呭瓨涓嶅闇瑕佸洖鏀禖ache鏃訛紝緋葷粺棣栧厛浠庡熬閮ㄥ紑濮嬪弽鍚戞壂鎻廰ctive_list騫跺皢鐘舵佷笉鏄痳eferenced鐨勯」閾懼叆鍒?inactive_list鐨勫ご閮紝鐒跺悗緋葷粺鍙嶅悜鎵弿inactive_list錛屽鏋滄墍鎵弿鐨勯」鐨勫浜庡悎閫傜殑鐘舵佸氨鍥炴敹璇ラ」錛岀洿鍒板洖鏀朵簡瓚沖鏁扮洰鐨?Cache欏廣侰ache鏇挎崲綆楁硶濡傚浘6鐨勭畻娉曟弿榪頒吉鐮佹墍紺恒?

if b.state==(UNACTIVE && UNREFERENCE)
b.state = REFERENCE
else if b.state == (UNACTIVE && REFERENCE)
{
b.state = (ACTIVE && UNREFERENCE)
Add X to tail of active_list
}
else if b.state == (ACTIVE && UNREFERENCE)
b.state = (ACTIVE && REFERENCE)
}
Reclaim()
{
if active_list not empty and scan_num
鍥? Linux鐨凜ache鏇挎崲綆楁硶鎻忚堪
5 銆佹枃浠禖ache鐩稿叧API鍙婂叾瀹炵幇
銆銆Linux鍐呮牳涓笌鏂囦歡Cache鎿嶄綔鐩稿叧鐨凙PI鏈夊緢澶氾紝鎸夊叾浣跨敤鏂瑰紡鍙互鍒嗘垚涓ょ被錛氫竴綾繪槸浠ユ嫹璐濇柟寮忔搷浣滅殑鐩稿叧鎺ュ彛錛屽read/write/sendfile絳夛紝鍏朵腑sendfile鍦?.6緋誨垪鐨勫唴鏍鎬腑宸茬粡涓嶅啀鏀寔錛涘彟涓綾繪槸浠ュ湴鍧鏄犲皠鏂瑰紡鎿嶄綔鐨勭浉鍏蟲帴鍙o紝濡?mmap絳夈?
銆銆絎竴縐嶇被鍨嬬殑API鍦ㄤ笉鍚屾枃浠剁殑Cache涔嬮棿鎴栬匔ache涓庡簲鐢ㄧ▼搴忔墍鎻愪緵鐨勭敤鎴風┖闂碽uffer涔嬮棿鎷瘋礉鏁版嵁錛屽叾瀹炵幇鍘熺悊濡傚浘7鎵紺恒?


銆銆6 銆佸皬緇?
銆銆鏂囦歡Cache綆$悊鏄疞inux鎿嶄綔緋葷粺鐨勪竴涓噸瑕佺粍鎴愰儴鍒嗭紝鍚屾椂涔熸槸鐮旂┒棰嗗煙涓涓緢鐑棬鐨勭爺絀舵柟鍚戙傜洰鍓嶏紝Linux鍐呮牳鍦ㄨ繖涓柟闈㈢殑宸ヤ綔闆嗕腑鍦ㄥ紑鍙戞洿鏈夋晥鐨凜ache鏇挎崲綆楁硶涓婏紝濡侺IRS(鍏跺彉縐岰lockPro)銆丄RC絳夈?span class=postbody>
鍘熸枃鍦板潃 http://forum.oss.org.cn/viewtopic.php?p=8858&sid=2bae226e7e46311ee0e8d43ae69194ec
]]>
struct file_system_type {
銆銆const char *name;
銆銆int fs_flags;
銆銆struct super_block *(*read_super) (struct super_block *, void *, int);
銆銆struct module *owner;
銆銆struct file_system_type * next;
銆銆struct list_head fs_supers;
};struct file_system_type rootfs_fs_type = {
銆銆name:銆銆銆銆"rootfs",
銆銆read_super:銆銆ramfs_read_super,
銆銆fs_flags:銆銆FS_NOMOUNT|FS_LITTER,
銆銆owner:銆銆銆銆THIS_MODULE,
}
inode->i_op = &ramfs_dir_inode_operations;
inode->i_fop = &dcache_dir_ops;
inode->i_sb = sb;
銆銆namespace = kmalloc(sizeof(*namespace), GFP_KERNEL);
銆 list_add(&mnt->mnt_list, &namespace->list);銆//mnt is returned by do_kern_mount()
銆銆namespace->root = mnt;
銆銆init_task.namespace = namespace;
銆銆for_each_task(p) {
銆銆銆銆get_namespace(namespace);
銆銆銆銆p->namespace = namespace;
銆銆}
銆銆set_fs_pwd(current->fs, namespace->root, namespace->root->mnt_root);
銆銆set_fs_root(current->fs, namespace->root, namespace->root->mnt_root);struct nameidata {
銆銆struct dentry *dentry;
銆銆struct vfsmount *mnt;
銆銆struct qstr last;
銆銆unsigned int flags;
銆銆int last_type;
};nd->mnt = mntget(current->fs->rootmnt);
nd->dentry = dget(current->fs->root);
asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type,
unsigned long flags, void * data);sys_mount("hda2","/dev ","ext2",…)錛?/code>
銆銆while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry));

static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
{
銆銆struct vfsmount *mounted;
[1]銆銆mounted = lookup_mnt(*mnt, *dentry);
銆銆if (mounted) {
[2]銆銆銆銆*mnt = mounted;
[3]銆銆銆銆*dentry = mounted->mnt_root;
銆銆銆銆return 1;
銆銆}
銆銆return 0;
}(p->mnt_parent == mnt && p->mnt_mountpoint == dentry)
銆銆sys_mount(".", "/", NULL, MS_MOVE, NULL);
銆銆sys_chroot(".");
]]>