操作系统 课程笔记
并发与并行
并发是一段时间内多个任务, 并行是某个时间点上的多个任务,所以单核无法并行,但可以并发。
计算机发展
- 早期纸带机,串行,单用户
- CPU,内存增强-> 流水线化(批处理),操作系统初步的形态,有了并发的特征
- 内存进一步扩大,内存中可以放入多个程序,而不需要磁盘读入,减少IO-> 多道程序(当一个程序等待IO,中断通知操作系统,操作系统调度切换,执行另一个程序),CPU更有效利用(考虑如何让CPU尽可能忙)
- 多道程序提高了CPU利用率,但用户交互不够好,因为一个程序执行时用户得等待,因为该程序抢占了所有CPU时间直到停止或等IO发送 中断信号,于是出现分时系统,由操作系统控制程序执行,超过限制时间(现代操作系统通常是千分之一秒)切换其他程序任务, 感官上好像每个程序(或用户)独占计算机。如何打断程序执行呢?答案是时钟,时钟定期产生中断。
- 个人电脑系统,提高交互性,字符命令到GUI
- 多核
- 网络快速发展出现分布式操作系统(前端只是用户界面,后端执行计算,通过internet链接)为了应对分布式的发展。 应对1,通过internet的松,紧耦合系统,数据中心机器集群是紧耦合,操作系统考虑如何高效管理,数据中心与用户终端是松耦合, 考虑如何高效传输。发展中。。。
- 未来: 物联网,云计算中心,从早期的一群人围着一个计算机,到一群计算机围着一个人服务。
架构发展
-
早期DOS资源紧缺,单体设计,没有模块化,却不安全
-
Linux面向服务器,资源更好,采用模块化设计
-
早期模块化,函数调用实现访问,当前学术界产生一个想法(类似微服务),让操作系统变得更加小巧, 调用采用类似消息传递的机制,松耦合实现, 操作系统更加容易扩展-> 微内核架构的设计,内核只放最基本的消息传递,中断处理。 而比如文件系统,内存管理等都放在外围作为进程(服务)形式存在。灵活且安全,代价是性能,目前产业界很少有微内核架构的设计。
-
学术界另一个极端的想法是把硬件封装成一个lib,
-
还出现了VM虚拟机
第三讲 启动、中断、异常和系统调用
操作系统保证系统安全以及衔接应用程序和外设,实现这一目的主要有三个方面:
- 中断(外设)
- 异常(应用程序的意外行为,如除零,如恶意访问其他程序地址空间,如请求内存占满)
- 系统调用
处理时间:
- 中断 : 异步
- 异常 : 同步
- 系统调用: 同步或异步
响应:
- 中断: 持续,对应用程序透明
- 异常: kill或重启应用程序
- 系统调用: 等待或持续
3.1 BIOS
BIOS 加载 BootLoader(第一个扇区), BootLoader 加载 OS
系统启动必须要找到一个特定的代码执行,此代码为BIOS,
BIOS 存储在内存的ROM段 系统启动开始时置CS:IP = 0xf000:fff0
系统处于实模式下, 此时:
*PC = 16CS + IP*, 则PC= 0xffff0(共54 = 20位地址空间)
所以BIOS可得到约共20位地址空间(1MB)
BIOS实现的功能
BIOS作为启动固件之用,那么首先需要有硬盘读写的能力以及其他包括:
- 基本输入输出程序(读写硬盘,键盘输入,屏幕输出)
- 系统设置信息(系统配置,例如从硬盘启动还是网络启动还是光盘启动,U盘启动)
- 开机后自检程序
- 系统自启动程序等
具体过程
加载程序
将加载程序从磁盘的引导扇区(512字节)加载到0x7c00 (0111 1100 0000 0000)
(那么加载程序最大只有512字节)
跳转到 CS:IP = 0000:7c00
控制权转到此加载程序
加载程序功能:
- 将操作系统的代码和数据从硬盘加载到内存中
- 跳转到操作系统的起始地址(控制权交给了操作系统)
问题: 为什么需要一个 中间的加载程序加载操作系统,而不是BIOS直接把操作系统内核映像读进去呢?
答:首先磁盘上有各种格式的文件系统(NTFS,FAT32等),那么识别文件系统格式可以由加载程序完成
BIOS系统调用
BIOS以中断方式提供基本的I/O功能,例如:
- INT 10h: 字符显示
- INT 13h: 磁盘扇区读写
- INT 15h: 检测内存大小
- INT 16h: 读取键盘输入
BIOS提供最简单最基本的IO功能,其使用也受到很大限制(例如对于x86,只能在实模式下访问)。
3.2 系统启动流程
参考:计算机是如何启动的
MBR格式
MBR共512字节,包括:
- 启动代码: 1-446字节,共446字节(代码段)
- 硬盘分区表: 447-510字节,共64字节(数据段)可用4分区,每分区16字节,猜测这意味着一个分区的寻址空间约2^128字节。
- MBR结束标志:511-512字节,共2字节,0x55AA
在BIOS中不是有启动顺序么?比如U盘启动就将其顺序放置在第一位,
实际过程是按照启动顺序检查存储设备最前面的512字节,如果最后以0x55AA结尾,就认为是MBR(Master Boot Record,主引导记录)
MBR之后跳到分区引导扇区上,
分区引导扇区格式:
3.3 中断、异常和系统调用
实验部分
3-1 x86启动顺序
step1. 各寄存器初始化到初始值,关键注意CS和EIP的值,CS=F000H,EIP=0000FFF0H,Base=FFFF0000H
为了兼容早期的8086,初始启动为实模式,后续才到保护模式
Bootloader做的事情
- 使能保护模式(将特殊寄存器CR0从0置为1,从实模式切换到保护模式),段机制能正常工作了
- 读取kernel代码(可能保存在多个扇区)到内存中固定的位置
- 修改CS,EIP控制权转移给内核
- 建立gdt(全局描述符表)结构