根文件系统挂载

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

根文件系统挂载

1) 在RamDisk为initramfs时

start_kernel()->vfs_caches_init()->mnt_init()->init_r ootfs()->init_mount_tree()注册了类型为rootfs的fs 然后:start_kernel 最后rest_init->kernel_init

kernel_init->do_basic_setup->do_initcalls 调用

rootfs_initcall 注册过的函数

rootfs_initcall(populate_rootfs);

populate_rootfs解压initramfs到rootfs, initramfs必须包含init文件,否则还将挂在其他的文件系统然后kernel_init检

查init是否存在,如果有就不会注册其他的根文件系统,

if (sys_access((const char __user *)

ramdisk_execute_command, 0) != 0)

会导致prepare_namespace 不被调用。

否则还会尝试挂在其他的根文件系统。2) 在RamDisk (initrd) 非initramfs时

kernel_init->prepare_namespace->initrd_load->rd_ load_image(加载)->(identify_ramdisk_image)

如果ROOT_DEV != Root_RAM0

则handle_initrd通过linuxrc启动用户态

该种情况可由initrd=0xXXXXX 但root=/dev/mtdblock2矛盾导致。

如果ROOT_DEV == Root_RAM0

rd_load_image加载后,也是通过mount_root加载

Root_RAM0根文件系统

3) 没有RamDisk 例如使用mtd

kernel_init->prepare_namespace->mount_root(加载)############################################ #####################

############################################## ###################

顺手摘一篇写得比较好的initrd分析文章原文:

/blog/static/771555472010 025*********/

Initrd 流程分析(2.6 cpio rootfs)

以Linux-2.6.25 的kernel 为例,分析一下Linux 启动过程中initrd 的流程。1. 先从Makefile说起下面是内核代码

中init/Makefile 文件的一段内容:

obj-y

:= main.o version.o mounts.o

ifneq

($(CONFIG_BLK_DEV_INITRD),y)

obj-y +=

noinitramfs.o

else

obj-$(CONFIG_BLK_DEV_INITRD)

+= initramfs.o

endif

obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o

mounts-y :=

do_mounts.o

mounts-$(CONFIG_BLK_DEV_RAM)

+=

do_mounts_rd.o

mounts-$(CONFIG_BLK_DEV_INITRD)

+= do_mounts_initrd.o

mounts-$(CONFIG_BLK_DEV_MD)

+= do_mounts_md.o

内核中和initrd 相关的代码主要放在init 目录下,包括main.c,noinitramfs.c ,initramfs.c

,do_mounts.c ,do_mounts_initrd.c ,do_mounts_rd.c 和do_mounts_md.c

从Makefile 中可以看出,noinitramfs.c 是在内核不支持initrd 的情况下被编译进内核,而

initramfs.c 正好相反,它处理(cpio包类型的)的initrd 。do_mounts.c

主要是负责挂载根文件系统的,所以总是被编译。

do_mounts_initrd.c 负责调用挂载和处理(ramdisk类型的)的

initrd 。do_mounts_rd.c 是具体实现如何挂载(ramdisk类型的)的initrd 。do_mount_md.c

处理和RAID 有关的一些情况。2. cpio 包类型的initrd 的处理内核在初始化启动的时候会先注册一个叫作rootfs 的

文件系统,然后通过rootfs_initcall

来生成其中的内容。根据内核是否支持initrd 和ramdisk ,rootfs 的生成方法和内容都会有所不同。当内核不支持initrd 时,rootfs_initcall 调用noinitramfs.c 中的

default_rootfs()

函数。default_rootfs() 主要往rootfs 中生成两个目录/dev 和/root 以及一个设备文件

/dev/console 。下面是default_rootfs() 精简过的流程:static int __init default_rootfs(void)

{

sys_mkdir("/dev", 0755);

sys_mknod((const char __user *) "/dev/console",

S_IFCHR | S_IRUSR | S_IWUSR,

相关文档
最新文档