自学内容网 自学内容网

【Linux系统编程】——Linux操作系统的魔法桥梁:从命令行到内核的奇遇记

Linux操作系统的概念(是什么?)

Linux 是一种开源的类 UNIX 操作系统。它的内核(kernel)是由 Linus Torvalds 在 1991 年首次发布。内核是操作系统的核心部分,负责管理系统的硬件资源,如 CPU、内存、磁盘 I/O 等。例如,当一个程序需要访问内存时,内核会决定是否允许该程序访问,并分配相应的内存空间。

围绕内核,有各种各样的软件和工具构成了完整的 Linux 操作系统。这些软件包括系统工具(如文件管理工具、进程管理工具)、用户应用程序(如文本编辑器、浏览器等)和各种服务(如网络服务、数据库服务)。

操作系统 = 内核 + 其他程序

内核 = 进程管理 + 内存管理 + 文件管理 + 驱动管理+…
其他程序 = 例如函数库 + shell程序 + …

一个基本的程序集合,称为操作系统——操作系统是一款进行管理软件、硬件的软件
在这里插入图片描述

上面我们已经讲清楚了操作系统是什么?

接下来我们将从操作系统为什么?以及操作系统怎么办?进行讲解

设计操作系统的目的(为什么?)

先说结论

对下,与硬件交互,管理所有的软硬件资源
对上,为⽤⼾程序(应⽤程序)提供⼀个良好的执⾏环境

在这里插入图片描述
系统软件部分

  1. 软硬件体系结构层状结构。
  2. 访问操作系统必须使用系统调用——其实就是函数,只不过是系统提供的。
  3. 我们的程序,只要判断它访问了硬件,那么它必须贯穿整个软硬件体系结构。
  4. 库可能在底层封装了系统调用

硬件部分,其实就是冯诺依曼结构,有兴趣的读者可以看看作者的上一篇文章——冯诺依曼体系结构的介绍

核心功能(怎么办?)

在整个计算机软硬件架构中,操作系统的定位是:⼀款纯正的“搞管理”的软件

如何理解“管理”——软硬件的管理

在学校当中,我们知道有校长、辅导员、学生这三个身份,其中校长就是管理者,学生是被管理者,辅导员是什么我们暂且不谈,当校长需要对我们进行管理的时候,需要见到我们吗?答案显而易见,并不需要,他只需要对辅导员下达命令,让辅导员对我们进行管理,而辅导员就是一个承上启下的一个点,他从校长那边接收指令,给学生进行反馈,我们的信息,比如学习成绩、获得的奖项、学费交没有交,等等问题,校长都可以不需要通过自己去搜索,而是通过辅导员——对我们进行管理。

  1. 要管理,管理者和被管理者,可以不需要见面
  2. 管理者和被管理者 ,怎么管理呢? 根据“数据”进行管理!
  3. 不需要见面,如何得到数据?由中间层获取!
    在这里插入图片描述

硬件管理

操作系统在硬件管理方面,主要是通过协调和调度计算机硬件资源的使用,确保系统中的硬件资源得到高效、合理的利用。具体包括:

CPU调度:操作系统调度 CPU 时间片,以实现多任务的并发执行。通过调度算法(如先来先服务、时间片轮转、优先级调度等),操作系统保证多个进程能够公平、有效地使用 CPU。它也负责进程间的同步与互斥,避免竞争条件和死锁等问题。

内存管理:操作系统通过硬件支持的机制(如分页、分段等)管理物理内存和虚拟内存的映射,确保内存资源的有效利用。它负责内存的分配与回收,防止内存泄漏和溢出问题。

I/O设备管理:操作系统通过 I/O 子系统(如 I/O 控制器、驱动程序等)管理各种硬件设备,调度硬件设备的输入输出操作。它为设备提供抽象接口,屏蔽设备差异性,使得应用程序能够在不同硬件平台上运行时获得一致的操作体验。

硬件抽象层(HAL):操作系统通过硬件抽象层将硬件的具体实现与操作系统其他部分进行解耦。HAL使得操作系统能够在不同的硬件平台上运行,而无需为每个平台编写专门的代码,从而提高了操作系统的可移植性。

计算机管理硬件
描述起来,⽤struct结构体
在这里插入图片描述

组织起来,⽤链表或其他⾼效的数据结构
在这里插入图片描述

软件管理

操作系统在软件管理方面的作用主要体现在对运行在计算机上的各类程序(如应用程序和系统程序)的调度、分配和控制。具体包括:

进程管理:操作系统负责创建、调度和销毁进程。它实现了多任务并发运行,并保证进程之间的合理分配 CPU 时间,以提高系统的响应能力和资源利用率。进程的状态切换(如从就绪到运行、从运行到阻塞)由操作系统控制。

内存管理:操作系统负责将内存空间合理地分配给各个运行中的进程,并确保它们不会互相干扰。通过虚拟内存、分页机制等,操作系统提供了对内存的抽象管理,使得每个进程拥有独立的内存空间。操作系统还负责内存的回收和垃圾回收。

文件系统管理:操作系统通过文件系统提供对文件的管理功能,包括文件的创建、删除、读写和访问控制等。文件系统管理确保文件存储的结构性、有效性和数据的完整性。

设备管理:操作系统通过设备驱动程序来管理硬件设备,提供统一的接口,使得用户程序可以方便地与硬件进行交互。它调度硬件设备(如硬盘、打印机、显示器等)的输入输出操作,确保硬件设备的高效、稳定工作。

系统调⽤和库函数概念

在 Linux 系统中,系统调用(System Call)和库函数(Library Function)是两种不同层次的功能调用方式,用于与操作系统交互。

  • 在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,
    这部分由操作系统提供的接⼝,叫做系统调⽤。

  • 系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部
    分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开
    发。

系统调用(System Call)

定义:系统调用是操作系统内核为用户程序提供的接口,用于完成需要内核权限的操作,例如文件操作、进程管理、内存管理等。
特性:

  • 直接与内核交互:通过软中断或特殊指令将请求从用户态切换到内核态。
    低级接口:系统调用是底层操作,直接操控硬件或操作系统资源。
    固定数量:系统调用是有限的,每种操作系统都有一套固定的系统调用表。

调用方式:

  • 用户程序通过 C 语言提供的接口(通常是库函数)间接调用系统调用。
    系统调用在汇编层面直接通过指令调用,例如 x86 架构上使用 int 0x80 或 syscall 指令。

示例:
文件操作:open(), read(), write()
进程管理:fork(), execve(), wait()
内存管理:mmap(), brk()

库函数(Library Function)

定义:库函数是操作系统或开发环境提供的一组常用功能的实现,属于用户态代码,用于简化开发工作。
特性:

  • 运行在用户态:不直接与内核交互,而是调用系统调用实现底层功能。
    高级接口:提供更高级别、易用的功能封装,通常用来简化系统调用的复杂性。
    可扩展性强:库函数由开发者定义和扩展,可以调用其他库函数或直接使用系统调用。

调用方式:

  • 通过链接相关的库(静态或动态),使用编程语言提供的调用方式。

示例:
标准 C 库函数:printf(), fopen(), malloc()
数学库函数:sin(), cos(), sqrt()
字符串处理:strlen(), strcpy(), strcat()


原文地址:https://blog.csdn.net/ZWW_zhangww/article/details/144290225

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!