现代操作系统:原理与实现(第一章)

《现代操作系统:原理与实现》

第一章

+++


操作系统概述

苹果Mac OS X和ISO使用开源类UNIX操作系统Darwin,谷歌的Android采用Linux作为操作系统内核。

X86ARMMIPS是目前具有代表性的CPU架构;其中X86是使用CISC复杂指令集的代表架构,ARM、MIPS使用的是RISC精简指令集

操作系统的两个职责

  • 对硬件进行管理和抽象;
  • 为应用提供服务并进行管理;

从硬件角度,操作系统主要包含两类共性功能:

  • 管理硬件:将硬件资源纳入统一的管理;
  • 对硬件进行抽象:将有限的、离散的资源高效地抽象为无限的、连续的资源;

从应用角度,操作系统主要包含两类共性功能:

  • 服务于应用: 提供接口(如系统调用等)和不同类型的访问控制、应用间交互等功能;
  • 管理应用:负责对应用生命周期的管理,包括应用的加载、启动、切换、调度、销毁等;

狭义的操作系统:操作系统内核加上一个Shell(即UNIX/Linux等操作系统中的命令行界面)。

广义的操作系统:进一步分为操作系统内核操作系统框架两层。

如图1-1为操作系统的简要结构:

  • 操作系统内核负责对硬件资源的管理和抽象,为操作系统框架提供基础的系统服务
  • 操作系统框架则基于操作系统内核提供的服务为不同的应用领域提供编程接口与运行环境

image-20211124110514955


操作系统的必要性

一台机器上只有一个应用程序,开机后自动运行不会退出,是否需要操作系统?

  • 若没有操作系统,则应用需要直接与硬件打交道,直接实现对硬件资源的管理和抽象,如果应用出现故障,极有可能引起计算机直接崩溃,没有诊断和调试的机会。当然解决上述问题,可以使用实现一套硬件资源管理与抽象的库的方法,但是实际上这个库实现的就是操作系统功能的一部分。目前,一些对性能和时延要求极高的场景就是通过类似的方法实现的,包括本书后面会介绍的基于外核(Exokernel)架构的库操作系统(LibOS)虚拟化容器等方法。

如果一个应用希望直接控制硬件而不是使用操作系统提供的抽象,是否还需要操作系统?

  • 尽管应用希望直接控制硬件资源,但是应用的加载与销毁、多个应用之间的切换与隔离等依然需要操作系统来完成,此外,操作系统也可以从全局的角度更合理地对应用进行调度,从而更加高效地利用硬件资源。

如果在一个死循环中,每次循环执行都调用操作系统提供的**fork()**接口创建一个新的进程,则这个程序会以指数级的速度创建大量进程。

由于每次创建进程都需要消耗一定的资源,最终可能会将计算机的物理资源耗尽。

为了避免这种情况,操作系统提供了为每个应用的资源设置配额的机制,从而限制一个应用所能使用的资源数量。

指令集架构(Instruction Set Architecture ,ISA)

在包括UNIX在内的操作系统早期,用户主要通过使用shell命令行与操作系统进行交互,用户一般是程序员。

图形用户界面(Graphical User Interface , GUI)

image-20211225105831881

操作系统接口

从应用的角度来看,操作系统提供了不同层次的接口,主要包括系统调用接口、POSIX接口、领域应用接口。

image-20211225110102367

系统调用接口

应用程序通过操作系统内核提供的接口(如系统调用)向内核申请服务。

image-20211225111057356

例:

printf函数调用标准库libc中的write函数,libc在准备好相关的参数后,执行svc指令使得控制流从用户地址空间下陷到内核地址空间。(svc指令是一条ARM指令,表示特权调用(supervisor call))

操作系统内核的下陷处理函数根据系统调用传入的第一个参数,识别出该调用需要执行操作系统内核提供的sys_write函数,从而通过系统调用表调用对应函数。

系统调用是用户态应用向操作系统内核请求服务的方法。

image-20211225145225075

POSIX接口

由于每个操作系统提供的系统调用各不相同,为了同一个应用程序在不同操作系统上的可移植性,逐渐形成了一些可移植操作系统接口标准,例如POSIX。

POSIX(Portable Operating System Interface for uniX),可移植操作系统接口,X表明其是对UNIX API的传承。

POSIX标准通常通过C library (libc) 来实现,常见的libc包括glibc 、 musl、eclibc。

通常而言,应用程序只需要调用libc提供的接口就可以实现对操作系统功能的调用,同时也实现了应用在类UNIX系统(包括Linux)上的可移植性。不同的操作系统也可以通过对libc的移植来支持现有的应用生态。

领域应用接口

在POSIX或操作系统调用的基础上还可以封装面向不同领域的领域应用接口。例如面向汽车领域、移动平台。

常见的兼容,例如POSIX API兼容Linux ABI兼容等。

API是指应用编程接口(Application Programming Interface),它定义了两层软件(例如libc与Linux内核)之间源码层面的交互接口。

ABI指应用二进制接口,即在某个特定体系结构下两层软件之间二进制层面的交互接口,包括如何定义二进制文件格式(如ELF(Executable and Linkable Format)或者Windows中的EXE文件格式)、应用之间的调用约定(包括参数传递与返回值处理)、数据模式(大端模式、小端模式)等。

ChCore :一个简单的实验操作系统

ChCore是本书为教学二开发的实验操作系统,其基本架构如图所示。ChCore采用了微内核架构的设计理念,将大部分的系统功能以系统服务的形式运行在用户态,这与Linux和Windows为代表的宏内核操作系统形成鲜明对比。

image-20211225151603691

在Linux或Windows中,文件系统通常作为操作系统内核一部分直接运行在内核态,然而在Chcore中,文件系统不再属于内核的一部分,而是作为一个系统服务运行在用户态,实际上是一个独立的用户态进程。

ChCore实验操作系统包括两个部分:

  • 运行在内核态的ChCore微内核
  • 运行在用户态的各种操作系统服务

ChCore还提供了一个简单的命令行终端程序,即图中的Shell,作为与用户交互的界面。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信