操作系统学习笔记(一)——绪论

一、绪论

1 计算机硬件

(1)CPU

专用寄存器

程序计数器 保存了将要取出的下一条指令的内存地址
堆栈指针 指向内存中当前栈的顶端
程序状态字PSW 这个寄存器包含了条件码位、CPU优先级、模式(用户态或内核态),以及其他各种控制位。用户程序通常读入整个PSW,但只对其中少量字段写入,在系统调用和IO中,PSW的作用很重要

流水线与超标量CPU

取指单元
解码单元
执行单元
取指单元1
解码单元1
保持缓冲区
执行单元1
取指单元2
解码单元2
执行单元2
执行单元3

   在多数的流水线设计中,一旦一条指令被取进流水线中,它就必须被执行完毕,即便前一条取出的指令是条件转移。
  在超标量设计中,通常有多个执行单元。两个或更多的指令被同时指出、解码并装入暂存缓冲区,直至它们执行完毕。只要有一个执行单元空闲,就检查保持缓冲区是否还有可处理的指令,如果有,就把指令从缓冲区中移出并执行。存在一个问题:程序的指令经常不按顺序执行。多数情况下,硬件负责保证这种运算的结果与顺序执行指令时的结果相同。

(2)存储器

典型访问时间 典型容量
1ns 寄存器 <1KB
2ns 高速缓存 4MB
10ns 主存
10ms 磁盘

(3)磁盘

磁道 盘片上的圆环
柱面 不同盘片上的磁道
扇区 磁道上的不同区间,典型值为512字节

(4)IO设备

设备受设备控制器控制,而操作系统通过驱动程序控制设备控制器,驱动程序一般在内核态运行,需要将驱动程序装入操作系统中。有三个途径:
1 将内核与设备驱动程序重新连接,重新启动 如UNIX
2 在一个操作系统文件中设置一个入口,该文件通知操作系统需要一个设备驱动程序,重启系统。系统启动时即可装在设备驱动程序。如Windows
3 热插拔 如USB\

实现输入和输出的三种方式:

1 忙等待 需要占据CPU,CPU一直轮询设备知道对应的IO操作完成
2 中断的方式
关于中断 https://www.cnblogs.com/funeral/archive/2013/03/06/2945485.html
https://blog.csdn.net/tigerjibo/article/details/6067258
3 DMA
  DMA直接内存存取原理是指外部设不通过CPU而直接与系统内存交换数据的接口技术。采用中断传送有它的缺点,对于一个高速I/O设备,以及批量交换数据的情况,只能采用DMA方式,才能解决效率和速度问题。DMA在外设与内存间直接进行数据交换,而不通过CPU,这样数据传送的速度就取决于存储器和外设的工作速度
  通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态–高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。DMA控制器必须有以下功能:

1. 能向CPU发出系统保持(HOLD)信号,提出总线接管请求;

2. 当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;

3. 能对存储器寻址及能修改地址指针,实现对内存的读写操作;

4. 能决定本次DMA传送的字节数,判断DMA传送是否结束

5. 发出DMA结束信号,使CPU恢复正常工作状态。

(5)总线

高速缓存、内存、PCIe、PCI、USB、SCSI、SATA和DMI
在这里插入图片描述
p18
PCI总线使用并行传输,是共享总线架构,多个设备使用一条总线,由仲裁器决定那个设备可以使用总线;而PCIe使用串行传输,使用分离的端到端的链路

2 操作系统概念

(1)进程

进程基本上是容纳运行一个程序所需要的所有信息的容器

(2) 地址空间

(3)文件

在读写文件之前,首先要打开文件,检查其访问权限,若权限许可,系统将返回一个小整数,成为文件描述符,供后续操作使用。若禁止访问,系统返回一个错误码
  特殊文件 提供特殊文件是为了是IO设备看起来像文件一般,这样就使得操作IO设备跟操作文件一样,使用相同的系统调用。有两类特殊文件:块特殊文件,如磁盘等,字符特殊文件,如打印机、其他接收或输出字符流的设备。按照惯例,特殊文件保存在/dev目录中

3 系统调用

   异常控制流是机制,中断是技术
  陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的。陷阱处理程序提供的服务为当前进程所用,而中断处理程序提供的服务则不是为了当前进程的。中断是由硬件引起的,而异常是由软件引起的;中断是异步的,而异常是同步的。
