引言
提前批面试被怼飞了,去实习前先给自己充充电,充实一下。从零开始学操作系统,有什么错误希望大家直接指出~
文章导读
- 操作系统的启动
- 操作系统与设备和程序交互(中断,IO,系统调用,异常)
一、操作系统的启动
计算机刚打开时,执行了什么指令?
会走pc=?,具体地址是由硬件设计者决定。
首先简单来了解一下操作系统启动的过程,以x86 PC为例:
1. x86 PC刚开机时,CPU处于实模式。
注:这种模式下能够直接访问硬件,没有硬件等级和保护。
2. 开机时,CS=0xFFFF,IP=0x0000
注:CS是段寄存器,IP是偏移。
3. 寻址0xFFFF0(ROM BIOS映射区),进入BIOS模式。
注:寻址=CS<<4+IP
4. 检查RAM,键盘,显示器,软硬件磁盘
5. 将磁盘0磁道0扇区读入0x7c00处(一个扇区的大小是512字节)。
注:0磁道0扇区就是操作系统的引导扇区。
6. 设置cs=0x07c0,ip=0x0000
注:引导扇区加载完后,加载setup扇区......
简单来说,就是:
1. BIOS加电自检,寻找显卡和执行BIOS。
2. 将bootloader加载到内存中。
3. bootloader找到硬盘的起始扇区,将操作系统代码和数据从硬盘读取到内存中。
注:对于操作系统的启动,这里做一个了解,我看的也有点懵逼呀。牵扯到的知识太多了,就点到为止了。
二、操作系统与设备和程序交互
首先得清楚与设备和程序交互的方式有哪些:
- 面向外设:中断,IO
- 面向应用程序:系统调用,异常
系统调用:应用程序主动向操作系统发出服务请求。
异常:非法指令或者其他坏的处理状态。
中断:来自于不同的硬件设备的计时器和网络的中断。
为什么不让应用程序直接访问外设?
1. 在计算机运行中,内核是被信任的第三方
2. 只有内核可以执行特权指令
3. 封装成接口,为了方便应用程序调用
2.1 中断的过程
硬件层面:设置中断标记。
1. 将内部、外部事件设置中断标记。
2. 产生中断事件的ID。
CPU根据中断标记产生中断号(中断事件ID),发送给操作系统。
软件层面
1. 保存当前处理状态。
2. 中断服务程序处理。
3. 清除中断标记。
4. 恢复之前保存的处理。
2.2 异常的过程
1. 产生异常编号。
2. 异常处理。
杀死产生异常的程序或重新执行异常指令。
3. 恢复现场。
2.3 系统调用的过程
1. 系统调用接口根据序号来维护表的索引。
2. 系统调用接口调用内核态中预期的系统调用,并返回系统调用的状态和其他任何返回值。
3. 用户不需要知道系统调用是怎么实现的,只要获取API,了解返回结果。大部分细节都隐藏在API中。
操作系统如何实现系统调用?
应用程序通过Library Code访问系统调用的接口;
触发用户态->内核态的转换,控制权从应用程序到操作系统;
sys_ 系统调用。
2.4 相关的开销
- 建立中断,异常,系统调用号与对应服务进程映射关系的初始化开销。
- 建立内核堆栈。
- 验证参数。
- 内核态映射到用户态的地址空间,更新页面映射权限。
- 内核态独立地址空间。
这篇作为操作系统的热身篇,简单的介绍了操作系统的启动以及中断,系统调用,异常的原理,内容不多。
如果看得不过瘾,可以戳:操作系统(二)—内存管理
参考文章:操作系统第六篇【存储器管理】
感谢支持,喜欢我的文章可以关注我的知乎专栏~