本文为刚毕业参加工作时,初学Linux操作系统时做的一些笔记,适合初学者读阅,内容不保证百分百正确,若您对其中的描述有任何疑问可在留言板块进行留言。

以下为我使用的C语言的运行和编译环境:
System Version : Ubuntu22.04.1
Linux kernel Version : 5.19.0
GCC Version : 11.3.0
STDC Version : 201710L

摘要: Linux系统、Linux内核、内核架构的简述。

1. 什么是 Linux

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于POSIX 标准和 UNIX 的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。目前支持32位和64位的处理器。Linux 继承了 UNIX 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。通常所说的 Linux 是指 GNU/Linux

Linux 存在着许多不同的 Linux 发行版本,但它们都使用了 Linux kernel。Linux有很多发行版, 发行版是指某些公司、组织或个人把 Linux 内核、源代码及相关的应用程序组织在一起发行。经典的 Linux 发行版有 RedHat、SlackWare、Debian等,目前流行的 Linux 发行版基本上都是基于这些发行版的,例如:

严格来讲,Linux操作系统指的是“linux内核+各种软件”,Linux这个词只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。

1.1. Linux 与 POSIX 标准

支持POSIX标准是Linux能获取成功的一个重要因素,POSIX是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,国际标准名称为ISO/IEC 9945。
在操作系统发展初期,各大提供Unix操作系统的厂商会将自己新的,与其他系统不兼容的特性加入Unix中,来使他们的操作系统更好使用和与众不同,这样混乱的局面非常不利于操作系统和软件生态的发展。为了提高各个系统的兼容性和软件的可移植性,IEEE开始组织进行Unix的标准化开发,后来这个标准被命名为 POSIX,这套标准涵盖了系统调用的C语言接口、Shell程序和工具、线程及网络编程等方面,为系统的兼容性和应用程序的移植提供了很好的支持。
Linux的设计者Linus在编写Linux内核时,POSIX标准正处在投票敲定阶段,该标准为Linus提供了极为重要的信息,使得Linux能在标准的指导下进行开发,并做到与大部分Unix进行兼容。正是由于支持POSIX标准,当时开发的很多Unix上的软件可以很方便的移植到Linux系统上,使得Linux系统在当时得到很多开发者的支持,甚至超越Unix。如今,Windows也在其系统的接口中越来越多的支持POSIX标准。

2. Linux内核

类 Unix 操作系统中用于资源分配和硬件管理的程序称为 内核。Linux内核的作用简单来说,就是管理着系统上的所有硬件,并为上层程序提供接口,是应用程序与底层硬件沟通的桥梁。
Linux内核源码采用GPL协议,任何组织和个人都可以免费使用,其内核版本由Linux基金会管理与发布,官网为Linux keernel,目前内核的最新版本已经来到了6.5.7

2.1. GNU/Linux系统架构

Linux系统架构简图

该图参考自《Advanced Programming in Unix Environment》

从上图可以看出,Linux内核将硬件包含在内,将所有的硬件抽象为统一的虚拟接口,而用户进程程序不需要知道底层有什么物理硬件,通过Linux系统提供的系统调用便可访问各个物理硬件。

Linux内核主要由以下几个部分组成:

  • 进程调度器 负责控制对CPU的进程访问,调度程序执行相应的调度策略,确保进程公平地访问CPU。
  • 内存管理器 允许多个进程安全地共享设备的主内存系统,使用虚拟内存来创建进程。
  • 虚拟文件系统 通过为所有设备提供通用文件接口来抽象化各种硬件设备的详细信息。
  • 网络接口 对各种网络标准和网络硬件的访问接口。
  • 进程间通信 Linux系统上进程间通信的多种机制。

上述各个部分间相互依赖,组合形成一个个功能模块。例如:进程调度器使用内存管理器为各个进程创建虚拟内存,调整与硬件的内存映射,虚拟文件系统通过网络接口来支持网络文件系统,进程间通信通过内存管理器来支持共享内存的通信机制等。

2.2. 微内核与宏内核

