学习osv原理需要操作系统启动流程

来源:互联网 发布:unity3d接入支付宝sdk 编辑:程序博客网 时间:2024/05/17 09:32
1.BIOS加电自检:

    计算机启动后,首先会进行固件(BIOS)的自检,即所谓的POST(Power On Self Test),然后把保存在MBR(Master Boot Record,主引导记录)中的主引导加载程序放到内存中。

2.加载主引导加载程序(MBR):

    主引导加载程序通过分区表查找活动分区,然后将活动分区的次引导加载程序从设备读入内存中并运行。具体的过程是BIOS将磁盘的第一扇区(磁盘最开始的512字节)载入内存

3.加载次引导加载程序(GRUB):

    次引导加载程序显示GRUB(GRand Unified Bootloader,GRUB)选择界面,根据用户的选择(就是假如机器上安装了多个操作系统)把相应操作系统的内核映像加载进内存中。


4.Linux内核映像: 


    在内核的引导过程中,会加载必要的系统模块,以挂载根文件系统(/),完成后内核会启动init进程,并把引导的控制器交给init进程。
当内核映像加载到内存并收到第二阶段引导程序的控制信号后,内核阶段开始启
动。内核映像并不是一个可以运行的内核,而只 是一个压缩的映像文件,通常是一个zImage(压缩的映像文件,小于512KB)
或者是一个bzImage(大一点的压缩的映像文件,大于 512KB),内核映像用zlib压缩过。内核映像的头部包含一个小程序,
这个程序仅能做一些最小数量的硬件设置,然后解压内核映像中包含Linux系统 内核并把它放到高位地址的内存区域上。
如果initrd映像也存在,那这个程序也会把initrd映像放到内存并做上标记便于后期使用。
这个 程序最后调用 内核,接着内核启动开始

5.init进程:

    init进程会挂载/etc/fstab中设置的所有文件系统,并根据/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体、网络、启动应用程序等。到这个时候linux系统已经启动完毕,用户这个时候就可以登录系统并进行操作。以上就是linux引导的完整过程。下面我们来看一下它们各个步骤的详细信息。




内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。
几种linux内核文件的区别:
1、vmlinux 编译出来的最原始的内核文件,未压缩。
2、zImage 是vmlinux经过gzip压缩后的文件。
3、bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
4、uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag(64个字节,说明这个映像文件的类型、加载位置、生成时间、大小等信息)。其实就是一个自动跟手动的区别,有了uImage头部的描述,u-boot就知道对应Image的信息,如果没有头部则需要自己手动去搞那些参数。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。
5、vmlinuz 是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。
6、initrd 是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态



这里要介绍一下objcopy命令,它的作用是把一个object文件转化为另一种格式的文件。在这里,objcopy的作用就是去掉原来elf文件中的elf header和一些无用的section信息。为什么要这么做呢?因为elf文件中的elf header和一些section的作用是告诉elf loader如何载入elf可执行文件。但是,linux内核作为一种特殊的elf文件,需要特殊折辅助程序去装载它。往往它的装载地址是固定的。这时,为了保证通用性而存在的elf header和一些section对内核的装载就没有意义了。加上为了使内核尽可能小,所以干脆把这些信息去掉。

0 0
原创粉丝点击