操作系统的概念和功能
概念
负责管理协调硬件、软件等计算机资源的工作,为上层用户、应用服务提供简单易用的服务,是一种系统软件
- UI
- ABI:可以通过相应的编程语言使用这些接口,以操作计算机系统来完成某项特定任务
- API:将程序与操作系统、硬件平台之间紧密协作需要遵守的特定规则保留出来
- ISA:工业标准体系结构
功能和目标
- 资源管理者
- 处理机管理
- 存储器管理
- 文件管理
- 设备管理
- 向上层提供服务
- 直接给用户使用的
- GUI(图形用户界面)
- 命令接口:联机命令接口(一句一句执行),脱机命令接口(一批一起执行)
- 给软件/程序员使用的:程序接口(即系统调用)
- 直接给用户使用的
- 对硬件机器的扩展:虚拟机
特征
- 并发性:宏观上同时,微观上交替(区别于并行:同一时刻同时发生)\
注:单核CPU各程序只能并发执行,多核CPU可以并行执行 - 共享性:并发和共享互为存在条件
- 互斥共享方式(如对摄像头设备的共享使用)
- 同时共享方式(如对硬盘资源的共享使用)
- 虚拟性:把一个物理上的实体变为若干个逻辑上的对应物
- 空分复用技术(如虚拟存储技术)
- 时分复用技术(如虚拟处理器技术)
- 异步性
发展与分类
冯·诺伊曼体系结构:存储程序式,指令与数据共同存储,通过一个总线访问
哈佛结构:将指令存储与数据存储分离
手工操作阶段
批处理阶段
- 单道批处理系统(引入脱机输入输出技术,即输入/输出脱离主机控制)
- 多道批处理系统(操作系统开始出现)
多道程序设计技术,就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存中(前提是内存放的下),并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
引入多道程序设计技术后形成多道批处理系统
优点:系统吞吐量大,资源利用率高
缺点:平均周转时间长,不能交互(上面所说的I/O请求是指请求“读取文件”之类的操作,需要等待直到I/O操作完成,所以不是在和用户交互)
分时操作系统
分时系统:将CPU处理时间分割为多个时间片,将时间片分给不同程序,达到多个程序“同时”运行的效果
两种典型分时操作系统:(1) Multics/Unix (1968/1970) (2) IBM VM 360/370实时操作系统:能优先处理紧急任务,一般用于嵌入式
- 硬实时系统:必须在绝对严格的限定时间内完成处理
- 软实时系统:能接受偶尔违反时间规定
网络操作系统
在传统单机OS上加单独软件层,主要提供联网功能和资源的远程访问,实现多机互联、分布式与嵌入式系统
分布式操作系统
多台机器统一管理形成单一系统,相比于网络操作系统,对用户和应用高度透明
个人计算机操作系统
注:
多道批处理 | 分时技术 |
---|---|
不可交互 | 可交互 |
侧重于作业的批量处理和长处理时间 | 强调用户与计算机的实时交互和独占使用 |
运行机制
程序运行原理
高级语言编写的代码 —> 机器指令
程序运行的过程就是CPU执行指令的过程
两类程序
- 内核程序
- 应用程序
两类指令
- 特权指令
- 非特权指令
两种处理器状态
- 内核态/核心态/管态
- 用户态/目态
内核
是操作系统最重要最核心的部分,由很多内核程序组成操作系统内核
如何改变CPU状态?
- 内核态 —> 用户态 :一条修改PSW(程序状态字,也叫程序状态寄存器)的特权指令
- 用户态 —> 内核态 :由中断引起,硬件自动完成
中断和异常
作用:
让操作系统内核强行夺回CPU控制权,使CPU从用户态变为内核态分类
- 异常(内中断)
- 陷阱(trap)
- 故障
- 终止
- 中断(外中断)
- 时钟中断
- I/O中断请求
- 异常(内中断)
中断机制的基本实现原理
- 检查中断信号
- 异常:CPU在执行指令会检查是否有异常发生
- 中断:每个指令周期末尾,CPU都会检查是否有中断信号需要处理
- 找到相应的中断处理程序:通过中断向量表实现
- 检查中断信号
系统调用
定义:操作系统对应用程序/程序员提供的接口
系统调用和库函数的关系:有的库函数是对系统调用的进一步封装,有的库函数没有使用系统调用
什么功能要用系统调用实现:设备管理、文件管理、进程控制、进程通信、内存管理
系统调用的过程:
- 传参
- 陷入(trap)指令
- 由操作系统内核程序处理系统调用请求
- 返回应用程序
OS体系结构
大内核 | 微内核 | |
---|---|---|
特点 | 将操作系统的主要功能模块都作为系统内核,运行在核心态 | 只把最基本的功能保留在内核 |
例子 | 如Linux、UNIX | 如Windows NT |
系统引导
BootLoader(引导加载程序):系统加电后运行的第一段软件代码,是在OS内核运行之前的一小段程序。(也就是说存放在图中PBR所在区域)
- boot:初始化嵌入式系统硬件使之运行起来,至少是部分运行起来。
- load:将OS映像加载到内存中,并跳转到OS的代码运行
处理器类型 | 常用bootloader |
---|---|
MIPS处理器(大多用于嵌入式系统) | U-boot |
x86处理器 | LILO、GRUB |
BootLoader的实现严重依赖于具体硬件
计算机的启动过程(MIPS)
U-boot
大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外
- stage1:依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现
- stage2:通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性
MIPS基本地址空间
- kuseg:用户态可用的地址,在有MMU的机器里,这些地址将一概被MMU作转换,除非MMU的设置被建立好,否则这2G的地址是不可用的
- kseg0:将他们的最高位清零,即可映射到物理地址段512M(0x00000000 — 0x1fffffff).这种映射关系很简单,通常称之为”非转换的”地址区域,几乎全部对这段地址的存取都会通过cache,因此cache设置好之前,不能随便使用这段地址.
- kseg1: 将这些地址的高三位清零可映射到相应的物理地址上,与kseg0映射的物理地址一样,但kseg1是非cache存取的. kseg1是唯一在系统重启时能正常工作的地址空间
- kseg2: 这块区域只能在核心态下使用并且要经过MMU的转换. 在MMU设置好之前,不要存取该区域. 除非在写一个真正的操作系统,否则没有理由用kseg2. 有时会看到该区域被分为kseg2和kseg3,意在强调低半部分(kseg2)可供运行在管理态的程序使用.
MIPS启动过程
- start.S: 从_start开始执行
- 初始化中断向量
- 寄存器清零
- 配置寄存器的CP0_STATUS, 设置所使用的协处理器,中断以及CPU运行级别(核心级)
- 配置gp寄存器
- lowlevel_init.S: 从lowlevel_init开始执行,工作频率配置(e.g: CPU主频、总线、DDR工作频率)
- cache.S
- mips_cache_rest: 对cache进行初始化
- mips_cache_lock: 设置堆栈
由于此时ddr ram并没有配置好,而如果直接调用c语言的函数必须完成栈的设置,栈必定要在ram中。所以,只有先把一部分cache拿来当ram用。做法就是把一部分cache配置为栈的地址并锁定。这样,当读写栈的内存空间时,只会访问cache,而不会访问真的ram地址了
第一阶段:三个汇编代码
board.c:
board_init_f
- time_init
- env_init 环境变量初始化
- init_baudrate 串口速率
- serial_init 串口初始化
- console_init_f 配置控制台
- display_banner 显示U-boot启动信息,版本号等
- init_func_ram 初始化内存,配置DDR controller
board_init_r: 初始化flash、PCI以及外设(e.g: 网口),进入命令行直接启动Linux Kernel
MIPS下Linux系统引导过程
BootLoader将Linux内核映像拷贝到RAM中
/arch/mips/kernel/head.s kernel_entry(): 初始化内核堆栈段,为创建系统中的第一个进程进行准备,接着用另一段循环将内核映像的未初始化数据段清零,最后跳转到start_kernel()
/init/main.c start_kernel(): 初始化硬件平台相关代码
计算机的启动过程(x86)
- 加载BIOS BIOS v.s. UEFI(统一可扩展固件接口)
- 读取MBR(主引导记录,即磁盘上第0磁头第0磁道第一个扇区):启动代码及数据、分区表、幻数
x86下Linux系统引导过程
- Boot Loader
- 加载内核
- init进程执行
- 用户层init依据initab文件来设定运行等级
- init进程执行rc.sysinit
- 启动内核模块
- 执行不同运行级别的脚本程序
- 执行/etc/rc.d/rc.local(留给用户个性化的地方)
- 执行/bin/login程序,进入登录状态
虚拟机
第一类虚拟机 | 第二类虚拟机 | |
---|---|---|
对物理资源的控制 | 直接运行在硬件之上,能直接控制和分配物理资源 | 运行在Host OS上,依赖于Host OS为其分配物理资源 |
资源分配方式 | 在安装Guest OS时,VMM要在原本的硬件上自行分配存储空间,类似于“外核”的分配方式,分配未经抽象的物理硬件 | Guest OS拥有自己的虚拟磁盘,该盘实际上是Host OS文件系统中的一个大文件,Guest OS分配到的内存是虚拟内存 |
性能 | 好 | 差(需要Host OS作为中介) |
可支持的虚拟机数量 | 更多(不需要和Host OS竞争资源,相同的硬件资源可以支持更多的虚拟机 | 更少(Host OS本身需要使用物理资源,Host OS上运行的其他进程也需要物理资源) |
可迁移性 | 差 | 好 |
运行模式 | 运行在最高特权级(Ring 0),可以执行最高特权的指令 | 运行在用户态,部分运行在内核态, Guest OS发出的系统调用会被VMM截获,并转化为VMM对Host OS的系统调用 |