将系统自检(BIOS)需要用到的指令,映射进CPU可以查找的线性地址空间(ROM),用来检查硬件是否正常。
内核空间 用户空间
POST---->BIOS(启动顺序)------>MBR(BootLoader,446B)找到启动分区------>Kernel(探测硬件,装载驱动)------initrd----->(ROOTFS)------>init进程/sbin/init
详解启动过程:
bootloader(MBR):由OS安装程序提供,但不属于任何OS,win8系统以后,安装windows OS,会将bootloader锁死,不能再安装其他OS,除非清掉MBR,这样就无法引导
win8了。(linux可以引导其他OS)
linux常见bootloader:
LILO:linux Loader(不支持8G以上的分区)
GROB:GRand Unified Bootloader
分为2个阶段,阶段1:位于MBR。阶段1的作用是引导阶段2;阶段2:引导OS,位于跟内核同分区中,/boot/grub/目录
init要完成的工作:
运行级别:启动的服务不同,级别不同
0 关机
1 单用户模式(类似于windows 安全模式),直接以root用户切入,不需要用户名和密码
2 多用户模式,不启用NFS模式
3 多用户模式,文本模式
4 保留
5 多用户模式,图形界面
6 重启
$cat /etc/inittab 命令修改
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目录,这样意味着装载不了驱动。这样就有个问题:要想访问根,就需要装载驱动。要想装载驱动,就必须访问根。这样
就矛盾了。(内核要驱动此硬盘,而驱动程序就在硬盘上)解决方法:
OS安装程序,知道内核有没有硬盘的驱动程序,如果没有,在安装最后一步,会通过脚本动态搜集内核要访问硬盘需要哪些内核模块,并动态生成这个文件(
此文件存在于:1)RHEL5存在ramdisk中,文件名叫initrd,2)RHEL6存在于ramfs,文件名叫initramfs中),这个文件就是虚根,包括:/bin /sbin /lib等,系统启动后,会切换根。将虚根中的/proc /sys /dev 3个目录拷贝到新根。
根切换命令:chroot
#mkdir /test/virroot -pv #创建虚根
#mkdir /test/virroot/bin
#cp /bin/bash /test/virroot/bin/
拷贝/bin/bash所依赖的库拷贝到虚根中
#ldd /bin/bash #查看可执行程序所依赖的共享库
#mkdir /test/virroot/lib
#cp 依赖的库文件 /test/virroot/lib
#chroot /test/virroot/ 切换根