您的位置:首页 > 运维架构 > Linux

linux系统启动过程和内核的认识

2014-03-04 21:53 218 查看
内核的初步认识

内核的功能:
进程管理:
内存管理:
I/O管理:
文件体统:
驱动程序:
安全相关:
注解:其实内核就是一个通用软件或者说是一个平台,它本身并没有什么功
能,只是给其他程序或者硬件提供一个平台,能让他们更好的运行起
来。

内核类型:

内核分为单内核和微内核,微内核一般都是window上用的,虽然功能不错
在线程运行方面比单内核强,但是微内核结构很复杂在此处主要是说linux
所以就不介绍微内核了。
linux一般都是采用的单内核,所谓单内核就是所有功能都做成一个整体,
体系结构单一。为了让单内核更好的使用,做成了模块化,即核心+功能性模
块。而这些能被内核调用的模块叫做内核对象即.ko(kernel object),同
时内核也就能动态装卸载模块。对于linux而言虽然用的是单内核但是linux
也兼具一些微内核的功能,所以linux是一个很受欢迎的操作系统。

linux系统启动流程

介绍完内核了,下面来说说linux系统的启动流程,详细的介绍一下linux启动
初始化的过程,以及内核在其中所充当的角色。
开机的第一步我想大家都知道吧,那就是开机自检(POST),自检是依赖
于CPU,自检的工程就是让CPU去执行之前编译好的代码。CPU执行的那段代
码是放置在ROM下的,刚开机加电CPU干的第一件事就是去ROM下找开机代码,
而这些开机代码就是存放在ROM下的一段地址告诉,通过这段地址CPU去找第一
个可执行程序,然后就接着运行起来,而硬件生产厂商都会在ROM下内置一些开
机代码。
自检之后开始bootloader引导内核,然后加载驱动模块等等一步一步的操作
在介绍下面之前先说一下bootloader。bootloader是在MBR下的,MBR总共有512
个字节,而bootloader就占据了446个字节,分区表占据64个字节,剩下的两个
字节就是5A,用来标记这个bootloader是否有效。讲完了MBR组成,先来说说
这个bootloader到底是干嘛的占据那么多字节数。bootloader就是在开机时给
用户提供了一个选择启动分区系统的菜单,所以说bootloader是必须能识别文
件系统的,然后查找内核分区,找内核去真正的引导系统启动。此时的内核是
显示在根下面的,而真正的内核并没有在根下面放着,只是在那下面创建了一
个目录,然后把这个目录挂载到内核所在的分区上。而bootloader会把内核文
件所在的分区当作是根,读取内核文件的时候也不会去真正的根下面的boot去
找内核文件,而是直接在内核所在的分区直接读取内核文件,然后bootloader
会把读取到的内核文件加载至内存里面。为了节约内存空间一般都是压缩之后
加载至内存里的,其实除了节约内存空间还有一个原因,那就是保证I\O的速度
更快一些。说到这是不是觉得很绕啊,其实很简单就是内核和根不再同一分区上
,为了加快引导启动bootloader会直接去内核的分区加载内核至内存,但是内核
文件是压缩之后加载进去的,再然后bootloader的工作就完了,说白了bootloader
的任务就是将内核加载至内存。这下明白多了吧!
刚才说了内核是压缩之后被加载至内存中去的,那么谁来给他解压缩
呢?此时bootloader已经完成任务退出了,其他程序都还等着内核去
引导加载呢,那么只有内核自己解压缩了。解压之后内核开始自身的
初始化,初始化完成之后就开始启动/sbin/init。然后内核开始加载根,但是加
载根要识别磁盘分区怎么能识别呢?驱动,不错就是靠驱动,磁盘硬件的种类很
多不能每个磁盘驱动都放进内核把,再说一般用户也就只有一种驱动就可以了,
总不能为了一种驱动将那么多的驱动都放进内核吧。怎么解决这样的问题呢?貌
似没有更好的解决办法,但是人类总会想到折中的方法的,将这些硬件驱动做成
模块,用到那个就加载那个。现在问题又来了那么多驱动模块怎么能让内核知道
该用那个驱动呢?这个问题早在装操作系统的时候就解决了,安装操作系统的时
候会有一步将识别的硬件驱动打包放置在和内核文件系统在同一分区的initrd这
个文件里。而这个文件早就被bootloader加载压缩的内核文件时一起加载至内存
中了,在内存中内核会把initrd当作一个磁盘来用,而initrd这个文件下面就有
bin,sbin等等一些根下的文件,所以这个initrd也是一个虚拟的根了。所以内核
会通过initrd这个文件加载驱动,然后内核会把initrd复制到真正的根上面去,
根据这些复制的信息内核就能挂载到真正的根下面去了,而至于initrd这个文件
他不会一直存在内存中而是在被复制完成就会自动退出了。挂载到真正的根下面
接下来的任务就交由init来完成了。

内核将任务棒交给init了,不过init启动起来干的活就多,设定默认运行级别
指定系统运行初始化脚本,启动指定级别下要启动的服务,并关闭需要停止的服
务,定义ctrlaltdel的组合键功能,然后就是根据设定的默认级别选择是进入字
符终端还是图形终端。这样就完成系统启动进入登录界面了,但是需要说的是在
init启动的时候有一步指定系统初始化脚本,而这个脚本就是/etc/rc.d/rc.sysinit
这个文件。这个指定的脚本完成的任务也不少,设置主机名,打印欢迎信息,激
活SElinux和Udev,加载/etc/fatab定义的本地文件系统,设置系统时钟,激活
不同设备,根据/etc/sysctl.conf设置内核参数,还会执行一些清理操作等等。
启动init完成系统脚本的初始化这个系统的启动过程才算是真正的完成了,不过
在这里只是简单的介绍了一下系统的启动过程,里面详细的启动步骤还有很多,
这里就不一一说明。

总结

内核,一个各程序或硬件的平台,调配其他硬件软件的使者的功能。

linux系统启动流程:

POST(自检) --> BIOS(Boot Sequence) --> MBR(bootloader) -->
kernel-->/sbin/init。
这样列出来就很方便的了解系统启动的过程了吧!了解很简单但是真正的要搞
懂原理还是需要多努力的学啊!

本文出自 “千里之行始于足下” 博客,请务必保留此出处http://shlinuxdream.blog.51cto.com/8570170/1367825
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: