代码改变世界

linux kernel文件系统启动部分

2016-08-30 17:04  cascle  阅读(1126)  评论(0编辑  收藏  举报

  现在的kernel里,有个叫做ramfs的文件系统,会把initrd(或者ramdisk,为惯性叫法)里的东西挂载到early-rootfs里(即rootfs,是ramfs的一个特殊实例),执行一些在kenrel里很难执行的操作,这样简化了kernel,方便了调试。随后可以根据需要用switch root过程删掉现在的rootfs,把真正的根文件系统挂载起来。

       早期kernel里的这个机制叫做ram disk,但这个机制比较慢,弊端比较多,所以kernel里被ramfs给替代了,但实体文件还叫initrd,而非initramfs。initramfs是在kernel后边附加一个cpio格式的image,initrd是一个独立于kernel的cpio image。

       tmpfs是ramfs的衍生物,可以将文件写入swap中,ramfs不可以;tmpfs有大小限制。tmpfs位于mm/shmem.c中,而非fs下

 

      在start_kernel函数里,和文件系统相关的启动流程如下:

      start_kernel——>vfs_caches_init_early————vfs_caches_init———————— rest_init——>kernel_init————>kernel_init_freeable                                                                                                                                                                                                

                                            |                                     |                                                                                            |

                                dcache_init_early                kmem_cache_create                                                               do_basic_setup————>shmem_init(tmpfs初始化)

                                             |                                     |                                                                                           |

                                inode_init_early                       dcache_init                                      sys_open((const char __user *) "/dev/console", O_RDWR, 0)(标准输入文件描述符)

                                                                                   |                                                                                            |

                                                                              inode_init                                                                         (void) sys_dup(0);

                                                                                   |                                                                                             |

                                                                              files_init                                                                            (void) sys_dup(0);

                                                                                   |                                                                                             |

                                                                              mnt_init                                                                                /  存在/init? \                                                          

                                                                                   |                                                                                    Y                   N

                                                                         bdev_cache_init                                                                       /                         \

                                                                                   |                                              执行/init,没有根文件系统了                            prepare_namespace

                                                                            chrdev_init                                        (initramfs,安卓目前采用的)                                          |

                                                                                                                                                                                                           initrd_load

                                                                                                                                                                                                                 |

                                                                                                                                                                                          mount_root(下边的流程挂载真正根文件系统)

                                                                                                                                                                                                                 |

                                                                                                                                                                                                      devtmpfs_mount("dev")

                                                                                                                                                                                                                 |

                                                                                                                                                                                          sys_mount(".", "/", NULL, MS_MOVE, NULL)

                                                                                                                                                                                                                  |

                                                                                                                                                                                                          sys_chroot(".")

 

 

 

 

 

 

 

start_kernel
     |
     |
     V
vfs_caches_init_early-------------------->dcache_init_early
                                                |
                                                |
                                          inode_init_early