Lomo's BLOG

行之而不著焉 习矣而不察焉 终身由之而不知其道也 众也 ~
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux文件系统的安装(mount)

Posted on 2005-03-10 16:06  Lomo  阅读(824)  评论(0)    收藏  举报

    VFS是一个虚拟的文件系统,要和实际磁盘设备联系还需要将磁盘上的文件系统mount到VFS上面。   

    向文件系统注册有两种途径:一种是在编译核心时确立,并在系统初始化时通过内嵌函数调用向注册表登记;

                                            另一种是利用Linux的Module机制,把文件系统作为一个模块进行装入。

    VFS用get_fs_type得到注册文件的文件系统类型。

    需要指出的是:Linux并非通过设备标识访问某个文件系统(象DOS那样),而是捆绑于一个树状目录上,因此,mount一个文件系统不仅包含了文件及数据,还包含了文件系统本身的树形结构,目录,访问权限等等。

    最初只有唯一的根节点( / ),它存在于内存中而非任何具体设备中。系统初始化将一个根设备安装(/dev)其上,它因此而成为了整个系统中最原始的文件系统。

    值得一提的是mount命令进行系统调用的函数sys_mount():

asmlinkage long sys_mount(char __user * dev_name, char __user * dir_name,
              
char __user * type, unsigned long flags,
              
void __user * data)
{
    
int retval;
    unsigned 
long data_page;
    unsigned 
long type_page;
    unsigned 
long dev_page;
    
char *dir_page;

    retval 
= copy_mount_options (type, &type_page);
    
if (retval < 0)
        
return retval;

    dir_page 
= getname(dir_name);
    retval 
= PTR_ERR(dir_page);
    
if (IS_ERR(dir_page))
        
goto out1;

    retval 
= copy_mount_options (dev_name, &dev_page);
    
if (retval < 0)
        
goto out2;

    retval 
= copy_mount_options (data, &data_page);
    
if (retval < 0)
        
goto out3;

    lock_kernel();
    retval 
= do_mount((char*)dev_page, dir_page, (char*)type_page,
              flags, (
void*)data_page);
    unlock_kernel();
    free_page(data_page);

out3:
    free_page(dev_page);
out2:
    putname(dir_page);
out1:
    free_page(type_page);
    
return retval;
}