赞
踩
B站资源:操作系统_清华大学(向勇、陈渝)
Github资源:chyyuu/os_course_info
"启动"的英文,boot原意指靴子,但是在计算机中却被翻译成启动。主要是因为boot和bootstrap的缩写,来自以下谚语:
pull oneself up by one’s bootstraps.
通过拉自己的鞋带将自己拽起,显然这是个矛盾的事情。最早,工程师就用这句谚语来比喻早期的计算机开启。计算机的启动需要运行程序,但是运行程序又需要计算机启动,这个过程也很矛盾。早期为了开机,必须将一小段程序装进内存,这样计算机才可以正常启动,所以工程师们将这个过程叫做“拉鞋带”,之后就被简称为boot;
整个启动过程主要分为四个阶段:BIOS启动–>MBR读取–>BootLoader执行–>系统加载
在上个世纪70年代,“只读内存”(read-only memory,缩写为ROM)被发明,开机程序被刷入ROM芯片(BIOS与硬件系统集成在一起(计算机主板上的ROM或者EEFROM),所以也被称为固件。),计算机通电的第一件事情就是初始化固件(芯片集),读取它,而这块芯片里面的程序就叫做"基本输入输出系统"(Basic Input/Output System),简称BIOS。
BIOS内部被分为两块区块:
code block(普通程序)
boot block(引导程序)
上电后,boot block会被执行,并检查code block的代码是否正确,如果正确,则转到code block继续执行。
ROM断电不会丢失内容,因此保证了“拽着鞋带拉起自己”的情况不会发生,系统一上电,处理器就会执行第一条指令地址,被定为到BIOS存储器,初始化开始,在X86
中,CPU加电后跳转至BIOS的固定物理地址0XFFF0
。
但是BIOS
启动方式大多都由汇编开发,效率较低,代码与设备的耦合度较高,受硬件的影响较大。除此之外也存在性能、扩展性的问题,之后UEFI
(Unified Extensible Firmware Interface,统一可扩展固件界面)便横空出世。UEFI
是一种个人电脑系统规格,用来定义操作系统与系统硬件之间的软件界面,作为BIOS
的替代方案。细节可以参考计算机启动过程,UEFI启动和Bios(Legacy)启动的区别。最为明显的区别就是UEFI启动是不需要硬件检测过程的。
BIOS过程
UEFI过程
计算机中可能会存在多个存储设备,例如硬盘、可移动硬盘、U盘等,计算机可以根据用户对这些设备设定的优先级进行优先启动。则BIOS会根据这个顺序将计算机的控制权交给排在第一位的存储设备。而这个排位第一的存储设备的第一个扇区也被称为主引导记录MBR(Master Boot Record),容量仅仅只有512字节,放不了太多的东西,存储着启动引导过程的一小部分计算机代码,告诉计算机去硬盘的哪一个位置去找操作系统。主要可以分为三个部分:
- 第1-446字节:调用操作系统的机器码;
- 第447-510字节:分区表(Partition table);
- 第511-512字节:主引导记录签名(0x55和0xAA)。
BootLoader又叫做操作系统内核加载器(OS Kernel Loader),是电脑上电后执行的第一条程序,因此绝对不会依赖于内核。Linux最先上是通过LILO(LInux LOader)引导的,后来又出现了GNU的软件GRUB(GRand Unified Bootloader),这2种Bootloader广泛应用在X86的Linux系统上。你的开发主机可能就使用了其中一种,熟悉它们有助于配置多种系统引导功能。详细可参考:GNU GRUB,LILO详细介绍,bootloader 详细介绍。
LILO | GRUB |
---|---|
无交互命令界面 | 有交互命令界面 |
不支持网络引导 | 支持 |
错误配置MBR回让系统无法引导 | 如果配置文件错误,则默认跳转到GRUB命令行界面 (曾经刷机遇到过GRUB黑屏界面:Win+ubuntu单硬盘双系统安装(雷神新911机型) |
以GRUB为例,GRUB加载后首先进行内存盘初始化,BootLoader 会将存储介质中的 initrd
文件加载到内存,内核启动时会在访问真正的根文件系统之前先访问内存中的 initrd
文件系统。详情见计算机启动过程。
参考:计算机启动过程
主要有两个步骤:
以Linux系统为例,先载入/boot目录下面的kernel。
内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。
然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入username和password。
至此,全部启动过程完成。
为什么需要中断、异常和系统调用?
几乎所有计算机都提供了一种机制,其他模块(I/O,内存)可以通过该机制中断处理器执行的正常顺序,这就是中断。中断的一个主要作用就是提高处理器的利用率。大多数I/O设备比处理器运行慢的多。一台计算机主频为1Ghz,允许1秒执行 1 0 9 10^9 109条指令,而典型的硬盘转速为每分钟7200转,半磁道旋转时间为4ms,比处理器慢了400万倍。硬件通常可以通过系统总线向CPU发送信号来随时触发中断。 (计算机系统中可能有很多总线,但是系统总线是主要组件之间的主要通信路径。)中断也用于许多其他目的,并且是操作系统和硬件交互方式的关键部分。
中断的常见类型:
源头 | 触发事件 |
---|---|
程序 | 指令执行错误,例如算术溢出、除0、执行一条非法机器指令、用户允许的存储空间以外的引用。 |
计时器 | 产生于处理器的计时器。这使操作系统可以定期执行某些功能。 |
I/O | 产生于I/O控制器,表示操作已完成并且表示各种错误情况。 |
硬件故障 | 产生于硬件故障,例如电源故障或者内存奇偶校验错误。 |
下图为用户将执行并处理一些列交错的WRITE调用。其中I/O部分分为3块:
和中断不同的是,异常的产生来源于不良的应用程序(中断产生于硬件、外设)。在应用程序或者操作系统执行期间,如果处理器检测到程序错误,就会产生一个或者多个异常。异常发生在处理器执行一条指令时,检测到一个出错条件时发生,例如被0除出错条件。处理器可以检测到各种出错条件,包括违反保护机制。页错误以及机器内部错误。为了有助于处理异常和中断,每个需要被处理器进行特殊处理的处理器定义的异常和中断条件都被赋予了一个标识号,称为向量。处理器把赋予异常或中断的向量用作中断描述符表IDT中的一个索引号,来定位一个异常或中断的处理程序入口点位置。允许的向量号范围是0到255.其中0到31保留用作80x86处理器定义的异常和中断,不过目前该范围内的向量号并非每个都已定义了功能,未定义功能的向量号将留在以后使用。范围在32到255的向量号用于用户定义的中断。这些中断通常用于外部I/O设备,使得这些设备可以通过外部硬件中断机制向处理器发送中断。详情可见:操作系统学习(十三) 、中断和异常
类别 | 原因 | 异步/同步 | 返回行为 |
---|---|---|---|
中断 | 来自I/O设备的信号 | 异步 | 总是返回到下一条指令 |
陷阱 | 有意的异常 | 同步 | 总是返回到下一条指令 |
故障 | 潜在可恢复的错误 | 同步 | 可能返回到当前指令 |
终止 | 不可恢复错误 | 同步 | 不会返回 |
以通用的UNIX体系结构(下图)为例,用户程序可以直接唤醒操作系统服务或者通过程序库实现。系统调用层接口就是用户的边界,它允许更高级别的软件访问特定的内核程序,应用程序主动向OS发出服务请求。系统中的各种共享资源都由操作系统统一各种共享资源都由操掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行I/0传输以及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令有几十乃至上百条之多。
按照功能可以将系统调用分为如下几类:
中断:外设(硬件)
异常:应用程序意想不到的行为(软件)
系统调用:应用程序请求操作提供服务
中断:异步(异步中断是由CPU的外设产生额电信号引起的中断,其发生的时间点不可预测)
异常:同步
系统调用:异步或者同步
中断:持续,对用户程序是透明的
异常:杀死或者重新执行意想不到的应用程序指令
系统调用:等待和持续
由于操作系统和用户都共享计算机系统中的硬件和软件资源,因此系统必须确保错误(或者恶意)的程序不会导致其他程序(或操作系统本身无法)正确执行。为了保证系统的正常运作,我们必须区分操作系统代码和用户自定义代码。大多数计算机系统采用的方法是提供硬件支持,以允许在各种模式之间进行区分。因此,我们需要两种独立的操作模式:用户模式(用户态 user mode)和内核模式(内核态 kernel mode)(也成为管理员模式,系统模式或者特权模式)。提供单独的一个位,用来表示当前模式:内核(0
)或者用户(1
);使用模式位,我们可以区分操作系统当前执行的任务属于系统代码还是用户代码。当用户在用户模式下运行程序时,系统处于用户模式。但**当用户应用程序向操作系统请求服务时(通过系统调用),系统必须从用户态过渡到内核态才可以完成请求**。
在系统启动时,硬件以内核模式启动。 然后,将加载操作系统并以用户模式启动用户应用程序。 每当发生陷阱或中断时,硬件就会从用户模式切换到内核模式(即,将模式位的状态更改为0
)。 因此,每当操作系统获得对计算机的控制权时,它就处于内核模式。 在将控制权传递给用户程序之前,系统始终会切换到用户模式(通过将模式位设置为1
)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。