现在的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

linux kernel文件系统启动部分的更多相关文章

  1. Linux kernel 文件夹说明

    Linux 内核代码的目录结构 arch: 包含和硬件体系相关的的代码,每种硬件平台占一个相应的目录,如i386,arm, arm64, powerpc,mips等. block: 块设备驱动程序I/ ...

  2. Linux Kernel 排程機制介紹

    http://loda.hala01.com/2011/12/linux-kernel-%E6%8E%92%E7%A8%8B%E6%A9%9F%E5%88%B6%E4%BB%8B%E7%B4%B9/ ...

  3. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  4. 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

    下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述 ...

  5. 从ramdisk根文件系统启动Linux 二

    今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下.其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fedo ...

  6. linux文件系统启动流程、启动脚本

    linux文件系统启动流程.启动脚本 下面是一张Linux启动流程图: 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1. /sbin/init 2. /etc/ ...

  7. linux kernel 模块多文件编译

    /*************************************************************************** * linux kernel 模块多文件编译 ...

  8. Android 怎样在linux kernel 中读写文件

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  9. Linux文件系统启动过程及login的实现

    1. busybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,它将许多常用的LINUX命令和工具结合到了一个单独的可执行程序中.虽然与相应的GNU工具比较起来,busy ...

随机推荐

  1. short-path problem (Floyd) 分类: ACM TYPE 2014-09-01 23:58 100人阅读 评论(0) 收藏

    #include <cstdio> #include <iostream> #include <cstring> using namespace std; cons ...

  2. [HTML/CSS]display:none和visibility:hidden的区别

    写在前面 在群里有朋友问这样一个问题,display:none的标签,影响了布局.这就引出了本篇这样的问题,印象中display:none的块元素是不占位置的. 一个例子 <!DOCTYPE h ...

  3. FullPage.js全屏滚动插件学习总结

    如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面(查看),QQ浏览器的官网站.如果 ...

  4. asp.net @reqister指令

    @register指令通过声明将自定义 ASP.NET 服务器控件添加到页或用户控件中. 1.@register 指令有两种用法如下 <%@ Register tagprefix="t ...

  5. HDU1542 Atlantis(矩形面积并)

    #pragma warning (disable:4996) #include<iostream> #include<cstring> #include<string&g ...

  6. Simulate a seven-sided die using only five-sided

    问题描述: 如题 转述一下问题,就是说你现在有一个正五面体骰子,然后你怎么用这个正五面体骰子去模拟一个正七面体骰子. 这个问题我接触到几种方法,下面一一阐述. 方法一: rand7()=( rand5 ...

  7. POJ 1742

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 27580   Accepted: 9335 Descriptio ...

  8. laravel where中多条件查询

    1. http://www.mobanstore.com/doc/bianchengkaifa/119.html //初学laravel 发现他的查询构造器很好用 //如下 $user = DB::t ...

  9. Javascript 正则表达式_3

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. C# 和Jsonp的一个小demo 用jQuery与JSONP轻松解决跨域访问的问题

    客服端:      在A项目下面 建立一个 JsonpClient.aspx页面,代码如下: <%@ Page Language="C#" AutoEventWireup=& ...