Linux操作系统 —— 内核(二)

Linux操作系统 —— 内核(二)

本系列,是自己学习Linux过程中的笔记。
希望读者在看完全文后,也能留下你们的经验或者问题。
如果能从这里学到点东西,记得请我喝杯☕☕☕~

—— MinRam

一、前言 Overview

操作系统(Operate System) 是硬件的管家。

组装过个人电脑(Personal Compute)的朋友,一定知道一台完整的电脑主要包括: CPU, 内存条, 主板, 硬盘, 显示器, 鼠标/键盘, 显卡

个人计算机基本组件

在组装完这些硬件后,还需要安装一个操作系统,比如windows。在经过各种配置(折腾),最后完成了从硬件到可操作的计算机组装。最后装上QQ,加个群,愉快地在群里吹逼。

那么操作系统是如何管理这么多的组件,最后只需要通过鼠标和键盘,就能提供各种各样的服务呢?

二、内核 Kernal

内核(Kernal), 是操作系统的心脏,可以理解是一家通过包装和管理硬件资源,为上层运行的软件提供简单便捷服务的公司。

以较合理的方式阐述内核的地位:

内核地位

  • 从技术层面讲:内核是硬件和软件的中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
  • 从应用层面讲:上层应用软件并不关心硬件,它最多只需要关心内核。内核是应用程序在系统中所能触碰的最底层。所以内核抽象了硬件,让应用感知不到实际硬件的逻辑细节。
  • 内核是硬件的资源管理程序。负责将可用资源(CPU, Disk, RAM)分配到各个系统进程。
  • 内核也基于系统调用子系统(System Call)提供了一整套系统操作库,让应用程序能像普通函数一样,调用系统接口。

系统主要由以下几个组成部分,由系统调用(系统调用子系统)统一管理。应用通过系统调用提供的函数接口与内核进行交互。用户应用程序执行的区域是用户空间,以下则是内核空间。

操作系统内核体系结构图

以上阐述,可能都听不懂,所以结合QQ应用,从打开到发消息吹逼,解释内核各组件的用途。

年少有钱

1. 设备管理子系统 (Device Management System

计算机有各式各样的外接设备(鼠标,键盘,摄像头,音响)。这些设备都是由不同制造商制作的,但却都能在操作系统中适配。其关键就是设备管理子系统

操作系统的设备管理子系统,又叫做设备驱动系统。为了能够兼容这些各式各样的设备,系统将设备进行了抽象成几个动作(初始化/释放,读取设备上的信息,发送消息给设备,检测设备错误)。这样操作系统就不必去定义所有牌子的设备。

在Linux系统中,设备被分成:字符设备,块设备,网络设备。

在QQ的例子中,我们分成两类设备: 输入设备和输出设备。

输入设备,就是计算机给使用者(客户)提供的客户对接员(客服),用来接受使用者(客户)的反馈。

鼠标/键盘,就是计算机输入设备。我们通过移动鼠标,告知电脑,指针往哪个方向移动了多少,左键或者右键。又或者通过键盘,告知电脑,我们输入什么样的字符。如同公司的客服,配备销售、售前的岗位,与客户对接,把需求传递到后方。

而对于操作系统,鼠标/键盘对应的驱动(输入设备驱动),就是操作系统配备的客户对接员,用来解释设备传递过来的信息。同时这会给操作系统发送中断信号,告知操作系统需要停下来,听听使用者要干嘛。这个时候使用者发送消息的事件,为中断事件 Interrupt Event

补充下硬件到软件的知识(以现在常见的USB接口鼠标为例):
鼠标信号流

除了USB接口的鼠标外,还有PS/2和串口等,其信号流路径各不相同。
USB接口

现在通过鼠标,能操作指针去打开QQ。

输出设备,就是计算机给使用者(客户)提供的产品交付员,用来给使用者(客户)反馈结果。

显示器 + 显卡,就是计算机输出设备。将计算机处理结果展示给使用者(客户)。对于显卡和显示器,只知道在哪个坐标,展示什么图像(像素)。当鼠标移动时,不断的刷新指针的位置,重新绘制。

而对于操作系统,显卡驱动就是操作系统的产品交付员

因此通过显示器,我们能知道指针到哪了,QQ的快捷键位置,以及QQ运行过程中的各种消息。

驱动

2. 文件管理子系统 (File Management System)

通过鼠标点击快捷键,发送中断事件,操作系统开始处理“指针点击QQ快捷键”事件。

在操作系统知道,指针点击了QQ的快捷键后,操作系统开始启动QQ。而这不再是简单的移动指针,不是零星的操作,于是系统选择单独立项,由单独的进程(项目组)来执行这个项目。

显然,立项就需要有完整的执行计划书,指导系统该怎么做,怎么执行,遇到各种情况该怎么办。而这些逻辑都被程序定义好,也就是由开发者设计并编写的代码,通过编译变成这份项目执行计划书(程序)。

这些程序,都是通过二进制被存放在计算机的存储设备上,也就是常说的硬盘。硬盘也是计算机的物理设备。在第一次使用时,会进行格式化 (对存储空间初始化)之后,就能存储这些文件。为管理这些文件,操作系统提供了文件管理子系统File Management System)。就像存放项目计划书的档案室,有一定的归档格式,在需要的时候,可以拿到对应应用的程序。