简单来说,就是把很多功能都集成进内核,除了最基本的进程管理、内存管理外,文件系统,驱动,网络协议等都在内核里面。将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间中。

  • 优点:系统效率高,所有的内核服务都在一个地址空间中运行,相互之间直接调用函数,简单高效。
  • 缺点:系统稳定性差,一个服务上出现BUG会导致整个系统挂掉。

在内核中只有最基本的进程调度、内存管理。驱动、文件系统等都是用户态的守护进程去实现的,微内核中功能被划分成独立的过程,过程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一个服务。

  • 优点:系统稳定性高,一个服务进程出现BUG挂掉,不会影响到其他服务进程,系统可进行自拯救。
  • 缺点:系统效率低,数据吞吐量低,由于大部分服务进程在用户态实现,进程间传递消息会十分影响程序的执行效率和接口容量。

Linux就是一个宏内核结构,所有的子系统都被打包到一个执行程序中,处于同一个内存空间内,但同时他也吸收了微内核的优点:模块化设计,支持动态装载内核模块。

3. Linux命令行

在大多数服务器上部署的Linux系统是没有图形化的交互界面的,与运维人员交互的就是一个可输入、输出的终端界面,运维人员可在该终端界面上输入命令进行服务器的相关配置,这样一个终端界面就是一个Linux的命令行窗口。终端界面可以存在多个,当Linux系统开启用户管理功能时,使用不同的用户登录的终端,其权限可能会不同,可使用的命令也会存在差异。

3.1. 可执行文件

可执行文件是用于执行时运行一段代码或启动软件程序的类型的文件格式。可执行文件可以通过鼠标简单的双击它进行执行,也可以通过一些命令来进行执行,执行一个可执行文件的动作被称为执行它。

任何可执行文件,都需要一个可识别该文件的执行环境,例如:在Windows上打开后缀为 .doc的文件时,Windows会默认使用与该后缀名相关联的Word软件去打开该文档,打开后缀为.exe的文件时,Windows系统会将该二进制文件直接加载至内存,被操作系统所执行。在图形化的交互式界面上,Windows将文件的后缀与文件执行者相关联,当进行双击动作时,Windos系统就会使用关联的执行者去执行该文件,得到相应的结果。

但在Linux的命令行的终端环境中,只有通过命令去进行执行,需要操作人员自行判断该文件的类型,以及它的执行者是何程序。而一般判断该可执行文件类型的方法便是添加文件的后缀名,帮助操作人员快速识别到可执行文件的格式。

3.2. 常见文件后缀

  • .sh : shell脚本文件
  • .py : python脚本文件
  • .css : 前端网页样式文件
  • .html: 前端网页内容文件
  • .js : 前端网页脚本文件
  • .so : 动态库文件
  • .a : 静态库文件
  • .bin : 二进制文件

3.3. 命令行

在Linux终端上,没有可以使用鼠标进行点击的可执行文件,交互界面就是等待键盘输入的空白页,用户用于和操作系统进行交互的,就是需要输入一条条指令,而这些指令就是用户需要了解的Linux命令行。

学好Linux操作系统的关键就是要用好Linux命令行

Linux命令行的所有指令实际就是指令指向的可执行文件被当前终端环境所执行,而这些指令所指向的可执行文件,由 $PATH 这个环境变量定义着,当用户在终端上输入一条指令时,系统就会根据这个变量定义的路径去找到对应的可执行文件进行执行。默认Linux打开的终端环境是Shell环境,常用命令都交由Shell程序来进行执行,用于输入的大多数指令也可称为 Shell命令

常用命令行输入技巧
Tab 补全
Tab 补全是非常有用的一个功能,可以用来自动补全命令或文件名,省时准确
未输入状态下连按两次 Tab 列出所有可用命令
已输入部分命令名或文件名,按 Tab 进行自动补全

光标
up 方向键上(可以调出输入历史执行记录,快速执行命令)
down 方向键下(配合 up 选择历史执行记录)
Home 移动光标到本行开头
End 移动光标到本行结尾
PgUp 向上翻页
PaDN 向下翻页
Ctrl + C 终止当前程序
Ctrl + L 清屏 = clear命令(记住这个快捷键,比clear高效很多)