OS概述


操作系统的概念和功能

概念

负责管理协调硬件、软件等计算机资源的工作,为上层用户、应用服务提供简单易用的服务,是一种系统软件

  • UI
  • ABI:可以通过相应的编程语言使用这些接口,以操作计算机系统来完成某项特定任务
  • API:将程序与操作系统、硬件平台之间紧密协作需要遵守的特定规则保留出来
  • ISA:工业标准体系结构

功能和目标

  • 资源管理者
    • 处理机管理
    • 存储器管理
    • 文件管理
    • 设备管理
  • 向上层提供服务
    • 直接给用户使用的
      • GUI(图形用户界面)
      • 命令接口:联机命令接口(一句一句执行),脱机命令接口(一批一起执行)
    • 给软件/程序员使用的:程序接口(即系统调用)
  • 对硬件机器的扩展:虚拟机

特征

  • 并发性:宏观上同时,微观上交替(区别于并行:同一时刻同时发生)
    注:单核CPU各程序只能并发执行,多核CPU可以并行执行
  • 共享性:并发和共享互为存在条件
    • 互斥共享方式(如对摄像头设备的共享使用)
    • 同时共享方式(如对硬盘资源的共享使用)
  • 虚拟性:把一个物理上的实体变为若干个逻辑上的对应物
    • 空分复用技术(如虚拟存储技术)
    • 时分复用技术(如虚拟处理器技术)
  • 异步性

发展与分类

冯·诺伊曼体系结构:存储程序式,指令与数据共同存储,通过一个总线访问

哈佛结构:将指令存储与数据存储分离

  1. 手工操作阶段

  2. 批处理阶段

    1. 单道批处理系统(引入脱机输入输出技术,即输入/输出脱离主机控制)
    2. 多道批处理系统(操作系统开始出现)
      多道程序设计技术,就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存中(前提是内存放的下),并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
      引入多道程序设计技术后形成多道批处理系统
      优点:系统吞吐量大,资源利用率高
      缺点:平均周转时间长,不能交互(上面所说的I/O请求是指请求“读取文件”之类的操作,需要等待直到I/O操作完成,所以不是在和用户交互)
  3. 分时操作系统

    分时系统:将CPU处理时间分割为多个时间片,将时间片分给不同程序,达到多个程序“同时”运行的效果
    两种典型分时操作系统:(1) Multics/Unix (1968/1970) (2) IBM VM 360/370

  4. 实时操作系统:能优先处理紧急任务,一般用于嵌入式

    • 硬实时系统:必须在绝对严格的限定时间内完成处理
    • 软实时系统:能接受偶尔违反时间规定
  5. 网络操作系统

    在传统单机OS上加单独软件层,主要提供联网功能和资源的远程访问,实现多机互联、分布式与嵌入式系统

  6. 分布式操作系统

    多台机器统一管理形成单一系统,相比于网络操作系统,对用户和应用高度透明

  7. 个人计算机操作系统

注:

多道批处理 分时技术
不可交互 可交互
侧重于作业的批量处理和长处理时间 强调用户与计算机的实时交互和独占使用

运行机制

程序运行原理

高级语言编写的代码 –> 机器指令
程序运行的过程就是CPU执行指令的过程

两类程序

  • 内核程序
  • 应用程序

两类指令

  • 特权指令
  • 非特权指令

两种处理器状态

  • 内核态/核心态/管态
  • 用户态/目态

内核

是操作系统最重要最核心的部分,由很多内核程序组成操作系统内核

如何改变CPU状态?

  • 内核态 –> 用户态 :一条修改PSW(程序状态字,也叫程序状态寄存器)的特权指令
  • 用户态 –> 内核态 :由中断引起,硬件自动完成

中断和异常

  1. 作用:
    让操作系统内核强行夺回CPU控制权,使CPU从用户态变为内核态

  2. 分类

    • 异常(内中断)
      • 陷阱(trap)
      • 故障
      • 终止
    • 中断(外中断)
      • 时钟中断
      • I/O中断请求
  3. 中断机制的基本实现原理

    1. 检查中断信号
      • 异常:CPU在执行指令会检查是否有异常发生
      • 中断:每个指令周期末尾,CPU都会检查是否有中断信号需要处理
    2. 找到相应的中断处理程序:通过中断向量表实现

系统调用

  1. 定义:操作系统对应用程序/程序员提供的接口

  2. 系统调用和库函数的关系:有的库函数是对系统调用的进一步封装,有的库函数没有使用系统调用

  3. 什么功能要用系统调用实现:设备管理、文件管理、进程控制、进程通信、内存管理

  4. 系统调用的过程:

    1. 传参
    2. 陷入(trap)指令
    3. 由操作系统内核程序处理系统调用请求
    4. 返回应用程序

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基本地址空间

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启动过程

  1. start.S: 从_start开始执行

    • 初始化中断向量
    • 寄存器清零
    • 配置寄存器的CP0_STATUS, 设置所使用的协处理器,中断以及CPU运行级别(核心级)
    • 配置gp寄存器
  2. lowlevel_init.S: 从lowlevel_init开始执行,工作频率配置(e.g: CPU主频、总线、DDR工作频率)

  3. cache.S

    • mips_cache_rest: 对cache进行初始化
    • mips_cache_lock: 设置堆栈

    由于此时ddr ram并没有配置好,而如果直接调用c语言的函数必须完成栈的设置,栈必定要在ram中。所以,只有先把一部分cache拿来当ram用。做法就是把一部分cache配置为栈的地址并锁定。这样,当读写栈的内存空间时,只会访问cache,而不会访问真的ram地址了

第一阶段:三个汇编代码


  1. 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)

x86启动过程

  1. 加载BIOS BIOS v.s. UEFI(统一可扩展固件接口)
  2. 读取MBR(主引导记录,即磁盘上第0磁头第0磁道第一个扇区):启动代码及数据、分区表、幻数

x86下Linux系统引导过程

  1. Boot Loader
  2. 加载内核
  3. init进程执行
  4. 用户层init依据initab文件来设定运行等级
  5. init进程执行rc.sysinit
  6. 启动内核模块
  7. 执行不同运行级别的脚本程序
  8. 执行/etc/rc.d/rc.local(留给用户个性化的地方)
  9. 执行/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的系统调用

Author: CuberSugar
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source CuberSugar !
  TOC