首页 > 代码库 > 系统启动流程
系统启动流程
将系统自检(BIOS)需要用到的指令,映射进CPU可以查找的线性地址空间(ROM),用来检查硬件是否正常。
内核空间 用户空间
POST---->BIOS(启动顺序)------>MBR(BootLoader,446B)找到启动分区------>Kernel(探测硬件,装载驱动)------>init进程(进程)/sbin/init
备注:
Kernel作用:文件管理、进程管理、内存管理、网络管理、安全功能、驱动程序
内核设计风格:
单内核:一个内核安装所有(linux)
模块化设计:
.ko(kernel object)内核专用模块,核心:很小
.so():外部so模块(内核模块)
内核模块:/lib/modules/“内核版本号命令的目录”/ 如:/lib/modules/2.6.32/ (作用:减少内核的体积)
备注:能够做成内核模块的不仅仅是驱动程序,还有其他的,如:文件系统、加密功能、进程管理的扩展功能
[root@localhost ~]# ls /lib/modules/2.6.32-358.el6.x86_64/kernel/
arch crypto drivers fs kernel lib mm net sound
核心:可以动态加载各种外围内核模块: 当内核识别到一个外围硬件,如:显卡,那么内核的核心会取固定的位置,装载进核心即可,这样内核就可以操作硬件了。
/boot/vmlinuz-2.6.32-358.el6.x86_64
初始化时,加载的内核,只是核心本身。
微内核:需要哪个子系统,取装载就可以。一个子系统,坏了。不影响全局。(实现复杂)(windows,solaris 支持线程)
备注:
1)按启动顺序读取硬盘设备的MBR,如果第一个硬盘MBR无BootLoader,则读第2个硬盘。但如果第一个硬盘
有MBR,但BootLoader损坏,则不会读取第2个硬盘设备。
2)Kernel装载前提:BootLoader识别Kernel所在分区
3)有些目录无法挂载成一个分区,这些目录是与根目录(/)自身完成初始化相关的目录。由于其他目录都是通过根目录才能访问,因此根所在的
分区,通常就是kernel 能够完成进入用户空间的最核心的位置。根所在的分区,叫rootfs(根文件系统),由此把某个分区与/进行了关联关系(挂载)
那么根所在的分区,就是启动OS的入口。系统启动需要的文件在/sbin /bin下,所以这些目录不能独立分区。
取哪找根:由kernel完成,kernel必须装载根目录。然后才能进入用户空间。kernel怎么知道根存在哪个分区?需要指定
4)根文件系统存在与要给硬盘上,假设OS安装包,没有为内核提供此硬盘的驱动程序?那么内核不能访问这个硬盘设备,就无法装载根,这样就无法访问
根下的文件,同样访问不了/lib/modules目录,这样意味着装载不了驱动。这样就有个问题:要想访问根,就需要装载驱动。要想装载驱动,就必须访问根。这样
就矛盾了。(内核要驱动此硬盘,而驱动程序就在硬盘上)
系统启动流程