本文将以开源操作系统Linux举例说明。

1. 操作系统概述

操作系统是用户程序和硬件之间的接口, 为用户提供各种服务和监控功能,其主要作用有处理基本的输入输出操作、分配内存和外存、为多个应用程序提供共享计算机资源的服务等。下图为操作系统在计算机系统的角色:

操作系统的架构图 操作系统架构图片_文件系统

  • 操作系统基本特征
  1. 并发
  2. 共享
  3. 虚拟化
  4. 异步
  • 一个典型的linux系统由以下部分组成
  1. bootloader
    加载操作系统的程序,常见的引导程序有Grub、redboot、Yaboot和uboot等。
  2. Linux内核映像
    主要包括进程调度、内存管理、中断异常处理系统、网络系统、文件系统、外部设备驱动系统等。内核镜像的代码是可以根据需要进行裁减的。
  3. 根文件系统映像
    保存用户程序的根文件系统,同时该系统也可以存放一些与系统资源有关的文件。
  • Linux 5.4内核代码结构

下图为适配龙芯电脑的Linux的代码目录结构图(图片摘自“基于龙芯的linux内核探索解析”一书)

操作系统的架构图 操作系统架构图片_文件系统_02

  1. 对linux系统来说,与体系结构相关的源代码全部放入./arch目录中(见上述代码结构图),并与其他代码相对独立
  2. 在arch目录中有很多子目录,如arm、powerpc、x86、mips等目录,这些子目录分别与基于arm处理器、powerpc处理器、x86处理器、mips处理器的linux系统相对应
  3. linux内核的启动实际上是各个子系统的初始化过程,初始化完成后,内核的各项功能就进入了正常工作的可用状态。
  4. 内核启动的大部分代码将会集中在arch和init两个目录中
  • 操作系统中的相关概念
  1. bootroom
    硬件,芯片内的只读存储器或外部的rom或flash,也可以是EEPROM。它存放着处理器上电时执行的第一段代码,即BIOS代码。该代码可以对系统和外设进行初始化,加载bootloader到内存等(bootroom里的代码有一些BSP的味道)
    BIOS可以实现很多功能,但具体实现的功能会根据bootroom的大小确定。
  2. bootloader
    软件,加载操作系统的程序,或实现操作系统及根分区或新版bootloader写入。通常和Linux代码存放在一块儿,将操作系统从存储器中分阶段加载到内存中。工作模式有:boot loading 方式和downloading方式
  3. firmware
    软件,存放再ROM中的驱动程序,为特殊指令提供调用。实际上,鄙人认为firmware的作用和bootrom里的代码作用功能有些重叠,所以如果bootroom里包含了硬件信息代码、系统的初始化代码、设备驱动代码,firmware可以不使用。
  4. 设备树文件
    设备树是对一台机器上所有平台设备信息的描述,设备树文件通常可以和上电初始化代码链接在一起并保存到bootroom中,后同样以启动参数的方式传递给Linux内核;如果bootroom内的代码没有传递设备树信息,则Linux内核可以使用默认的设备树描述。

2. 操作系统和体系结构的联系

操作系统包括三大基本功能和三大其他功能,分别是异常和中断处理、内存管理和进程管理,以及文件系统、设备驱动和网络协议。三大基本功能主要涉及两部分内容,一部分是与体系结构相关的特定内容,另一部分是是与体系结构无关的通用框架;三大其他功能集基本均与体系结构无关。

1 OS与指令集相关的内容

(1)ISA中定义的工作态

(2)ISA中的异常处理

  • MIPS中的异常处理
  1. 硬件检测到异常发生,并将发生时的信息保存到CP0(特殊寄存器堆,是CPU和操作系统的交互窗口),然后跳转到操作系统的通用异常处理入口。同时禁止一切异常的检测,否则检测到的异常会使系统崩溃
  2. 通用异常处理代码通过提取的异常信息识别出发生的异常,据此分发到相应的异常处理代码
  3. 所发生的异常处理代码运行完毕后,CPU跳转到被异常打断的指令重新开始运行,同时使能异常检测。

2 OS与CPU硬件相关的内容

(1)硬件在异常处理时的任务

事务1和2一般由一个异常识别单元完成,且设计为组合逻辑电路,这样才能在异常发生时产生异常信息,并通知控制器进行异常处理

  1. 识别操作系统所需要了解的异常
  2. 在异常发生时将异常信息保存到指定的位置
  3. 能够随时将异常处理代码地址或返回地址写入PC,已完成异常处理的进入和返回
  4. 能够对异常的检测进行使能

(2)虚实地址转换

3. 多种工作态和硬件保护机制

一般情况下,CPU有多种种运行模式,能够支持多个程序在各自独立的内存空间中并发执行,且有用户特权级和内核特权级的区分,让一般应用不能破坏操作系统内核和执行特权指令。

1 内存和工作态

  • 内存

