2.操作系统基础操作

2.1操作系统的启动

一些概念:
DISK:存放OS
BIOS:基本I/O处理系统
Bootloader:加载OS,将操作系统的代码和数据从硬盘加载到内存中
POST(加电自检):寻找显卡和执行BIOS
具体的内存地址:如CS:IP = 0xf000:fff0
CS:段寄存器;IP:指令寄存器

2.1.1问

为什么应用程序不能直接访问外设(需要借助操作系统)?
在计算机运行中,内核是被信任的第三方(恶意应用程序)
只有内核可以执行特权指令
为了方便应用程序

2.2操作系统的中断、异常、系统调用

2.2.1定义

系统调用(来源于应用程序)
应用程序主动向操作系统发出服务请求(如:开关/读写文件,发送网络包)
异常(来源于不良的应用程序)
非法指令或者其他坏的处理状态(如:内存出错,恶意程序,应用程序需要的资源未得到满足)
中断(来源于外设)
来自不同的硬件设备的计时器和网络的中断

2.2.2比较

2.2.2.1源头不同

中断:外设
异常:应用程序想不到的行为
系统调用:应用程序请求操作提供服务

2.2.2.2处理时间不同

中断:异步
异常:同步
系统调用:异步或同步

2.2.2.3响应不同

中断:持续,对用户应用程序是透明的
异常:杀死或者重新执行意想不到的应用程序指令
系统调用:等待和持续

2.2.3中断和异常处理

(1)中断/异常处理机制
中断是外设的事件,异常是CPU的事件;
中断/异常迫使CPU访问一些被中断和异常服务访问的功能。

(2)中断处理机制

硬件:设置中断标记(CPU初始化)

将内部/外部事件设置中断标记;
中断事件的ID(程序访问的中断向量地址)

软件(操作系统):
保存当前处理状态
中断服务程序处理
清除中断标记
恢复之前保存的处理状态

(3)异常处理机制
异常编号
保存现场
异常处理:杀死产生异常的程序;重新执行异常指令
恢复现场

2.2.4系统调用

一条指令会触发一个系统调用

程序访问主要是通过高层次的API接口而不是直接进行系统调用。

通常情况下,存在与每个系统调用相关的序号,系统调用接口根据这些序号来维护表的索引。
系统调用接口调用内核态中预期的系统调用,并返回系统调用的状态和其它任何返回值。
用户不需要知道系统调用是如何实现的,只需要获取API和了解操作新系统将什么作为返回结果。操作系统接口的细节大部分都隐藏在API中,并通过运行程序支持的库来管理。

用户态:应用程序在执行的过程中,CPU执行的特权级的状态(很低,不能访问特殊机器指令和IO)。

内核态:应用程序在执行的过程中,CPU执行的特权级的状态(高,操作系统可以执行CPU任何一条指令)。

系统调用时涉及到特权级从用户态到内核态的转换,应用程序和操作系统有各自的堆栈,这两个变化比函数调用的开销更大,但更安全和可靠。(而程序调用是在一个栈空间实现参数的调用和返回)。

2.2.5跨越操作系统边界的开销

在执行时间上超过程序调用

开销包括:
建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销;
建立内核堆栈(操作系统和应用程序的堆栈不一样);
验证参数(操作系统会检查数据);
内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝开销);
内核态独立地址空间TLB。

猜你喜欢

转载自blog.csdn.net/weixin_51864831/article/details/111823279