从文件管理子系统中,我们拿到了QQ的程序。这只是一份二进制数据,指导QQ的运行逻辑。

在Linux系统中,有一个概念: 一切都是文件。Linux把各种资源都当作文件,包括硬件设备(对应设备文件)。所以Linux系统的根文件系统实现了虚拟文件系统(Virtual File System, VFS)。

3. 系统调用子系统 (System Call System)

系统调用,是操作系统上层应用进入内核的入口。

就跟项目的建立,需要项目组,人力,物力和流程审批一样。运行一个程序,需要CPU、内存、各种设备的调度。而资源的调度,就涉及到两个问题:

  1. 效率,时间就是金钱,不管是资源申请还是使用,都应尽可能高效。
  2. 权限,一个公司中会有多个项目,每个项目都有各自的权限。同样的每个程序都有各自的权限,普通程序不能访问机密程序的资源等。

效率,主要就是依靠操作系统的统一接口,统一的办事大厅,也就是系统调用权限,则依靠操作系统的权限机制,例如linux的文件权限管理。

而QQ的启动,就需要通过系统调用,来调用进程管理子系统,创建新进程Process)。

通过系统调用,我们为QQ建立起新进程,用来专门处理QQ的逻辑。

一旦项目(程序)正式立项,就要开始执行,就要成立项目组(进程),将开发人员(线程)分配到这个项目组(进程),按照项目执行计划书(代码)一步一步执行。

4. 进程管理子系统 (Process Management System)

通过进程管理子系统,创建了QQ进程。由文件系统中的静态程序转变成运行中的进程。

进程管理子系统的核心业务就是进程调度。在Linux内核中,它的调度单位就是进程,负责调度多个进程对CPU的访问,从而在宏观上,系统中的进程是并发的。除了上面提到的创建新进程(fock,exec),进程调度子系统还提供了结束进程(kill,exit),控制进程,同步进程以及进程间通讯的接口。

进程

CPU的处理线程就好比开发人员,多个进程就是一个个项目,进程管理子系统就像项目经理,负责调度项目到开发人员手上进行。

进程和程序的区别:

  • 程序: 存放在硬盘(存储设备)上的一段代码和数据的可执行镜像,是一个静态的实体,并不会有任何变化。
  • 进程: 是一个执行中的程序,由CPU执行,在根据代码的逻辑,动态变化的实体。

通过进程管理子系统,为QQ建立一个进程(项目组),为这个进程提供可用的CPU(开发人员)

5. 内存管理子系统 (RAM Management System)

通过内存管理子系统,保证系统各个进程安全访问内存区域。

在Linux系统中,内存管理子系统保证各个进程有自己独立且私密的内存空间,同时也实现了虚拟内存到物理内存的转换,以及系统的可用空间。

内存

每个项目组都需要自己的会议室,自己的草稿白板,同时应该具备一定的保密性,避免被其他项目组看到。所以内存管理子系统,又像是会议室管理系统

内存管理的硬件按照分页方式管理内存,分页就是把系统的物理内存按照相同大小等分,每个内存分片称作内存页,通常内存页大小是4KB。

内存管理子系统要管理的不仅是4KB缓冲区,它提供了对4KB缓冲区的抽象,例如slab分配器。这种内存管理模式使用4KB缓冲区为基数,然后从中分配管理结构,并跟踪内存页使用情况 ,系统中哪些内存页是满的,哪些内存页面为空,哪些内存页没有完全使用。这样一来,系统就支持动态调整内存使用情况。

Slab分配器

补充一点,Linux是支持内存交换的,因为Linux中使用的是虚拟内存,当物理内存不足时,内存管理子系统会将内存暂时移到磁盘中,在物理内存充裕时又将内存页从磁盘移到物理内存中,这就是内存交换。而在32bit的系统上,每个进程都最大享有4GB的内存空间,因为由于32bit的系统寻址空间只有4G,当然这是虚拟内存,0~3GB是属于用户内存空间,3GB以上的则是属于 系统内存空间,实际上用户的程序几乎使用不完那么大的用户空间,一旦超出将无法正常运行,当然系统内存空间与用户内存空间是可以调整的。

6. 网络子系统 (Network System)

网络子系统,主要是为了同其他机器进行通讯,因此操作系统常常将与网络相关的代码被Linux独立开,形成一个相对独立的子系统,称为网络子系统。

后续会有单独一章讲解。

三、总结 Summary

综上,整个内核大致功能就是这些,这里只是简单讲下后续单独展开各子系统运行逻辑。

四、引用 Reference

作者

MinRam

发布于

2022-02-16

更新于

2022-07-17

Licensed under

评论