首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux是怎样工作的:Linux系统的抽象层次、主存与内核

Linux是怎样工作的:Linux系统的抽象层次、主存与内核

乍一看,像Linux这样的现代操作系统非常复杂,同时运行和通信的部件数量多得令人眼花缭乱。例如,web服务器可以与数据库服务器通信,而数据库服务器又可以使用许多其他程序使用的共享库。这一切是如何运作的,我们应该如何理解?

理解操作系统如何工作的最有效方法是通过抽象——我们可以忽略组成试图理解的部分的大多数细节,而将注意力集中在其基本目的和操作上。例如,当我们乘坐一辆汽车时,通常不需要考虑诸如将发动机固定在车内的安装螺栓或建造和维护汽车行驶道路的人等细节。我们真正需要知道的是这辆车是做什么的(把我们送到别的地方)和一些基本的使用方法(如何操作车门和安全带)。

如果我们只是车里的一名乘客,这种抽象层次可能会起作用。但是,如果我们还需要驱动它,则必须深入挖掘并将抽象分解为几个部分。现在,我们可以在三个方面扩展知识:汽车本身(例如它的大小和功能)、如何操作控制(方向盘、加速踏板等)以及道路特征。

当我们试图查找和修复问题时,抽象可以提供很大的帮助。举个例子,假设我们在开车,路上很颠簸。我们可以快速评估刚才提到的三个与汽车相关的基本抽象,以确定问题的根源。如果两者都不是问题,那么消除前两个抽象(我们的车或驾驶的方式)应该是相当容易的,因此可以将问题缩小到道路本身。我们可能会发现道路崎岖不平。现在,如果我们愿意,则可以更深入地挖掘对道路的抽象概念,找出为什么道路已经恶化,或者,如果道路是新的,为什么建筑工人做得很差。

软件开发人员在构建操作系统及其应用程序时使用抽象作为工具。在计算机软件中,抽象的细分有很多术语——包括子系统、模块和包——但在本章中我们将使用术语组件,因为它简单。在构建软件组件时,开发人员通常不会过多考虑其他组件的内部结构,但他们确实会考虑他们可以使用的其他组件(这样他们就不必编写任何额外的不必要的软件)以及如何使用它们。

本章提供了组成Linux系统的组件的高级概述。尽管每个组件在其内部构成中都有大量的技术细节,但我们将忽略这些细节,并将注意力集中在组件与整个系统的关系上。我们将在后面的章节中详细讨论。

1.1 Linux系统中的抽象层次

使用抽象将计算系统分解为组件可以使事情更容易理解,但是如果没有组织就无法工作。我们根据组件位于用户和硬件之间的位置将组件排列成层或级别,对组件进行分类(或分组)。网页浏览器、游戏等位于顶层;在底层,我们有计算机硬件中的存储器——0和15。操作系统占据了中间的许多层。

Linux系统主要有三个层次。图1-1显示了这些级别以及每个级别中的一些组件。硬件在基础。硬件包括存储器以及一个或多个中央处理单元(cpu),用于执行计算和对存储器进行读写。磁盘和网络接口等设备也是硬件的一部分。

下一层是内核,它是操作系统的核心。内核是驻留在内存中的软件,它告诉CPU在哪里寻找下一个任务。内核充当中介,管理硬件(尤其是主存),是硬件和任何正在运行的程序之间的主要接口。

进程(内核管理的运行程序)共同构成系统的上层,称为用户空间。(更具体的流程术语是用户流程,不管用户是否直接与流程交互。例如,所有web服务器都作为用户进程运行。)

图1-1:通用Linux系统组织

内核进程和用户进程的运行方式有一个关键的区别:内核以内核模式运行,而用户进程以用户模式运行。在内核模式下运行的代码可以不受限制地访问处理器和主内存。这是一个强大但危险的特权,它允许内核很容易地破坏和崩溃整个系统。只有内核可以访问的内存区域称为内核空间。

相比之下,用户模式限制了对内存子集(通常相当小)的访问和安全的CPU操作。用户空间是指用户进程可以访问的主存部分。如果进程出错并崩溃,后果是有限的,可以由内核清除。这意味着,如果我们的浏览器崩溃了,它可能不会停止在后台运行了几天的科学计算。

理论上,用户进程失控不会对系统的其余部分造成严重损害。实际上,它取决于我们所认为的“严重损害”,以及进程的特定特权,因为允许一些进程比其他进程做更多的事情。例如,用户进程可以完全破坏磁盘上的数据吗?有了正确的权限,我们可能会认为这是相当危险的。但是,有一些保护措施可以防止这种情况,并且大多数进程根本不允许以这种方式造成严重破坏。

Linux内核可以运行内核线程,内核线程看起来很像进程,但是可以访问内核空间。一些例子是kthread和kblock。

1.2硬件:了解Main Memory

在计算机系统的所有硬件中,主存可能是最重要的。在其原始形式中,主存只是一个存储一堆0和1的大存储区域。每个0或1的槽位成为一个位。这是正在运行的内核和进程所在的地方——它们只是大的比特集合。所有来自外围设备的输入和输出都流经主存储器,也是一堆比特。CPU只是内存上的运算符;它从存储器中读取指令和数据,并将数据写回存储器。

我们经常会在内存、进程、内核和计算机系统的其他部分中听到状态这个术语。严格地说,状态是比特的一种特殊排列。例如,如果内存中有四个比特,0110、0001和1011代表三种不同的状态。

当考虑到单个进程可以很容易地由内存中的数百万位组成时,在谈论状态时通常更容易使用抽象术语。而不是用比特来描述一个状态,描述的是某物现在做了什么或正在做什么。例如,我们可能会说,“进程正在等待输入”或“进程正在执行启动的第2阶段”。

由于通常用抽象术语而不是实际的比特来表示状态,因此术语“图像”指的是比特的特定物理排列。

1.3内核

为什么我们要讨论主存和状态?内核所做的几乎所有事情都是围绕主存进行的。内核的任务之一是将内存分成许多细分,并且必须始终维护这些细分的某些状态信息。每个进程都有自己的内存共享,内核必须确保每个进程都使用自己的内存共享。

内核负责管理四个一般系统区域的任务:

进程内核负责决定哪些进程可以使用CPU。

内核需要跟踪所有内存——当前分配给特定进程的内存、进程之间可能共享的内存以及空闲的内存。

设备驱动程序内核充当硬件(如磁盘)和进程之间的接口。操作硬件通常是内核的工作。

系统调用和支持进程通常使用系统调用与内核通信。

在接下来的章节我们将继续探讨Linux内核的更多奥秘。

参考

How Linux Works, 3rd Edition (Early Access 2021) (bibis.ir)

Memory hierarchy - Wikipedia

  • 发表于:
  • 原文链接https://page.om.qq.com/page/ORM8UxoEza_RG_zSYnBSvagw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券