地址是访问内存空间的索引,一般内存空间有两种:一个是CPU通过总线访问物理内存空间用到的物理地址,另一个是程序员编写的应用程序用到的逻辑地址(虚拟地址)。

例如C语言中的指针存储的内容就是指针指向的变量的逻辑地址。

有关虚拟地址参见:

  • 工作态

利用 程序状态字的态(模式)来对特权指令、访存范围进行控制

一般分为用户态和核态

进入核态由中断/异常机制实现,按照中断/异常向量表进入到约定程序入口

2 以arm32处理器为例

  • 七种运行模式

除用户模式外,其他六种模式为特权模式。低权模式进入高权模式要通过中断或异常

  1. 用户模式
  2. 系统模式
  3. 快中断模式
  4. 中断模式
  5. 管理模式
  6. 种植模式
  7. 未定义模式
  • 线程/进程/虚拟机的现场:

大多与操作系统无关。

  1. 线程现场:寄存器的值
  2. 进程现场:
    表示共享空间的内容,如页表基地址寄存器值。(进程可以看成模拟CPU)
  3. 虚拟机现场:
    特定的一些寄存器(虚拟机可以看成模拟计算机)
  • 异常发生时,硬件的操作
  1. 异常模式的R14保存迁移工作模式的下一条即将执行的指令地址
  2. 将CPSRd的值

3 以ARM64处理器为例

  • 四种工作态
  1. EL0(类似用户态)
    运行应用程序
  2. EL1(雷同核心态)
    运行操作系统
  3. EL2
    运行虚拟机管理器
  4. EL3(secure 态:运行固定可靠程序客房为保留空间和设备)
    运行只读的程序,例如一些固件,驱动程序等
  • 如何进入特权级运行

运行SVC进入EL1,HVC进入EL2,SMC进入EL3

EL2优先级程序可以设置低优先级程序运行时的HCR_EL2寄存器

每个特权级都有自己的中断异常向量基址寄存器,保存每个特权级都有自己的向量表基地址

4 以80386处理器(x86架构)为例

对于80386处理器来说,他有四种运行模式。

  • 四种工作模式
  1. 实模式
    早期PC采用的简单运行模式,当时的DOS操作系统即运行在该模式下。
    80386加电启动后处于实模式运行状态,该模式下软件可访问的物理内存空间不超过1MB,且无法发挥intel 80386以上级别的32位CPU的4GB内存管理能力。实模式将整个物理内存空间看成分段的区域,程序代码和数据位于不同的区域,OS和用户程序并没有区别对待,且每一个指针都指向实际的物理地址。
  2. 保护模式
    保护模式的目地在于确保应用程序无法对操作系统进行破坏。
    80386处理器通过在实模式下初始化控制寄存器以及页表,然后再通过设置CR0寄存器是其中的保护模式使能位置位,从而进入到保护模式。
    该模式下,处理器所有的32根地址线都可供寻址,物理寻址空间高达4GB;同时支持内存分页机制,提供了对虚拟内存的良好支持,支持多任务模式、优先级机制,不同程序可以运行在不同的特权级上
  3. SMM模式
  4. 虚拟8086模式

4. 文件系统

1 概念

  • 文件系统

文件系统是操作系统中管理持久性数据的子系统,可以童工数据存储和访问功能

  • 文件

文件是具有符号名,由字节序列构成的数据项集合

文件是文件系统的基本数据单位

文件的属性包括名称、类型、位置、大小、保护、创建者、创建时间等

文件头:即文件系统元数据中的文件信息

  • 文件系统的功能
  1. 分配文件磁盘空间,包括管理文件块的位置和顺序、管理空闲空间的位置等、分配算法
  2. 管理文件集合,包括文件定位、命名、文件系统结构(文件的组织方式)
  3. 保证数据可靠和安全,即多层次的保护数据安全,且持久地、避免系统崩溃媒体错误攻击地保存文件

5. 操作系统的启动

事实上,不同OS的启动由于计算机体系结构的不同有着多种启动方式,这是工程师根据体系结构设计的,同时针对某一体系结构下的某一操作系统来说,要根据整个架构的属性体系结构的特点进行相应的初始化和处理,例如有些与处理器系统相关的资源如MMU、中断、系统调用等,必须根据自身系统的特点进行处理;与指令集,操作系统种类关系不大。指令集只是提供了程序和硬件衔接的接口,而操作系统种类虽然不同,但是一个OS从加载到运行的过程均是前篇一律的。

OS的启动可以分为两部分,一部分为上电后初始化和操作系统的加载,另一部分为OS内核的启动。

1 启动类别

  • 单系统启动
  1. 加电
  2. bootrom运行
  3. osloader运行
  4. 操作系统运行
  • 双系统启动
  1. 加电
  2. 片上ROM
  3. BIOS运行
  4. MBR的Grub运行
  5. Ntloader程序运行
  6. 操作系统初始化