Chinaunix首页 | 论坛 | 博客
  • 博客访问: 487316
  • 博文数量: 104
  • 博客积分: 3045
  • 博客等级: 少校
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-29 10:18
文章分类

全部博文(104)

文章存档

2011年(72)

2010年(1)

2009年(1)

2008年(30)

分类: LINUX

2011-03-02 13:14:31

Linux 初始 RAM 磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,但是在一些嵌入式的系统中,则把它当做最终的根文件系统。下面看看initrd 的启动加载过程。
1 initrd 的加载处理流程
   在编译内核的时候相应的增加initrd的选项,然后编译出的内核是带有initrd文件系统的内核,具体的放在
.init.ramfs : { *(.data) } 段处。在usr 目录下有gen_init_cpio.c 这个是在编译的过程中,制定根文件系统的目录用来声称文件系统镜像。至于linux2.6 内核支持两种格式的 initrd,网上有很多资料,这里不做解释了。
  编译完带有Initrd的文件系统之后,现在2.6的内核处理流程如下
  (1)boot loader 把内核以及 initrd 文件加载到内存的特定位置。
  (2)镜像放置
  populate_rootfs(void)
{
   char *err = unpack_to_rootfs(__initramfs_start,
__initramfs_end - __initramfs_start);
   加载initramfs, initramfs位于地址__initramfs_start处
}
将文件系统镜像放置到对应的位置处。
(3)对image-initrd的处理 在prepare_namespace函数里,包含了对image-initrd进行处理的代码,相关代码如下
void __init prepare_namespace(void)
{
if (initrd_load())
goto out;
mount_root();
}
内核在启动的过程中会挂在rootfs做一些临时的初始化,而这个rootfs 其实是一个RAMFS而已,当Intrd作为最终的文件系统的时候,内核其实没有再挂载其他的文件系统,而是在rootfs里面将intird 写到/dev/ram0里面中去,然后挂载为根文件系统就OK了。
int __init initrd_load(void)
{
if (mount_initrd) {
create_dev("/dev/ram", Root_RAM0);
/*
* Load the initrd data into /dev/ram0. Execute it as initrd
* unless /dev/ram0 is supposed to be our actual root device,
* in that case the ram disk is just set up here, and gets
* mounted in the normal path.
*/
下面在rd_load_image之后是直接退出,因为我们将RAM0当做根文件系统挂载的。
if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) {
sys_unlink("/initrd.image");
handle_initrd();
return 1;
}
}
sys_unlink("/initrd.image");
return 0;
}
下面看看挂载/dev/ram0 的过程
void __init mount_root(void)
{
看一种情况就可
#ifdef CONFIG_BLOCK
create_dev("/dev/root", ROOT_DEV); 创建/dev/rma0 一样的设备文件
mount_block_root("/dev/root", root_mountflags); 
上面的这行就是将我们的Intird镜像真正的挂载成根文件系统,这样就完成了根文件系统的挂载,然后就会启动文件系统里面的初始化文件,/linuxrc或者/init 等。
#endif
}

其中做一些说明其实rootfs 和 ramfs 一样是同一种基于内存的文件系统
static struct file_system_type ramfs_fs_type = {
.name = "ramfs",
.get_sb = ramfs_get_sb,
.kill_sb = ramfs_kill_sb,
};
static struct file_system_type rootfs_fs_type = {
.name = "rootfs",
.get_sb = rootfs_get_sb,
.kill_sb = kill_litter_super,
};



阅读(615) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-05 16:51:38

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com