§1 概论
C1 技术背景
1)作用:联系用户程序与底层硬件
-
为程序(员)提供良好,清晰,一致的抽象
-
分配资源给多个程序和用户
资源多路复用:时间上轮流使用,空间上划分多个区域进行分配
-
组织计算机系统工作流程,以改善系统性能
CPU调度 | 内存管理 | 文件系统 | 设备管理 |
---|---|---|---|
进程通讯 | 内存保护 | 文件存储 | 设备缓冲 |
进程调度 | 内存分配 | 文件目录 | 设备分配 |
线程调度 | 内存扩充 | 文件保护 | |
线程同步 | 地址映射 | 读写接口 |
2)操作系统发展史:个体重复系统发育:旧的思想可能在新技术的演化当中重新出现
批处理系统
:收集作业-执行-输出集中进行,系统运行中用户不与程序交互- 联机批处理:主机处理IO
- 脱机批处理:卫星机IO
- 多道批处理:可以多个程序
- IBM 7094+IBM 1401(机) 晶体管计算机
多道程序设计
:轮流执行多个相互独立程序,提高时间并行度。引入进程调度和内存管理(同步外部设备联机操作(SPOOLing),负责将作业从磁盘读入内存)。- OS/360(机) 集成电路
分时系统
:多用户按时间片使用CPU,提供快速实时交互服务- 兼容分时系统:虚拟机技术???
- 计算服务:制造满足大量用户计算需求的大型机。其计算服务设想以云计算的形式得以保留。
- MULTICS UNIX(System V及BSD) POSIX (MINIX(可靠性,模块化),LINUX)
- 磁盘支持:CP/M MS-DOS
- GUI: Macintosh Windows95 Windows98 Vista … FreeBSD(X Window/X11视窗 Gnome KDE GUI)
网络操作系统
:远程访问,多级互联。透明性:数据,执行和保护分布式系统
:网络支持一体化系统,模块化(不同机器协调处理不同操作系统任务)。允许一个应用运行在多计算机上,但需要处理器调度。由于网络延迟,还需要确保信息一致性。- 移动系统:Symbian IOS Android
3)操作系统类型:
-
大型机操作系统:主要提供批处理,事务处理和分时。需要强IO能力。
- OS/390
-
服务器操作系统:提供网络服务若干用户,允许用户共享硬件和资源。
- Solaris FreeBSD Linux Windows Server 201x
-
多处理器操作系统:CPU集群系统或多核处理器
- Windows Linux
-
个人计算机操作系统:多道程序处理
- Linux Windows FreeBSD
-
掌上计算机操作系统:小型计算机,多数设备支持多核CPU,传感器
- IOS Android System Symbian
-
嵌入式操作系统:控制设备,不允许用户安装软件,或不可信软件。软件保存在ROM
- 嵌入式Linux QNX VxWorks
-
传感器节点操作系统:传感器节点网络,实时监测,信息收集。程序预先装载。
- TinyOS
-
实时系统:注重可靠性和安全性
-
硬实时
:不允许超过时限否则有不可逆损失 -
软实时
:没有不可逆损失
-
-
智能卡系统:含CPU芯片信用卡。有严格运行能耗和存储空间的限制。部分智能卡ROM中有一个Java虚拟机支持Java小程序。可能有原始的资源管理和保护
4)计算机硬件简介
-
程序状态字(PSW)
:CPU中寄存器,包含条件码位(由比较指令设置),CPU优先级,模式(用户/内核)其他控制位 -
内核态
:CPU可以执行所有指令,操作系统运行在内核态故可以访问所有硬件资源,用户态下可通过系统调用指令切换到内核态,多数情况下是硬件异常中断导致进入内核态。-
系统调用
:将控制权交给操作系统并临时切换到内核态,以获取OS服务 -
过程:
- 1° 传参:调用者将参数压栈,将系统调用的编号放到指定位置(如寄存器)。在C/C++中,逆序压栈
- 2° 切换:使用Trap自陷,跳转到固定的异常处理向量-系统调用处理入口地址
- 3° 分派:查系统调用编号,分配给请求的系统调用处理程序处理
- 4° 返回:当系统调用处理结束,可能返回调用者(也可能阻塞直到完成)
- 5° 退栈
-
分类:进程,文件,目录和文件系统,杂项
-
POSIX库过程:
-
进程:fork() waitpid() execve() exit()
-
文件:open() close() read() write() lseek() stat()
目录:mkdir() rmdir() link() unlink()
文件系统:mount() umount()
-
杂项:chdir() chmod() kill() time()
-
上述库函数封装了系统调用来完成功能。一个系统调用可能用于多个库过程
-
-
Windows Win32 API(Win32应用程序接口)
- 包含大量过程调用,部分需要系统调用
- 由于对早期系统向后兼容,Win32不是是否统一的接口。
-
-
超标量:具备多个处理取指,解码,执行单元,由OS和硬件共同保持程序被顺序执行
-
多线程:每个CPU有多个线程处理同一进程,可以增加逻辑处理器的数目
-
上下文切换
:从一个程序切换到另一个程序。需要将缓存写回,并修改MMU等。 -
CPU缓存:L1(16KB)缓存已解码指令以及频繁使用的数据字(一般在另一个L1),L2作为L1的下级缓存,L1无延时。Intel选择L2在处理器间共享,需要复杂缓存控制器。AMD选择每个CPU独享L2,但存在缓存一致性问题。
5)shell:文本式命令解释器,不作为操作系统的组成部分
C2 系统结构
1)宏内核/单体系统:系统以过程集合编写,链接成大型可执行文件。可以有一定结构(主过程-服务过程-实用过程)
- 过程间可不受限制地相互调用,使得系统笨拙难以理解
- 任何过程的崩溃会导致整个系统的崩溃
- 许多操作系统支持可装载扩展(IO设备驱动和文件系统),UNIX中称共享库,Windows中称动态链接库(.dll)
2)层次式系统:为系统划分层次,上层程序依赖于下层程序
- THE系统 MULTICS系统,MULTICS使用硬件实现的同心环层次,内层等级高,通过TRAP进入内层。易于实现扩展,构建用户子系统。(如n层放评测机,n+1层放学生端)
3)微内核系统/模块系统:只有一个模块作为微内核运行在内核态,而其他功能弱的模块运行在用户态。
- 内核态切换增加开销。接口定义困难无序。
- 可移植性好,高内聚低耦合,加速研制,便于维护,适合分布式系统。可使用机制与策略分离使得内核减小。限制了用户态进程的权限,避免其崩溃拖垮系统,提升了系统可靠性。
- 代表:
UnixMINX、OS X、Symbian、QNX、PikeOS、L4、K42、Integrity- LINUX是宏内核结构,但吸收了模块化设计思想
- Windows是微内核系统
4)客户端-服务器模式:将进程分为服务器和客户端两类。通过消息通讯进行服务。
- 可应用与单机或者网络机器
5)虚拟机系统:创建机器的精确复制(包括内核态和用户态,所有的中断和IO功能)作为虚拟机,虚拟机上可以运行不同的操作系统。
-
将多道程序功能和提供扩展机器分离,灵活易维护。
-
第二类虚拟机:利用宿主操作系统提供服务,不需要客户操作系统实现底层功能。第二类虚拟机从CD-ROM安装盘读入系统并安装在虚拟盘(实际上是一个大文件)。第一类虚拟机需要在原始硬盘分区上自行管理存储。
-
代表:VM/370(虚拟机上支持会话监控系统CMS以及大型批处理系统)
6)外核:对机器进行分区,分配给多个用户。外核运行在内核态,为虚拟机分派资源,检查请求权限。
- 虚拟机系统上每个虚拟机认为有独立的资源(磁盘、内存),故需要重定位机制。而外核的虚拟机资源地址是确定的,减少了映像层,使其更加简单。
C3计算机启动(Bootstrapping)
OS启动是逐步释放系统灵活性的过程
Bootloader :引导加载程序
-
stage1:初始化硬件,由汇编语言完成
stage2:将内核镜像装入系统,由C语言完成
-
MIPS:U-Boot;X86:LILO和GRUB
- U-Boot: Universal Boot Loader 开源,支持多种嵌入式系统和处理器,功能强大
- LILO:最早的Linux加载器,快速启动安装。局限在于LILO配置修改需要同时修改MBR,错误的MBR可能导致无法引导
- GRUB:交互命令界面,支持网络引导。若配置文件错误,转到GRUB命令行。在stage1.5,GRUB识别文件系统,故后续操作可使用文件系统完成
-
Bootloader的实现依赖于具体硬件。即使是支持较多CPU架构的U-Boot使用时也需要做响应的移植
MIPS环境启动
1)MIPS内存空间:
- kuseg:2G用户区,MMU映射
- kseg0:512M,高三位清零,cache存取,操作系统存放(0x80010000-0x80400000)
- kseg1:512M,高三位清零并映射到低段,非cache存取,一般是外设。
- kseg1是重启时唯一可用空间
- 启动入口地址
0xBFC00000
,映射到0x1FC00000
- kesg2:1G内核区,MMU映射
2)机器启动:
board_init_f
进行硬件初始化(串口、内存、时钟、环境变量等)- 初始化堆栈,划分内存,预留U-boot代码空间,并将其从flash载入内存
board_init_r
初始化flash,外设,PCI通讯,进入命令行启动Linux Kernel
3)Linux系统启动:
-
Head.S:
-
Bootloader将内核镜像载入内存
-
/arch/mips/kernel/head.s
开始,此处是内核入口函数kernel_entry()
。初始化内核堆栈,清零bss段。
-
-
start_kernel
:- 启动内核,完成页表设置,调度器初始化,时钟设置、系统时间、控制台,内存管理等等。
X86环境启动
1)BIOS(Basic IO System):固化在ROM芯片上,提供底层硬件设置和控制。称为固件
。含CPU信息,设备启动顺序,硬盘内存,时钟信息,PhP特性等等
※实际上BIOS具有局限性(寻址空间小),后续发展的有同一可扩展固件接口UEFI。UEFI支持大容量硬盘引导,支持不同OS环境甚至网络OS(硬件支持),支持不同CPU体系结构和驱动(可移植),属于模块化设计
2)主引导记录(MBR):固定位于磁盘第0磁头第0磁道第一个扇区(大小512KB)。
- 包含已安装系统的Bootloader信息。
- 包含分区表,分区表由4个分区项(每项16KB)构成。分主分区(1-4个)、扩展分区(0-1个)、逻辑分区(n个)。主分区只有一个是激活的。OS安装在主分区。
- 每个分区第一个扇区是Boot Sector
3)启动:
-
BIOS阶段
- BIOS硬件自检:扫描RAM数量,键盘基本设备,然后是PCIe,PCI设备,最后是即插即用设备,若有硬件更新则更新配置。若硬件出问题则发出不同蜂鸣。
- 启动顺序:查CMOS中设备清单决定是否启动,若有USB设备,优先从USB启动(读入第一个扇区,执行上面的程序,找到活动分区的Bootloader来启动系统)
-
MBR阶段与Bootloader阶段:
- 读取MBR到0x7c00处
- 检查0x7fde是否为0xaa55(MBR的魔数)如果不是会转到其他介质(直到没有介质则显示NO ROM BASIC死机)
- 跳转到0x7c00执行MBR中程序
- 将自己复制到0x0600
- 搜索活动分区,若发现没有唯一活动分区则停止
- 活动分区读入0x7c00,检查0x7dfe是否为0xaa55。若不是则显示MISSING Operating System后停止或尝试软盘启动
- 跳到0x7c00处继续执行启动
内核镜像
内核的压缩文件,非可执行的内核
- zImage小于512K
- bzImage大于512K,包含引导代码,启动代码和压缩的OS代码