Linux内核解析0慧知文库.DOC

  1. 1、本文档共64页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核解析0慧知文库

 HYPERLINK  Linux内核解析 0.6 原文地址:/view/2812481901a421483d7f76ba1c2c01b4.html Linux 内核解析 I Bootstrap 1 汇编代码分析 2 start_kernel 函数 3 准备进入用户态 3.1 Initrd 初始化 3.1.0 准备知识 在讲述如何释放 initrd 到 rootfs 之前, 有比较讲述一下什么是 rootfs, rootfs 的初始化相关的函数; 以及 rootfs 的初始化函数是如何被调用的。 这里所说的 rootfs 指的是 VFS 的根节点/,以及在内存中创建的根目录/下的文件和目录节点,这个文件系 统仅仅存在于内存之中,由内核初始化的时候负责创建,该文件系统不会存储到其它非易失性介质上。该 rootfs 文件系统 mnt_init 函数调用 init_rootfs 和 init_mount_tree 两个函数来负责创建和初始化: void __init mnt_init(void) { //这个函数很简单,就是注册了 rootfs 的文件系统。 init_rootfs(); //在这里,将 rootfs 文件系统挂载,它的挂载点默认为”/”?? //最后切换进程的根目录和当前目录为”/”,这也就是根目录的由来。 //不过这里只是初始化,等挂载完具体的文件系统之后, //一般都会将根目录切换到具体的文件系统,所以在系统启动之后, //用 mount 命令是看不到 rootfs 的挂载信息的。 init_mount_tree(); } 有了 rootfs 后,就可以将 initrd 的 image 释放到 rootfs 中了, 至于哪个函数完成这项工作?在讲述该函数之 前,我们首先看看该函数是如何被调用的。首先看 kernel_init 函数中的 do_basic_setup 函数: static int __init kernel_init(void * unused) { do_basic_setup(); } do_basic_setup()是一个很关键的函数,所有直接编译在 kernel 中的模块都是由它启动的。 /* * Ok, the machine is now initialized. None of the devices * have been touched yet, but the CPU subsystem is up and * running, and memory and process management works. * * Now we can finally start doing some real work.. */ //注意上面的关于该函数的注释:CPU 和进程管理模块已经正常工作,但是外设还没初始化。 static void __init do_basic_setup(void) { cpuset_init_smp(); usermodehelper_init(); init_tmpfs(); driver_init(); init_irq_proc(); do_ctors(); //启动所有在__initcall_start 和__initcall_end 段的函数, //而静态编译进内核的 modules 也会将其入口放置在这段区间里。 do_initcalls(); } 将 initrd 的 image 释放到 rootfs 中的工作是由 populate_rootfs 函数完成, 该函数由 rootfs_initcall () 所引用。 注意到有以下初始化函数: rootfs_initcall(populate_rootfs); 如此:也就是说会在系统初始化的时候,也就是 do_initcalls 被调用的时候,会调用 populate_rootfs 进行初 始化。 3.1.1 释放 initrd 总的来说,rootfs 分为两种:虚拟 rootfs 和真实 rootfs。现在 kernel 的发展趋势是将更多的功能放到用户 空间完成,以保持内核的精简。虚拟 rootfs 也是各 linux 发行厂商普遍采用的一种方式,可以将一部份的 初始化工作放在虚拟的 rootfs 里完成,然后切换到真实的文件系统。在虚拟 rootfs 的发展过程中,又有以 下几个版本: Initramfs:Initramfs 是在 kernel 2.5 中引入的技术,实际上它的含义就是:在内核镜像中附加一个 cpio 包, 这个 cpio 包中包含了一个小型的文件系统,当内核启动时,内核将这个 cpio 包解开,并且将其中包含的 文件系统释放到 rootfs 中,内核中的一部分

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档