以下为本次训练营第2天学习笔记内容。 Linux系统是完全开源的。
1 计算机硬件
计算机由五大基础单元组成:控制器、运算器、存储器单元(内存、外存)、输入单元、输出单元。
CPU = 控制器 + 运算器
这张图片描述了计算机硬件间的工作原理,输入设备获取用户的输入之后,传递给运算器进行运算,期间和存储器进行通信,并部分传输给控制器。
2 操作系统OS
常见的操作系统如Windows、Linux、IOS等,操作系统负责管理和控制计算机系统中的硬件和软件资源,用于在用户与系统硬件之间传递信息(通过提供用户接口来实现)。
操作系统的启动流程
操作系统的启动流程分为以上两种模式,UEFI系统是在BIOS的基础上优化了自检步骤,并且支持了更高的硬盘容量。
操作系统的启动流程可以简单地分为以下几个步骤:
- 加载BIOS:当计算机启动时,计算机的基本输入输出系统(BIOS)会首先被加载到内存中。BIOS负责检测计算机硬件并初始化系统。它还负责从启动设备(通常是硬盘驱动器)中加载引导程序。
- 加载引导程序:引导程序是一个小程序,它位于启动设备的引导扇区中。BIOS会将引导程序加载到内存中,并将控制权传递给引导程序。
- 加载内核:引导程序的主要任务是加载操作系统内核。内核是操作系统的核心组件,负责管理计算机的硬件资源和提供各种服务。引导程序将内核加载到内存中,并将控制权传递给内核。
- 初始化操作系统:内核启动后,它会初始化各种系统服务和设备驱动程序。这些服务和驱动程序负责管理计算机的各种硬件资源和提供各种服务。例如,它会初始化网络服务、图形用户界面、文件系统等。
- 加载用户程序:一旦操作系统初始化完成,它将等待用户程序的启动。用户程序可以是任何类型的程序,例如文本编辑器、图形应用程序、游戏等。当用户程序启动时,操作系统会为它分配必要的资源并将控制权传递给该程序。
3 Linux系统架构
上图描述了Linux系统的主要组成部分,即内核、shell命令解释器、文件系统、和应用程序。
在Linux系统中,所有的操作都是基于对文件的操作,包括应用程序、文件系统等都被作为不同格式的文件来进行处理。
在Linux系统中,主要区分为用户空间和内核空间,二者通过glibc来进行通信,当用户运行程序时,发送请求给glibc,glibc将该请求转发给内核空间,在请求听过后,在内核空间对进行程序的运行和文件处理,待进程结束后,关闭glibc的访问权限,等待下一次进程。
进程管理
Linux系统的进程管理部分是操作系统的核心组件之一,它负责管理系统中运行的进程。Linux系统采用了基于进程的设计,每个进程都有独立的地址空间和资源。以下是Linux系统进程管理部分的几个关键方面:
- 进程调度:Linux系统采用了多任务调度器,它可以同时运行多个进程。调度器会根据一定的算法来决定哪个进程应该被调度,例如优先级、时间片轮转等算法。
- 进程状态:Linux系统中的进程可以处于不同的状态,例如运行、等待、停止等状态。进程状态可以通过命令行工具(如top、ps)或/proc文件系统进行查看。
- 进程通信:进程之间可以通过多种方式进行通信,例如管道、信号、共享内存等。Linux系统提供了各种系统调用和库函数来支持进程通信。
- 进程控制:Linux系统中可以通过系统调用来控制进程的创建、销毁、挂起、恢复等操作。例如,fork()系统调用可以创建一个新进程,kill()系统调用可以向指定进程发送信号等。
- 进程资源管理:Linux系统中的进程可以使用各种资源,例如CPU、内存、磁盘等。系统提供了各种机制来管理进程的资源使用,例如Cgroups(控制组)、优先级管理等。
刚刚提到Linux系统采用了多任务调度器,可以同时运行多个程序,Linux实现多任务的方式是通过进程调度、进程通信、进程资源管理和虚拟内存等多个方面的协同作用来实现的,从而允许多个程序在同一台机器上同时运行。
文件系统
在Linux系统中,一切皆文件的概念是由Unix系统引入的,这个概念指的是Linux系统中所有设备、文件和进程都被抽象为文件的形式。这种设计有多种好处,其中一些主要的原因如下:
- 统一接口:在Linux中,所有的设备、进程和文件都可以通过相同的文件系统调用接口来访问和处理,这样就不需要为每个设备或进程实现特定的调用接口。
- 统一管理:将设备、进程和文件抽象为文件的形式可以方便地对其进行统一管理,例如通过文件权限和所有权控制文件的访问和操作,而不需要实现特定的管理方式。
- 简化开发:在Linux中,开发人员可以将设备和进程看作普通文件,这样就可以使用相同的API和工具来进行开发和调试,从而减少了开发的难度。
Linux系统支持多种不同的文件系统,每种文件系统都有自己的特点和优势。为了实现对用户提供统一的调用接口,Linux系统提供了虚拟文件系统(Virtual File System,VFS)。VFS提供了一套标准的文件系统调用接口,这样应用程序就可以使用相同的调用方式来访问不同的文件系统。当用户请求一个文件时,VFS会根据不同的文件系统类型调用相应的文件系统驱动程序来实现访问。
文件读取流程
应用程序通常在用户空间运行,它们通过系统调用来访问内核空间和硬件空间中的文件。
当应用程序调用系统调用来访问文件时,内核会切换到内核空间执行相应的操作。内核会根据文件系统类型调用相应的文件系统驱动程序来实现对文件的读取。驱动程序会将请求的数据从硬件设备中读取到内核空间的缓冲区中。
当驱动程序从硬件设备中读取数据时,它会通过与设备相关的硬件接口来实现。具体来说,驱动程序会向设备控制器发出读取请求,控制器会将数据从硬件存储器中读取到设备的缓冲区中。然后驱动程序将数据从设备的缓冲区中复制到内核空间的缓冲区中。
当内核读取文件的数据后,它将数据存储在内核空间的缓冲区中,并通过系统调用的返回值将数据传递回应用程序的用户空间。应用程序可以通过读取缓冲区中的数据来访问文件。
总之,Linux中的文件读取流程包括用户空间、内核空间和硬件空间之间的多个步骤。当应用程序调用系统调用来访问文件时,内核会在内核空间执行相应的操作,驱动程序会通过硬件接口将数据从硬件设备中读取到内核空间的缓冲区中,然后内核再将数据传递回应用程序的用户空间。
用户权限
用户权限指的是用户对系统和文件的操作权限,文件权限指的是文件对用户的访问控制权限。
Linux系统中有三种类型的用户权限,分别是读取权限、写入权限和执行权限。读取权限允许用户查看文件内容,写入权限允许用户修改文件内容,执行权限允许用户在文件上运行可执行程序。
Linux中的文件权限由三组权限表示,分别是用户权限、用户组权限和其他用户权限。用户权限表示文件所有者的权限,用户组权限表示文件所属用户组的权限,其他用户权限表示所有其他用户的权限。每个权限组都包括三种权限,即读取权限、写入权限和执行权限。
在Linux中,用户权限和文件权限之间存在联系。当用户想要对文件进行某种操作时,系统会首先检查用户是否拥有执行该操作所需的用户权限。如果用户具备执行该操作的权限,则系统会再次检查文件的权限是否允许该操作。如果文件的权限允许该操作,则用户可以执行该操作;否则,用户将无法对该文件进行操作。
例如,如果用户想要对一个文件进行写操作,系统首先会检查该用户是否具备对该文件的写入权限。如果该用户有写入权限,则系统会再次检查该文件的用户权限是否包含写入权限。如果包含,则该用户可以对该文件进行写入操作;否则,该用户将无法对该文件进行写入操作。