今天,收获非常非常多,熟悉了Linux的操作,并了解了整个操作系统的启动过程。Linux的操作网上资料很多很全,我就不细数了。。

我就来回顾和总结一下操作系统 (Ubuntu 10.10 为例) 的全部启动过程。

首先,操作系统的启动过程如下:

BIOS -> MBR -> OS Loader -> OS Kernel -> Application Manager -> Applications.

附上图片一张以更清楚的说明:

下面,我分各个部分回顾操作系统启动过程:

1. BIOS

我们都知道,就如单片机程序一样,写在硬件中的程序都是从一个固定的硬件地址(一般是地址0) 开始执行代码,BIOS 就相当于这个单片机程序,硬件一启动便开始执行,它会进行硬件自检,确保整个硬件系统的完备。

接着,BIOS 将执行权转交给硬盘的初始地址(启动后,自己退出)。这个初始地址后的一段区域就是MBR。

2. MBR

硬盘最开始的512字节是MBR的区域,MBR中存储着 OS Loader (在Ubuntu10.10版本中是GRUB2) 的存储位置,MBR被BIOS唤醒后,将寻找OS Loader 文件,最后将执行权交给 OS Loader。另外,MBR在这512字节中的后 4x4 字节 (除最后两个字节的结束符) 存储了磁盘分区表 (所以只能建立4块分区表) 。

请使用 dd if=dev/sda sb=512 count=1 | hexdump -C 可以看到硬盘前512字节内容:

红色部分是分区表,后面的55 aa 是MBR结束标记。

3. OS Loader

Ubuntu 10.10 使用的 OS Loader 是 GRUB2,GRUB2 的格式非常复杂,下面仅对菜单中的内容做一些分析:

menuentry 'Ubuntu, with Linux 2.6.35-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {

        recordfail

        insmod part_msdos

        insmod ext2

        set root='(hd0,msdos1)'

        search --no-floppy --fs-uuid --set 29fabba2-804f-4592-8a35-649fade30123

        linux   /boot/vmlinuz-2.6.35-22-generic root=UUID=29fabba2-804f-4592-8a35-649fade30123 ro   quiet splash

        initrd  /boot/initrd.img-2.6.35-22-generic

}

set root='(hd0,msdos1)' 的意思是将文件系统的根节点设为hd0 分区的第二块 (0开始)扇区。
linux 及后面的参数是将内核 /boot/vmlinuz-2.6.35-22-generic 加载到内存,并传入之后的参数。UUID 为磁盘分区的ID。
initrd 将加载一个 /boot/initrd.img 的镜像文件,这个文件非常有意思,后文再单独说明。
将这两个文件加载之后,OS Loader 就将权限转交给 OS kernel 了。

4. initrd.img

如果不先说这个文件,后文的kernel就不好说了,那么initrd.img 是用来干什么的?有什么特点?

总的来说,initrd.img 是一个磁盘镜像文件,它的制作就是将磁盘中的一些文件打包压缩。它包含了磁盘等必要的系统驱动,并包含一个执行这些驱动安装程序的脚本文件。

那么,为什么我们需要这么一个文件?

因为海量的设备驱动不能全部塞到kernel中,于是Linux的研究者想出了这么个文件来专门包装硬件驱动等系统运行需要的必要环境。

另外,initrd.img 有几种不同的格式,其中,Ubuntu 10.10 是使用 cpio 格式打包的。。

initrd.img 与 kernel 的关系在下文来介绍。

5. kernel

内核,操作系统中至关重要的部分,在整个系统的启动过程中也是比较复杂的。

kernel 被 OS Loader 启动后,开始一系列初始化操作,初始化过程中,kernel 将调用内存中的指定位置的 init 文件,这个位置,就是initrd.img 被展开的位置。init 文件是一个脚本文件,它将加载 initrd.img 中包含的驱动,这样,kernel 就能正常访问磁盘了。于是,initrd.img 完成它的使命,把执行权转交给真正的文件系统中的 init 脚本, initrd.img 这个镜像文件系统也结束了它的生命。

当然,以上过程只针对 2.6 以上的内核,之前的内核有些不同,总的来说,会有以下几种流程:

PS: 此图凭印象绘制,暂时未确认,确认后我会删除这句PS,嘿嘿~

6. 其他

一旦开始使用真实的文件系统的根的时候,一切就在 kernel 的掌控之下了。之后的事情,顺风顺水。kernel 启动应用程序管理器,接着启动各个应用程序,操作系统的启动完成了。

PS:几个小技巧:

cat /proc/cmdline 可以看到 OS Loader 中 kernal (linux) 的参数,指定了内核及文件系统的根。

/dev/disk/by-uuid 文件夹中包含UUID指向的磁盘分区。

dmsg 可以查看系统启动的显示信息

posted on 2011-02-22 07:56  Tankery  阅读(294)  评论(0编辑  收藏  举报