操作系统就是位于计算机用户与计算机硬件之间的一个大型程序,可以更好的管理计算机的硬件,方便计算机用户。
1、操作系统的概念
可以说操作系统的定义有很多,花里胡哨,五花八门。但是有一个比较公认的定义:操作系统就是一直运行在计算机上的程序,也就是内核kernel。此种情况系统程序不包括在操作系统的概念之中。
操作系统的启动:在电脑一上电,首先运行的不是操作系统,而是初始程序BIOS引导程序,初始化各种硬件设备,然后引导程序将操作系统加载到内存中,然后跳转到操作系统的代码执行,然后出现系统的首个进程init(Linux中的首个进程),从此操作系统开始为系统和用户提供服务。
操作系统中事件的发生通常用中断来实现,硬件中断触发之后进入中断向量表中执行对应操作,执行相应的中断服务程序。
2、处理器的结构及IO编址
这里说的处理器的结构是说冯诺依曼结构和哈佛结构。
冯诺依曼结构:数据和程序都放在内存中,放在一起。Intel就是这样的,也就是我们的电脑
哈佛结构:程序和数据分开放,大部分的单片机好像都是这样的。
看到别人的博客,说是还有混合结构的,二者混合,比如我们现在手机中的ARM芯片。
芯片内部的Dcache用来缓存部分代码,icache用来缓存部分数据。只有需要改变时,cache才会到RAM中加载新的数据。所以大部分时间CPU都是通过哈佛结构和cache(高速缓存)通讯,这个速度是非常快的这样在芯片外部,利用冯诺依曼结构,节省了外部的PCB走线资源。在芯片内部,利用哈佛结构提高了CPU访问数据的速度。
在处理器中有内存和外设相关的硬件,我们可以通过地址来访问并操纵他们。不同的处理器设置不同,分为统一编址和独立编址。
统一编址:内存和IO设备共用相同的地址,IO设备占用内存的地址空间,以让总线访问,操作的汇编指令也相同。
独立编址:内存的地址和IO的地址不一样,要用不同的汇编指令来访问
3、用户空间和内核空间
用户应用程序运行在用户空间,操作系统运行在内核空间。内核空间可以实现一些涉及系统安全和危险的操作,不能让用户程序拥有这么强大的功能,因此才有了用户空间和内核空间,当程序要切换到内核时,就要切换到内核空间,用户空间亦如此。
4、操作系统的结构
操作系统的内核很大,很难管理,所以现在基本有两种内核的结构,就是宏内核(又叫单内核)和微内核
宏内核
将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。Linux就是宏内核的。
微内核
微内核说白了就是从内核中删除所有不必要的部件,只留下最重要的部分,其余的都放到用户模式下,放在用户空间中实现。比如内核只含有内存管理和进程调度的功能,驱动部分的代码全部都放到用户空间去。微内核的模块化很好,但是效率低,因为调用驱动部分代码还要切换到用户空间执行。Windows NT时微内核的,但是现在的Windows已经很像基本就是宏内核的了。
5、CPU的态(Mode)
CPU态
CPU的工作状态
对资源和指令使用权限的描述
态的分类
核态
- 能够访问所有资源和执行所有指令
- 管理程序/OS内核
用户态
- 仅能够访问部分资源,其他资源受限
- 用户程序
管态
- 介于核态核用户态之间
用户态和核态之间的转换
用户态向核态转换
- 用户请求OS提供服务
- 发生中断
- 用户进程产生错误
- 用户态企图执行特权指令
核态向用户态转换的情形
- 一般是执行中断返回:IRET
硬件和OS对CPU的观察
- 硬件按“态”来区分CPU的态
- OS按进程来区分CPU的态
6、中断机制
外部中断
内部中断
中断处理流程
7、实模式和保护模式
实模式
- 程序按照8086寻址方法访问0h-FFFFFh(1M)空间
- 寻址方式:物理地址(20位) = 段地址:偏移地址
- CPU单任务运行
保护模式
- 寻址方式:段(32位)和偏移量(32位),寻址4G空间
- 段页式寻址机制
- 虚拟地址、进程、封闭空间
- 应用程序和操作系统的运行环境都被保护
- CPU支持多任务
8、BIOS
BIOS 固件(Basic I/O System) FIrmware
实模式存取的1M空间
前面640K :基本内存
中间128K :显卡内存
末尾256K :BIOS
末尾256K还可以细分
C0000--C7FFF:显示卡BIOS
C8000--CBFFF:IDE控制器BIOS
F0000 --FFFFF:系统BIOS
BIOS功能
- 系统启动配置
- 基本的设备I/O服务
- 系统的加电自检和启动
当电脑按下PowerOn或者Reset键执行第一条指令
执行FFFF0处的指令
- 指令内容为JUMP POST;跳转到加电自检这部分,POST位于系统BIOS内部
- 查找显卡BIOS,调用显卡BIOS
- 依次查找其他设备执行相应设备的BIOS
- 显示启动画面
- 从硬盘/软盘/等读入OS
9、主启动记录MBR
在Linux0.11中使用的还是软盘的时候,在第一扇区存放的是bootsect.S,用来启动操作系统,现在软盘已经被废弃,都使用硬盘,所以现在都是使用Grub等方式来启动系统
在0.11系统中MBR的内容就是bootsect.S,现在的MBR中的内容一般用的都是Grub
- 存放在硬盘的首扇区
- 存放和OS启动的相关信息
- 多操作系统的启动管理
- 512BYTES
- 结束存放的字符是0xAA55h
功能
- 提供菜单,让用户选择不同的启动项
- 加载核心文件:直接指向可启动区加载操作系统
- 跳转:将启动管理功能转交给其他loader
去掉MBR分区后,别的分区的起始部分叫分区启动扇区:BootLoader,PBR
10、现代系统启动的流程
- 上电后从FFFF0处的指令执行,到POST,到CMOS设置硬盘启动,读取MBR,将控制权交给MBR
- MBR读取分区表,找到其中活动分区,并确认其他分区都不是活动分区,MBR读取活动分区的第一个点扇区,并把它加载到内存中去。
- PBR(分区引导记录)继续控制后面的引导过程
- 根据相关参数,读取硬盘制定位置的文件到内存
- 加载硬盘上的OS内核,并初始化基本参数
核心初始化
- 各种寄存器初始化
- 存储系统和页表初始化
- 核心进程构建
- ……
系统初始化
- 初始化文件系统
- 初始化网络系统
- 初始化控制台
- 初始化图形界面
- ……
1、内存管理功能
三级存储体系:CPU<->CACHE<-内存<-辅存(硬盘)
基本原理:
- 当内存太小不够用时,用辅存来支援内存
- 暂时不运行的模块换出到辅存上,必要时再换入内存
操作系统存储管理实现的功能
- 地址映射
- 虚拟存储
- 内存分配
- 存储保护
地址映射
- 把程序中的地址(虚拟地址/虚地址/逻辑地址)变换成内存的只是地址(实地址/逻辑地址)
- 地址重定位,地址重映射
方式:
固定地址映射:编程和编译时确定逻辑地址和物理地址的映射关系(程序指定)
- 程序加载时必须存放在制定的内存区域
- 容易产生地址冲突,运行失败
静态地址映射(操作系统完成)
- 程序装入时由操作系统完成逻辑地址到物理地址的映射
- 程序运行之前确定映射关系
- 程序装入后不能移动
动态地址映射(页式和段式内存管理用的就是这种)
- 程序执行过程中把逻辑地址转换为物理地址
- 优点:程序占用的空间可以动态变化
- 缺点:硬件支持需要MMU,软件复杂
虚拟存储
面向用户的虚拟封闭存储空间(0-4G),线性地址空间,和物理地址分离
虚拟存储解决的问题:
- 使得大的程序能在较小的内存中运行
- 使得多个程序能在较小的内存中运行
- 使得多个程序并发运行时地址不冲突
- 使得内存利用率高:无碎片,共享方便
内存分配
需要解决的问题
- 防止策略:程序调入内存时将其放在哪个内存区
- 调入策略:何时把要运行的代码和要访问的数据调入内存
- 淘汰策略:内存空间不够时,迁出/淘汰那些代码或数据以腾出内存
存储保护
保证在内存中的多道程序只能在给定的存储区域内活动并互不干扰
- 防止访问越界
- 防止访问越权
2、物理内存管理
分区内存管理
- 不分区(DOS)
分区管理
- 固定分区:把内存固定分为若干个大小不等的分区供各个程序使用
- 动态分区:存在内存碎片
- 分区表:记录分区的位置、大小和使用标志
分区分配的原则
放置策略:
- 按空闲区位置递增排序:首次适应算法
- 按空闲区位置递减排序
- 按空闲区大小递增排序:最佳适应算法
- 按空闲区大小的递减排序:最坏适应算法
内存覆盖
在较小的内存空间中运行较大的程序
内存分区
- 常驻区
- 覆盖区
内存交换
内存不够时把进程写到磁盘,当进程要重新运行时,重新写回内存
3、虚拟内存管理
实际上现在的内存管理都是虚拟内存管理的
虚拟内存管理实现思路:
在程序运行时,只把当前必要的很小一部分代码和数据装入内存中。其余代码和数据需要时再装入。不再运行的代码和数据及时从内存中删除。
页式虚拟内存管理
把进程空间和内存空间划分成等大小的片
小片的典型大小:1K,2K或4K
进程的小片---页(虚拟页或页面)
内存的小片---页框(物理页)
进程以页装入内存,可以只转入一部分,页框不必相邻,
虚拟地址可以分解成页号和页内偏移地址
从虚拟地址得到物理地址
从虚拟地址得到物理地址方法:页式地址映射
过程三步:
- 1、从VA分离页号P和业内偏移W
- 2、查页表:以P为索引查页框号
- 3、计算物理地址MA
快表机制
- 慢表:页表放在内存中
- 快表:页表放在Cache中
页面共享
共享同一个页面,实现代码共享,防止占用内存过多
缺页中断
内存中没有要执行的代码,代码被放到了辅存中,这时就产生了缺页中断
淘汰算法
选择淘汰哪一页的规则称为淘汰策略
- 最佳算法(OPT)
- 先进先出淘汰算法(FIFO算法)
- 最久未使用淘汰算法(LRU算法)
- 最不经常使用算法(LFU)
5、段式内存管理
把进程按逻辑意义划分为多个段:数据段、代码段
以段为单位装入
现在都是段式和页式共同使用
版权属于:孟超
本文链接:https://mengchao.xyz/index.php/archives/522/
转载时须注明出处及本声明