PC机(OS Linux)启动流程大多都差不多首先回顾一下,当按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不稳定,主板控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU初始化。当电源开始稳定供电后芯片组便撤去RESET信号,CPU马上就从地址FFFF0H处开始执行指令,这个地址在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。
    启动流程(这是一个接力过程)
    系统BIOS的启动代码首先要做的事情就是进行POST(Power On Self Test,加电自检),我们都知道CPU自己本身什么事情都不会做,就是执行预先编排好的cpu指令,而指令需要从内存中取。当系统刚开机的那一刻内存中什么都没有,所以这个时候系统必须要完成自己的过程这就意味着必须要有硬件完成固化指令,所以在硬件设计的最初在开机的时候由cpu指挥将某个特定的设备下的内容装载进内存,而这个过程会将系统所用到的指令程序映射进CPU可以查找到的物理地址空间中。
    根据固化指令中定义的信息设置了BIOS(boot sequece)启动次序设定外部的IO设备或者存储设备自上而下寻找MBR。MBR中446字节的bootloader。bootloader很关键它会根据MBR中的分区表查找活动分区,也就意味着找到操作系统所在的分区并加载分区中的内核(当bootloader找到MBR只要读取了MBR如果该MBR损坏无法正常启动bootloader不会寻找第二个设备)。当bootloader获得控制权后就会加载用户选定的磁盘分区中的内核,内核一般都是压缩存放,此时装载内核至内存在内存中完成解压缩功能而后将控制权交给内核。此时内核获得整个系统的控制权内核需要探测每个硬件;操作系统最重要的组件(文件系统,进程管理,内存管理,安全模式,驱动程序,网络管理),而此时内核只需要探测内存管理、进程管理、文件系统、驱动程序并让其正常工作。当内核获取到所有控制权此时会尝试启动用户管理进程即所谓执行sbin/init二进制执行文件。init执行文件是用户进程空间主导程序,所有用户空间启动的进程都由init负责管理除非用户需要和内核打交道才会切换至内核空间。此时整个系统启动流程至此结束
    运行级别
    LInux中对于系统的安全模式表现形式为系统的运行级别,运行级别就是系统服务运行的级别,由0-6个级别组成。
    0:halt,关机
    1:single user model,直接以管理员身份切入
    2:multi user model,NO NFS网络文件系统(默认不启用NFS;当系统默认挂在NFS而NFS启动不了系统就挂了)
    3:multi user model,text model 只有命令行不启动图形界面
    4:reserved ,默认级别
    5:multi user model,graphic model 图形模式
    6:reboot,重启
    内核设计
    在linux上内核有着独特的设计结构。linux有两种内核结构。
    单内核:将所有功能都做进内核,内核靠一个进程来完成所有功能
    微内核:将各种外围设备都做成子系统,当需要哪个子系统由内核来调度子系统。
    由于微内核依赖各个子系统导致微内核之间的调度非常复杂。就理论上来讲微内核具有先天的设计优势但由于设计过程过于复杂导致失去了其本身具有的优势,事实上相对于微内核相比单内核优势并不是特别明显。而现在单内核充分采取了微内核的设计思想并且避免了微内核的复杂的调度设计,就目前来讲大多数Linux都属于单内核而Windows、Solaris属于微内核。对于微内核来讲是具有真正意义上的多线程,而对于单内核多线程只是轻量级进程,既然linux属于单内核所有功能都压进内核而内核要识别市面上各种各样的设备驱动就意味着linux内核的大小将会非常非常大,事实上Linux内核为了尽可能支持更多平台内置了20多种架构,代码现在有数千万行解压以后所有文件有几百MB大小。例如Linux为了支持手机端平台提供了Android的ARM架构,IPhone的power-pc架构,嵌入式架构等等等等。而真正用户使用的可能只有一种,这就意味着庞大的内核有绝大多数部分是使用不上的由此只需要选择一种架构进行内核编译再进行一压缩只有1-2M大小,而对于发行版Linux来讲编译好的内核用户无法选定某一种特定的架构就是说这么一来Linux发行版商不得不兼容不同用户的不同硬件设备如果将所有设备都做进内核依然无法避免内核庞大的现状。因此Linux内核采用模块化设计,由核心模块(kerner object)和外围模块组成。核心模块很小可以完成外围模块的动态加载,核心模块通过探测硬件可以获取外围设备的属性如名称、型号找到所需的程序然后到某个路径下将该程序装载进内存进行驱动。系统可以有多个内核,内核的外围设备文件一般的在 /lib/modules/下有一个以内核版本为目录的文件夹,内核自身在boot/下以vmlinuz版本号为文件名的文件目录