欢迎来到天天文库
浏览记录
ID:17585805
大小:384.00 KB
页数:65页
时间:2018-09-03
《linux内核解析慧知文库》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux内核解析0.6原文地址:http://www.jactc.com/view/2812481901a421483d7f76ba1c2c01b4.htmlLinux内核解析IBootstrap1汇编代码分析2start_kernel函数3准备进入用户态3.1Initrd初始化3.1.0准备知识在讲述如何释放initrd到rootfs之前,有比较讲述一下什么是rootfs,rootfs的初始化相关的函数;以及rootfs的初始化函数是如何被调用的。这里所说的rootfs指的是VFS的根节点/,以及在内存中创建的根目录/下的文
2、件和目录节点,这个文件系统仅仅存在于内存之中,由内核初始化的时候负责创建,该文件系统不会存储到其它非易失性介质上。该rootfs文件系统mnt_init函数调用init_rootfs和init_mount_tree两个函数来负责创建和初始化:void__initmnt_init(void){......//这个函数很简单,就是注册了rootfs的文件系统。init_rootfs();//在这里,将rootfs文件系统挂载,它的挂载点默认为”/”。//最后切换进程的根目录和当前目录为”/”,这也就是根目录的由来。//不过这里只是初
3、始化,等挂载完具体的文件系统之后,//一般都会将根目录切换到具体的文件系统,所以在系统启动之后,//用mount命令是看不到rootfs的挂载信息的。init_mount_tree();}有了rootfs后,就可以将initrd的image释放到rootfs中了,至于哪个函数完成这项工作?在讲述该函数之前,我们首先看看该函数是如何被调用的。首先看kernel_init函数中的do_basic_setup函数:staticint__initkernel_init(void*unused){......do_basic_setup(
4、);}do_basic_setup()是一个很关键的函数,所有直接编译在kernel中的模块都是由它启动的。/**Ok,themachineisnowinitialized.Noneofthedevices*havebeentouchedyet,buttheCPUsubsystemisupand*running,andmemoryandprocessmanagementworks.**Nowwecanfinallystartdoingsomerealwork..*///注意上面的关于该函数的注释:CPU和进程管理模块已经正常工作
5、,但是外设还没初始化。staticvoid__initdo_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中的工作是由popul
6、ate_rootfs函数完成,该函数由rootfs_initcall()所引用。注意到有以下初始化函数:rootfs_initcall(populate_rootfs);如此:也就是说会在系统初始化的时候,也就是do_initcalls被调用的时候,会调用populate_rootfs进行初始化。3.1.1释放initrd总的来说,rootfs分为两种:虚拟rootfs和真实rootfs。现在kernel的发展趋势是将更多的功能放到用户空间完成,以保持内核的精简。虚拟rootfs也是各linux发行厂商普遍采用的一种方式,可以将
7、一部份的初始化工作放在虚拟的rootfs里完成,然后切换到真实的文件系统。在虚拟rootfs的发展过程中,又有以下几个版本:Initramfs:Initramfs是在kernel2.5中引入的技术,实际上它的含义就是:在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统,当内核启动时,内核将这个cpio包解开,并且将其中包含的文件系统释放到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。这样带来的明显的好处是精简了内核的初始化代码,而且使得内核的初始化过程更容易定制。这种这
8、种方式的rootfs是包含在kernelimage之中的。cpio-initrd:cpio格式的rootfsimage-initrd:传统格式的rootfs将在下文具体讲述这两种initrd。populate_rootfs代码如下:/**处理Initramfs/
此文档下载收益归作者所有