中断 https://www.cnblogs.com/funeral/archive/2013/03/06/2945485.html

  1. 外部中断
    外部中断是由外部设备引发的中断,而引发中断的设备被称为中断源,中断源大致可以分为以下几种
    1 定时器、计时器
    2 键盘
    3 内部实时时钟
    4 通用接口
    5 PS/2鼠标
    6 协处理器
    7 IDE/SATE硬盘
    8 串口
    9 并口
    10 软盘
  • 可屏蔽中断
  • 不可屏蔽中断
    外部设备通过"可编程中断控制器(Programmable Interrupt Controller,PIC)"向CPU报告的中断,大致流程如下:
    1 外部设备通过中断请求线(IRQ)连接到一个"中断控制器"上
    2 当一个外部设备需要发出中断时,会驱动对应的中断请求线进入有信号状态
    3 中断控制器检测这个中断是否被屏蔽了(CPU的IF位被置1,则不屏蔽任何外部中断;CPU的IF位被置0,则屏蔽所有外部中断),如果没有被屏蔽就驱动CPU的"INTR中断请求线"进入信号状态
    4 CPU随后就能检测到这个中断了(在每次CPU周期的下降沿检测一次中断)
    5 如果该中断被屏蔽(CPU中的中断屏蔽寄存器被选中),中断控制器中的寄存器中的某一位位将记录这一请求,等到中断被开启时再驱动CPU的"INTR中断请求线"进入信号状态
    6 之后CPU通过"中断应答"从中断控制器的数据线上读取中断号,并通过中断号获取中断向量
    7 如果多个设备(外设中断源)在同一时刻通过不同的中断请求线发出中断请求,中断控制器也会将这些请求记录在不同的位中
    8 如果这些中断都没有被屏蔽,则中断控制器根据优先级,依次执行优先级高的中断(IRQn的数字n越小优先级越大)
  1. 内部中断
    和外部中断相对的就是内部中断。从CPU的角度看,外部中断是一个异步事件,它可能在任何时候发送,而内部中断是一个同步事件,它是执行某条指令时产生的
    内部中断可以大致分为以下几种
    1. 异常(faults)
      CPU在指令执行时产生的,异常是可以修复的。当异常发生时,压入堆栈的是产生异常的"那条指令",当CPU执行异常处理程序结束后,将"重新执行那一条指令"。
      1.1) 缺页异常: 14: #PF
      1.2) 保护错误(内存或其他保护检查): 13: #GP
      1.3) 堆栈段错误(堆栈操作或者加载SS): 12: #SS
      1.4) 段不存在(加载段寄存器后访问段): 11: #NP
      1.5) 除法错误(DIV/IDIV指令): 0: #DE
      1.6) 越界: 5: #BR
      1.7) 无效操作码(无效操作指令): 6: #UD
      1.8) 对齐校验(内存访问): 17: #AC
    2. 陷阱(traps)
      在CPU执行陷阱指令后,立刻通过中断描述表执行预定的陷阱处理例程。陷阱处理例程执行结束后,将返回陷阱指令的"下一条指令"继续执行。
      2.1) 系统调用(system call)
      系统调用是一种软中断,软中断是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)
           这是最常使用到的中断,我们在编程中使用到的API最终都会通过系统调用这种内部中断来进行ring3到ring0的切换
      2.2) 单步异常(调试异常): 1: #DB
      用于单步执行、内存断点
      2.3) INT3(断点异常): 3: #BP
      2.4) 溢出(指令INT0): 4: #OF
    3. 终止(aborts)
      3.1) 双重错误(所有能产生异常、NMI、或者INTR的指令): 8: #DF\

疑问点

计算机使用陷阱而不是一条指令来执行系统调用??
每个线程在操作系统看来就像是单个的CPU??

补充知识点

  • L1、L2、L3缓存 CPU与内存间的缓冲,最靠近CPU的是L1缓存,命中率80%
  • UNIX进程将其存储空间划分为三段:正文段数据段堆栈段;数据向上增长而堆栈向下增长
进程的三段
堆栈
空闲区
数据
正文

猜你喜欢

转载自blog.csdn.net/u010069259/article/details/89843301