启动、中断、异常、系统调用
启动
1、DISK
(1)OS:
(2)Bootloader:一般放在硬盘的第一个引导扇区,占用 512 byte
2、BIOS:基本 I / O 处理系统
(1)一开始加电,BIOS 执行固定内存地址:CS:IP=0xf000:fff0(CS:段寄存器;IP:指令寄存器)
(2)POST(加电自检):检查外设是否正常工作
(3)BIOS 将 Bootloader 从磁盘的第一个引导扇区,加载到内存(地址:0x7c00)
(4)跳转到 CS:IP=0000:7c00,CPU 控制权交给 Bootloader
6、Bootloader
(1)找到 OS 在硬盘的起始扇区,以及 OS 长度,并将 OS 加载到内存
(2)跳转到 OS 的起始地址,CPU 控制权交给 OS
OS 的 Interface
1、面向外设:中断、IO
2、面向应用程序:系统调用、异常
特点
1、系统调用
(1)来源:应用程序,主动向操作系统发出服务请求
(2)处理时间:异步 / 同步
(3)响应:等待和持续
2、异常
(1)来源:不良的应用程序,非法指令或者其他坏的处理状态,如:内存出错
(2)处理时间:同步
(3)响应:杀死或者重新执行意想不到的应用程序指令
3、中断
(1)来源:外设,来自不同的硬件设备的计时器和网络的中断
(2)处理时间:异步
(3)响应:持续,对用户应用程序是透明的
中断处理机制
1、硬件
(1)设置中断标记(CPU初始化)
(2)将内部、外部事件设置中断标记
(3)中断事件的 ID:程序访问的中断向量地址
2、软件
(1)保存当前处理状态
(2)中断服务程序处理
(3)清除中断标记
(4)恢复之前保存的处理状态
异常处理机制
1、保存异常编号
2、异常处理
(1)杀死产生了异常的程序
(2)重新执行异常指令
3、恢复现场
系统调用
1、程序访问主要是通过高层次的 API 而不是直接进行系统调用
(1)Win 32 API:用于Windows
(2)POSIX API:用于 POSIX-based systems(包括UNIX,LINUX,Mac OS X 的所有版本)
2、通常情况下,与每个系统调用相关的序号,系统调用接口根据这些序号来维护表的索引
3、系统调用接口调用内核态中预期的系统调用,并返回系统调用的状态和其他任何返回值
4、用户不需要知道系统调用是如何实现的,只需要获取 API 和了解操作新系统将什么作为返回结果,操作系统接口的细节大部分都隐藏在 API 中,通过运行程序支持的库来管理(用包含编译器的库来创建函数集)
5、实现
(1)应用程序直接 / 间接通过库,访问系统调用的 API
(2)触发转换:用户态 -> 内核态,CPU 控制权:应用程序 -> OS
(3)用户态:应用程序执行过程中,CPU 特权级的状态,级别低,不能直接访问 IO、特殊机器指令
(4)内核态:OS 执行过程中,CPU 特权级的状态,级别高,可以访问任何指令,保证安全性
(5)OS 对应用程序发出系统调用的参数,标识其的 ID 号(使其可以被识别),完成具体服务
6、区别
(1)函数调用:应用程序发出函数调用,在一个栈空间,完成参数传递、返回
(2)系统调用:应用程序、OS 有各自的堆栈,应用程序发出系统调用,需要切换堆栈,同时,用户态 -> 内核态,即完成特权级的转换
(3)系统调用的开销,远大于函数调用的开销,但更安全可靠
跨越操作系统边界的开销
1、在执行时间上的开销超过程序调用
2、开销情况
(1)建立中断 / 异常 / 系统调用号与对应服务,例如,程映射关系的初始化开销
(2)建立内核堆栈
(3)验证参数
(4)内核态映射到用户态的地址空间,更新页面映射权限
(5)内核态独立地址空间:TLB
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战