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内核运行之前的一小段程序。(图中MBR和PBR构成BootLoader,MBR是第一阶段,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