2.2.1¶ÔÐéÄâÎļþϵͳµÄ²Ù×÷
9wMLinuxÁªÃ˸÷¸öÎļþϵͳ¿ÉÒÔÌṩµÄ²Ù×÷µÄÒ»ÀÀÈçÏ£¬ËüÔÚstruct vfsops
9wMLinuxÁªÃË(@sys/mount.h)ÀïÃæ¶¨Ò壺
9wMLinuxÁªÃË¡£¶ÔÎļþϵͳ½øÐÐmountµÄ²Ù×÷
9wMLinuxÁªÃË¡£±¾ÎļþϵͳµÄ¿ªÊ¼¶¯×÷µÄ²Ù×÷
9wMLinuxÁªÃË¡£±¾ÎļþϵͳµÄumount²Ù×÷
9wMLinuxÁªÃË¡£±í´ïÎļþϵͳµÄ¸ùµÄv-nodeµÄ²éÕÒ²Ù×÷
9wMLinuxÁªÃË¡£¶ÔÒ»°ãÓû§µÄȨÏÞ¿ØÖÆ
9wMLinuxÁªÃË¡£È¡µÃÎļþϵͳµÄ״̬
9wMLinuxÁªÃË¡£ÄÚ´æÄڵĹÜÀíÐÅϢдÈë½éÖÊÖÐ
9wMLinuxÁªÃË¡£´Ói-nodeµ½v-nodeµÄÈ¡µÃ²Ù×÷
9wMLinuxÁªÃË¡£v-nodeºÍnfsµÄÎļþ±úµÄÏ໥±ä»»µÄ²Ù×÷
9wMLinuxÁªÃË¡£Îļþϵͳʵ¼ÊµÄÄ£¿éµÄ³õʼ»¯
9wMLinuxÁªÃË9wMLinuxÁªÃ˶ÔÓÚÎļþϵͳ£¬¸÷¸öʵ¼ÊµÄ²Ù×÷routineÔÚvfsopsµÄÐÎʽÌṩ׼±¸¹¤×÷¡£¸÷¸öÎļþϵ
9wMLinuxÁªÃËͳµÄvfsops£¬ÔÚÒÔϵıíÀïµÄsource½øÐж¨Ò壺
9wMLinuxÁªÃË9wMLinuxÁªÃË--------------------------------------------------------------
9wMLinuxÁªÃËfile system vfsopsµÄ¶¨Òå source
9wMLinuxÁªÃË--------------------------------------------------------------
9wMLinuxÁªÃËufs ufs_vfsops ufs/ffs/ffs_vfsops.c
9wMLinuxÁªÃËcd9660 cd9660_vfsops isofs/cd9660/cd9660_vfsops.c
9wMLinuxÁªÃËmsdos msdosfs_vfsops msdosfs/msdosfs_vfsops.c
9wMLinuxÁªÃËmfs mfs_vfsops ufs/mfs/mfs_vfops.c
9wMLinuxÁªÃËnfs nfs_vfsops nfs/nfs_vfsops.c
9wMLinuxÁªÃËnull null_vfsops miscfs/nullfs/null_vfsops.c
9wMLinuxÁªÃËnuion union_vfsops miscfs/union/union_vfsops.c
9wMLinuxÁªÃËprocfs procfs_vfsops miscfs/procfs/procfs_vfsops.c
9wMLinuxÁªÃËkernfs kernfs_vfsops miscfs/kernfs/kernfs_vfsops.c
9wMLinuxÁªÃËfdesc fdesc_vfsops miscfs/fdesc/fdesc_vfsops.c
9wMLinuxÁªÃËdevfs devfs_vfsops miscfs/devfs/devfs_vfsops.c
9wMLinuxÁªÃËext2fs ext2fs_vfsops gnu/ext2fs/ext2_vfsops.c
9wMLinuxÁªÃËlfs lfs_vfsops ufs/lfs/lfs_vfsops.c
9wMLinuxÁªÃËportal portal_vfsops miscfs/portal.portal_vfsops.c
9wMLinuxÁªÃËumap umap_vfsops miscfs/umapfs/umap_vfsops.c
9wMLinuxÁªÃË---------------------------------------------------------------
9wMLinuxÁªÃËÕâЩ¾ÍÊÇÎļþϵͳµÄʵ¼ÊÄ£¿é(*_vfsops.c)£¬ÎļþϵͳÃû³Æ£¬ÎļþϵͳºÅµÈµÈ
9wMLinuxÁªÃËÔÚstruct vfsconf(@sys/mount.h)ÀïÃæ»ã×Ü£¬¸÷¸öÄ£¿éÀïÓúêVFS_SET()½øÈëºË
9wMLinuxÁªÃËÐÄ¡£
9wMLinuxÁªÃ˸ù¾Ýmain()(@kern/init_main.c),ÔÚkernel³õʼ»¯µÄ¹ý³ÌÖУ¬vfsinit()
9wMLinuxÁªÃË(@kern/vfs_init.c)ÀïÃæÓÐ
9wMLinuxÁªÃËstruct vfsconf *vfsconf[MOUNT_MAXTYPE+1];
9wMLinuxÁªÃËstruct vfsops *vfssw[MOUNT_MAXTYPE+1];
9wMLinuxÁªÃ˸÷ÖÖ¶«Î÷µÄÉ趨£¬ÕâЩÊÇ£¬¹ÜÀímountÐÅÏ¢µÄstruct mount(@sys/mount.h)µÄ³ÉÔ±
9wMLinuxÁªÃËmnt_vfcºÍmnt_opÒªÖ¸¶¨Ëù¶ÔÓ¦µÄÎļþϵͳµÄvfsconf,vfssw¡£»¹ÓкêVFS_²Ù×÷Ãû
9wMLinuxÁªÃË(struct mount *,..)À¿ÉÒÔ¸÷¸ö²Ù×÷µÄµ÷Óá£
9wMLinuxÁªÃË9wMLinuxÁªÃË2.2.2¶Ôv-nodeµÄ²Ù×÷
9wMLinuxÁªÃËÐéÄâÎļþϵͳ¾ÍÊÇͨ¹ý¶Ôi-nodeµÄ³éÏó»¯Ö®ºóµÄv-nodeµÄÎļþ/Ŀ¼½øÐÐio´¦Àí¡£
9wMLinuxÁªÃËΪÁËÕâ¸öÄ¿µÄ£¬×÷Ϊ¶Ôv-nodeµÄÊÊÓô¦Àí£¬ÓÐ
9wMLinuxÁªÃË¡£´Óv-nodeµ½ÎļþÃûµÄ²éÕÒ£¬·µ»Øv-node
9wMLinuxÁªÃË¡£´ò¿ª/¹Ø±Õv-node
9wMLinuxÁªÃË¡£¼ì²éÊÇ·ñ¿ÉÄÜ·ÃÎÊv-node
9wMLinuxÁªÃË¡£µÃµ½-v-nodeµÄÊôÐÔ
9wMLinuxÁªÃË¡£É趨v-nodeµÄÊôÐÔ
9wMLinuxÁªÃË¡£¶Ôv-nodeµÄÊäÈë/Êä³ö
9wMLinuxÁªÃË¡£À©Õ¹v-nodeµÄÓ²Á¬½ÓºÍ·ûºÅÁ¬½Ó
9wMLinuxÁªÃË¡£¶Ôv-node½øÐÐĿ¼µÄ×÷³ÉºÍɾ³ý
9wMLinuxÁªÃË¡£¡£¡£¡£
9wMLinuxÁªÃËÓÉÕâÀ↑ʼ£¬Ò»¹²¶¨ÒåÁË41¸ö¡£
9wMLinuxÁªÃËv-nodeÓÉstruct vnode(@sys/vnode.h)ÀﶨÒ壬×÷ΪÀà±ðÔÚenum vtype
9wMLinuxÁªÃËÀïÃæ±íʾ³öÀ´£¬Ò»¹²ÊÇ9ÖÖÀà¡£Ëü°üº¬×ÅÔÚ¸÷¸öÎļþϵͳÉ϶Ը÷¸öµÄÎļþ/Ŀ¼£¨°ü
9wMLinuxÁªÃËÀ¨ÌØÊ⣩Îļþ½øÐÐͳһʶ±ðµÄÐÅÏ¢¡£ÎªÁËʵÏÖÕâÑù£¬v-nodeÒ»Á¬´®µÄ²Ù×÷¾ÍÊÇÔÚ¸÷
9wMLinuxÁªÃËÄ£¿éÀïͨ¹ýºêVNODEOP_SET()ºÍºËÐÄͨѶ¡£ÕâЩ²Ù×÷ÃûºÍʵÏÖµÄroutineÖ»ÐèÒª±ØÒª
9wMLinuxÁªÃ˵ö¶ÔÓ¦¡£ÔÚºËÐijõʼ»¯Àvfs_opv_init()(@kern/vfs_init.c)¾Íʹ´ÓÊý¾ÝµÃ
9wMLinuxÁªÃ˵½µÄºÅÂëÒ»Ò»¶ÔÓ¦£¬ÊÕ¼¯ÁËroutineµÄµØÖ·µÄͬһsizeµÄÅäÁÐÔÙ½øÐÐ×éºÏ¡£¸÷¸ö
9wMLinuxÁªÃËv-node¾ÍÒ»¸öÒ»¸öÖ¸ÏòÕâЩÅäÁС£¶Ôv-nodeµÄ²Ù×÷ÔÚvnode_if.hÀﶨÒ壺
9wMLinuxÁªÃËËüÒÔ
9wMLinuxÁªÃËVOP_²Ù×÷Ãû(v-node,...)
9wMLinuxÁªÃ˵ÄͳһÐÎʽ¼ÇÊö¡£
9wMLinuxÁªÃË9wMLinuxÁªÃËÏÂÃæÊǶÔv-nodeµÄ²Ù×÷µÄ¶¨Òåsource£º
9wMLinuxÁªÃË------------------------------------------------------------------------
9wMLinuxÁªÃ˸÷¸öv-node²Ù×÷£¨vnodeopv£© source
9wMLinuxÁªÃË------------------------------------------------------------------------
9wMLinuxÁªÃËcd9660_fifoop_opv_desc isofs/cd9660/cd9660_vnops.c
9wMLinuxÁªÃËcd9660_specop_opv_desc isofs/cd9660/cd9660_vnops.c
9wMLinuxÁªÃËcd9660_vnodeop_opv_desc isofs/cd9660/cd9660_vnops.c
9wMLinuxÁªÃËdead_vnodop_opv_desc miscfs/deadfs/dead_devfs_vnops.c
9wMLinuxÁªÃËdevfs_vnodeop_desc miscfs/devfs/devfs_vnops.c
9wMLinuxÁªÃËext2fs_fifoop_opv_desc gnu/ext2fs/ext2fs_vnops.c
9wMLinuxÁªÃËext2fs_specop_opv_desc gnu/ext2fs/ext2fs_vnops.c
9wMLinuxÁªÃËext2fs_vnodeop_opv_desc gnu/ext2fs/ext2fs_vnops.c
9wMLinuxÁªÃËfdesc_vnodeop_opv_desc miscfs/fdesc/fdesc_vnops.c
9wMLinuxÁªÃËffs_fifoop_opv_desc ufs/ffs/ffs_vnops.c
9wMLinuxÁªÃËffs_specop_opv_desc ufs/ffs/ffs_vnops.c
9wMLinuxÁªÃËffs_vnodeop_opv_desc ufs/ffs/ffs_vnops.c
9wMLinuxÁªÃËfifo_nfsv2nodeop_opv_desc nfs/nfs_vnops.c
9wMLinuxÁªÃËfifo_vnodeop_opv_desc miscfs/fifofs/fifo_vnops.c
9wMLinuxÁªÃËkernfs_vnodeop_opv_desc miscfs/kernfs/kernfs_vnops.c
9wMLinuxÁªÃËlfs_fifoop_opv_desc ufs/lfs/lfs_vnops.c
9wMLinuxÁªÃËlfs_specop_opv_desc ufs/lfs/lfs_vnops.c
9wMLinuxÁªÃËlfs_vnodeop_opv_desc ufs/lfs/lfs_vnops.c
9wMLinuxÁªÃËmfs_vnodeop_opv_desc ufs/mfs/mfs_vnops.c
9wMLinuxÁªÃËmsdosfs_vnodeop_opv_desc msdosfs/msdosfs_vnops.c
9wMLinuxÁªÃËnfsv2_vnodeop_opv_desc nfs/nfs_vnops.c
9wMLinuxÁªÃËnull_vnodeop_opv_desc miscfs/nullfs/null_vnops.c
9wMLinuxÁªÃËportal_vnodeop_opv_desc miscfs/portal/portal_vnops.c
9wMLinuxÁªÃËprocfs_vnodeop_opv_desc miscfs/procfs/procfs_vnops.c
9wMLinuxÁªÃËspec_nfsv2nodeop_opv_desc nfs/nfs_vnops.c
9wMLinuxÁªÃËspec_vnodeop_opv_desc miscfs/specfs/spec_vnops.c
9wMLinuxÁªÃËumap_vnodeop_opv_desc miscfs/umapfs/umap_vnops.c
9wMLinuxÁªÃËunion_vnodeop_opv_desc miscfs/union/union_vnops.c
9wMLinuxÁªÃË------------------------------------------------------------------------
9wMLinuxÁªÃËÕâ¸ö»ù´¡ÉÏ£¬spec_vnodeop_opv_specÀïÃèÊöµÄ²Ù×÷Ⱥ¾ÍÊÇdevice driver
9wMLinuxÁªÃËinterfaceµÄ¶«Î÷£¡£¡
9wMLinuxÁªÃË9wMLinuxÁªÃË( ±¾Ð¡½ÚÍ꣬´ý±¾µºÖ÷ÓпÕÔÙ¼ÌÐø )
9wMLinuxÁªÃË9wMLinuxÁªÃË9wMLinuxÁªÃËFreeBSDºËÐÄ̽ÌÖ.6.Çý¶¯³ÌÐòƪ
9wMLinuxÁªÃË9wMLinuxÁªÃË2.3 mount¸ùĿ¼֮ǰµÄ´¦Àí¸ÅÒª
9wMLinuxÁªÃËmount¸ùĿ¼µÄʱºò£¬main()(@kern/init_main.c)µÄ³õʼ»¯µÄ¹ý³Ì´Óxxx_vfs_mountroot()
9wMLinuxÁªÃË(@kern/init_mail.c)±»µ÷ÓÿªÊ¼¡£Èç¹û´¦Àí¹ý³ÌÕý³££¬¾Í¶ÔrootvpÉ趨°üº¬ÁËrootµÄ
9wMLinuxÁªÃËv-node¡£
9wMLinuxÁªÃË¡£main()µÄ³õʼ»¯¹ý³ÌÖУ¬configure()(@autoconf.c)±»µ÷Óá£ÔÚÕâ¸ö£¬ioÉ豸
9wMLinuxÁªÃ˳õʼ»¯ÍêÁ˺󣬾Í×ªÒÆµ½ÈçÏÂÁ½¸ö±äÁ¿µÄµØÖ·£ºÒ»¸öÊÇmountroot,ÊÇ´¦ÀímountµÄroutine,
9wMLinuxÁªÃËÁíÒ»¸öÊÇmountrootvfsops,ÊÇ´¦ÀíÐéÄâÎļþϵͳµÄroutine¡£ÔÚ±¾»ú´ÅÅÌÖУ¬¾Í½øÈë±äÁ¿
9wMLinuxÁªÃËrootdevËùÖ¸¶¨µÄdiskºÅÖС£ÕâÀï¾ÍÊÇ,¼Ù¶¨±¾»ú´ÅÅÌ
9wMLinuxÁªÃËmountroot vfs_mountroot
9wMLinuxÁªÃËmountrootvfsop &ufs_vfsops
9wMLinuxÁªÃËrootdev boot disk number
9wMLinuxÁªÃË9wMLinuxÁªÃË¡£xxx_vfs_mountroot()(@kern/init_main.c)
9wMLinuxÁªÃËÔËÐÐ(*mountroot)(mountrootvfsops)ºó£¬¾ÍÖ¸Ã÷ÁËroot file systemµÄmount.
9wMLinuxÁªÃË¡£vfs_mountroot()(@kern/vfs_conf.c)
9wMLinuxÁªÃ˹ÜÀímountµÄÁËÎļþϵͳµÄÐÅÏ¢µÄstruct mount(@sys/mount.h),¶ÔËü½øÐÐÈ·ÈÏ
9wMLinuxÁªÃË£¬È»ºóÉ趨´«µÝ¹ýÀ´µÄ¶ÔÐéÄâÎļþϵͳµÄ²Ù×÷Ⱥ(&ufs_vfsops),²Å½øÐÐ"root"
9wMLinuxÁªÃ˱ê¼Ç¡£¸ù¾ÝVFS_MOUNT(mp,...)½øÐÐmountÕâ¸öÐéÄâÎļþϵͳ¡£mount³É¹¦ºó£¬¾Í
9wMLinuxÁªÃË×·¼Ófile systemµÄlist¡£ÕâÀÓÉÓÚ´«µÝÁË&ufs_vfsops£¬¾Í¿ÉÒÔµ÷ÓÃ
9wMLinuxÁªÃËffs_mount()(@ufs/ffs/ffs_vfsops.c)
9wMLinuxÁªÃË¡£ffs_mount()
9wMLinuxÁªÃËÊ×Ïȵ÷ÓÃbdevvp()(@kern/vfs_subr.c),½øÐÐVBLKÀà±ð£¬spec_vnodeop_p
9wMLinuxÁªÃË(@misc/specfs/spec_vnops.c) v-node²Ù×÷£¬±£Ö¤É趨ÁËÇý¶¯ºÅµÄrootdevµÄ
9wMLinuxÁªÃËv-nodeµÄ×îÐÂÐÅÏ¢£¬È»ºóÉ趨rootvp¡£×îºó£¬Í¨¹ýffs_mountfs()µ÷ÓýøÐÐʵ¼Ê
9wMLinuxÁªÃ˵Ämount rootvp²Ù×÷¡£
9wMLinuxÁªÃË¡£ffs_mountfs()
9wMLinuxÁªÃ˸÷ÖÖ¸÷ÑùµÄ¼ì²éÍêÁ˺󣬵÷ÓÃVOP_OPEN(),´ò¿ªrootvpµÄv-node¡£ÔÚÕâÀÈç¹û
9wMLinuxÁªÃËv-nodeµÄv_op³ÉÔ±ÔÚspec_vnodeop_p´æÔڵϰ£¬¾Íµ÷ÓÃspec_open()(@misc/
9wMLinuxÁªÃËspecfs/spec_vnops.c)¡£
9wMLinuxÁªÃË.spec_open
9wMLinuxÁªÃËÓÉÓÚVBLKÀï°üº¬v-nodeµÄÖÖÀ࣬´Óv-nodeÖ¸¶¨µÄdeviceºÅÈ¡µÃmajorµÄ
9wMLinuxÁªÃ˺ţ¬µ÷ÓöÔÓ¦driverµÄXXopen() routine
9wMLinuxÁªÃË9wMLinuxÁªÃËÐøÉÏ£¬ÓÉVOP_IOCTL()(»¹ÊǵÄͨ¹ýspec_ioctl()(@misc/specfs/spec_vnops.c))
9wMLinuxÁªÃË¿ÉÒԵõ½partitionÐÅÏ¢£¬È»ºó¸Ã¼ì²ésuper blockµÄÄÚÈÝ¡£ÕýÈ·µÄ»°£¬¾ÍÔÚstruct
9wMLinuxÁªÃËufsmount(@ufs/ufs/ufsmount.h)É趨unix file system£¬ÕâÑù´¦Àí¹ý³Ì¾ÍÍêÁË¡
LinuxÁªÃËÊÕ¼¯ÕûÀí ,תÌùÇë±êÃ÷ÔʼÁ´½Ó,ÈçÓÐÈκÎÒÉÎÊ»¶ÓÀ´±¾Õ¾
LinuxÂÛ̳ÌÖÂÛ