操作系统概念

操作系统就是位于计算机用户与计算机硬件之间的一个大型程序,可以更好的管理计算机的硬件,方便计算机用户。

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、段式内存管理

把进程按逻辑意义划分为多个段:数据段、代码段

以段为单位装入

现在都是段式和页式共同使用

Last modification:February 27th, 2020 at 03:07 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment