Linux内核解析0.6.doc

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

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 中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。这样带来的明显的好处是精简了内核的初始化代码,而且使得内核的初始化过程更容易定制。这种这种方式的rootfs 是包含在kernel image 之中的。 cpio-initrd: cpio 格式的rootf

文档评论(0)

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

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

1亿VIP精品文档

相关文档