Linux内核VFS---rootfs文件系统加载

Linux内核VFS---rootfs文件系统加载
对linux-2.6.34源码rootfs文件系统加载学习笔记

1.内核启动调用start_kernel函数进行初始化。
asmlinkage  void  __init start_kernel( void // init\Main.c:528
{
    buffer_init();
    key_init();
    security_init();
    vfs_caches_init(totalram_pages);
// 678行,vfs初始化
    signals_init();
}
2.start_kernel调用vfs_caches_init对vfs进行初始化。
// fs\Dcach.c:2354行
void  __init vfs_caches_init(unsigned  long  mempages)
{
   
.......
    dcache_init();
    inode_init();
    files_init(mempages);
    mnt_init(); 
// mnt初始化
    bdev_cache_init();
    chrdev_init();
}

3.在vfs_caches_init调用fs\namespace.c 2321行的mnt_init函数
void  __init mnt_init( void )
{
    
    init_rootfs();    
// 初始化rootfs文件系统
    init_mount_tree();  // 初始化加载树
}
4. fs\ramfs第308行的init_rootfs函数初始化rootfs文件系统
int  __init init_rootfs( void )
{
    
int  err;

    err 
=  bdi_init( & ramfs_backing_dev_info);
    
if  (err)
        
return  err;

    err 
=  register_filesystem( & rootfs_fs_type); // 注册rootfs文件系统
     if  (err)
        bdi_destroy(
& ramfs_backing_dev_info);

    
return  err;
}
rootfs文件系统信息fs\ramfs第289行
static   struct  file_system_type rootfs_fs_type  =  {
    .name        
=   " rootfs " ,
    .get_sb        
=  rootfs_get_sb,
    .kill_sb    
=  kill_litter_super,
};

5.调用register_filesystem函数将rootfs注册到 file_systems文件系统中。
//fs\Filesystem.c第69行。
int
 register_filesystem( struct  file_system_type  *  fs)
{
    
int  res  =   0 ;
    
struct  file_system_type  **  p;

    BUG_ON(strchr(fs
-> name,  ' . ' ));
    
if  (fs -> next)
        
return   - EBUSY;
    INIT_LIST_HEAD(
& fs -> fs_supers);
    write_lock(
& file_systems_lock);
    p 
=  find_filesystem(fs -> name, strlen(fs -> name));//查找到文件系统加载位置
    
if  ( * p)
        res 
=   - EBUSY;
    
else
        
* =  fs;
    write_unlock(
& file_systems_lock);
    
return  res;
}
file_systems变量是所有文件系统链表的头指针。通过以上过程rootfs_fs_type就加入到了file_systems链表头的file_system_type类型的链表中。可以通过file_systems指针遍历这个链表,得到特定的文件系统file_system_type 指针。

你可能感兴趣的:(Linux内核VFS---rootfs文件系统加载)