操作系统的启动

一、计算机体系结构概述

计算机原理上看分为三部分: CPU、内存 和 I/O

bios中断调用查询表 bios中断调用是什么_linux


操作系统并不是直接存储到内存中,让CPU去执行


而是 通过DISK存储【硬盘】

利用BIOS来提供相应的支持【基本I/O处理系统,让OS能够检测计算机的各种外设】

BootLoader加载OS【让操作系统从硬盘中加载到内存中,使CPU可以执行操作系统】


二、计算机内存及硬盘布局

在计算机内存中,BIOS 已经预先占用一部分空间

bios中断调用查询表 bios中断调用是什么_运维_02


(1)BIOS 第一步从一个特定的地址开始执行【CS:IP就是它的地址】

(2)第二步 寻找显卡和执行BIOS,检查自身的各种设备是否能正常工作【加电自检 POST
(3)第三步 把BootLoader从硬盘中放到内存中去


三、开机顺序

bios中断调用查询表 bios中断调用是什么_linux_03


BIOSBootLoader从磁盘的引导扇区加载到0x7c00中之后,CPU的主导权就来到了BootLoader这里。

BootLoader将操作系统的代码和数据从硬盘加载到内存中,CPU跳到OS的起始地址,OS开始执行


中断 异常 系统调用

一、三者的定义

(1)系统调用:
应用程序 主动向操作系统发出服务的请求

(2)异常
应用程序 在执行过程中出现了一些意想不到的情况,只有由操作系统来处理

(3)中断
外设 需要操作系统提供特殊的支持,通过中断机制让操作系统感知到进而处理

  • 为什么应用程序不能直接访问外设?
    因为应用程序是不安全的,所以不能直接访问外设,要通过操作系统来访问;通过操作系统屏蔽底层的复杂性,通过提供相应的接口来提供底层服务【安全 便捷】

二、中断、异常和系统调用相比较

三者在操作系统中处理的过程:

bios中断调用查询表 bios中断调用是什么_服务器_04

  • 三者的源头不同:

中断: 源自外设利用中断机制发出的请求
异常:源自应用程序意想不到的行为
系统调用:源自应用程序请求操作系统提供服务

  • 三者的处理时间不同:

中断:异步 【发生中断的时间是不确定的】
异常:同步【当出现意外的情况,一定就会发生异常】
系统调用:异步或同步【从指令发出角度来说是同步的,从系统调用返回的角度来说是异步的】

  • 三者的相应方式不同

中断:持续的【对用户和应用程序透明】
异常:停止程序或重新执行
系统调用:等待和持续【发起调用后就要排队等待操作系统返回】

三、中断和异常处理机制

当产生一个中断或异常之后,要知道由哪个特定的服务例程来服务

bios中断调用查询表 bios中断调用是什么_运维_05

通过表来记录,通过Key记录中断号、异常号
不同的外设产生不同的中断编号,每个编号对应特别的地址

操作系统收到中断,根据这个中断表,可以找到对应中断服务对应的起始地址,跳转执行

中断处理机制:通过软件与硬件来完成保存与恢复机制

  • 硬件

对外部内部事件设置中断标记【有了中断标记CPU才会识别到中断产生】
CPU在知道中断标记后,会产生一个中断号发给操作系统

  • 软件(操作系统)

保存被打断的执行现场【当前的处理状态】
根据CPU给的中断号查到对应进程的地址,去执行相应的操作
处理完之后,应该让当前被当断的程序继续被执行【恢复现场】

异常处理机制:

  • 保存现场
  • 异常处理
    ⭕️ 杀死产生异常的程序
    ⭕️重新执行异常指令 【操作系统根据知道的原因修复了产生的异常】
  • 恢复现场

四、系统调用

  • 程序访问主要是通过高层的API接口,而不是直接的系统调用
  • bios中断调用查询表 bios中断调用是什么_运维_06

  • 系统调用的实现
    (1) 通常情况下,每个系统调用都有相应的序号,系统调用接口根据这些序号来维护表的索引
    (2) 系统调用的接口,调用内核态中预期的系统调用,并返回系统调用的状态和其他任何返回值
  • 用户并不需要要系统调用是如何实现的

只需要获取API 和 了解操作系统将什么做为返回结果
将操作系统接口的大部分细节隐藏在API中,通过运行程序支持的库来管理

五、程序调用与系统调用的不同之处

当应用程序发出程序调用的时候,是在一个栈空间完成参数的传递、参数的返回

当应用程序发出系统调用时,这个应用程序和操作系统内核都有各自的堆栈,当发出系统调用,需要切换堆栈,同时需要完成用户态到内核态的转换,需要更大的开销【安全 可靠】

六、开销

对于中断、异常、系统调用都跨越了操作系统的边界,随之而来的是更大的开销

  • 在执行时间上的开销超过程序调用
  • 额外的开销体现在一下方面:

建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销
建立内核堆栈
验证参数
内核态映射到用户态的地址空间,更新页面映射权限
内核态独立地址空间