Linux的层级架构与Rust的主要模块crate总结,值得转发收藏

2023年 12月 31日 80.2k 0

Linux的层级架构

每个操作系统都有一个内核,内核封装了底层硬件设备管理、内存管理、网络数据协议转化和收发传输、文件系统读写等。从这个图可以看到,内核将系统硬件与应用程序进程连接起来,隐藏了上层下层交互的一些细节,各司其职。

这些分层包括:

  • 用户空间程序
  • 编译器
  • 终端
  • 防火墙
  • 系统调用的跨平台API(特定于平台的系统调用包装API)
  • Rust标准库
  • libc(或等效的API)
  • kernel,操作系统的核心模块
  • 系统资源
  • 内存
  • 文件系统
  • 网络
  • 硬件和其他设备(包括键盘、鼠标、监视器、磁盘驱动器)

Rust的标准库的功能划分

而Rust标准库,很好的利用了操作系统内核提供的API。

Rust标准库是Rust程序进入Linux操作系统内核函数的主要接口,它在内部使用libc(在Windows系统使用其他等效的库)来调用内核提供的系统调用。

从Rust程序中发起系统调用,以实现管理和操作各种系统资源(如图)。

libc(或其变体)为类UNIX操作系统上的系统调用提供了一个包装器,如Linux内核实现了POSIX标准指定的数百个POSIX API(对于Windows,系统调用有等效的API,也实现了POSIX标准[1])。

作为标准库,Rust标准库是跨平台的,Rust标准库的系统调用的细节是从Rust开发人员那里抽象出来的。Rust也支持不依赖于标准库的运行方式(no_std 方式),Rust直接操控底层硬件(如应用在嵌入式系统开发场景),此时Rust就做了操作系统本身的工作。

对于大部分软件开发工程师而言,他们用Rust主要开发应用层软件,也就是运行在用户空间的程序。它们基于标准库编写,实现各种业务功能。应用层的软件并非所有模块和函数都涉及到系统调用(例如一些用于操作字符串和处理错误的函数,就无需调用系统调用)。

Rust标准库包括几大领域的模块,包括四大类:

第一类,Rust语言原语

即Rust Language Primitives:Rust 语言的基本元素或基本类型(如下图)。

如有符号整数、布尔值、浮点数、字符、字符串、数组、元组、切片。这些由Rust编译器负责实现。

Rust标准包括原语,并在它们之上构建。

第二类,alloc crate

与堆分配值的内存分配相关的类型、函数和特征。

包括集合(Vec、String等集合)、智能指针类型(Box)、引用计数指针(Rc)和原子引用计数指针(Arc))。

第三类,core crate

作为Rust标准库的基础。充当Rust语言与标准库之间的链接,提供在Rust原语之上实现的类型、特征、常量和函数,并为所有Rust代码提供基础构建块,它是跨平台的,没有任何指向操作系统或其他外部依赖的链接。由于较少直接用到core crate,所以本文不做过多介绍。

第四类,模块(标准库的其他crate)

是标准库的一部分,模块crate包括针对并发、I/O,文件系统、网络、异步I/O、错误处理等功能,以及与特定操作系统相关的函数,Rust的官网对std有专门的文档[2]。例如

  • 为用户程序在多个线程上并发运行的功能在std::thread模块中;
  • 用于处理同步I/O的功能在std::io模块中提供;
  • 针对特定os的模块,主要在std::os模块中实现。

下图展示了Rust标准库各个领域功能涉及到的具体std模块(如std::io、std::os等)

以下着重对第四类的主要 crate 做一介绍,并附上文档地址。

Rust的并发控制相关模块 conurrency:

模块名

说明

std::env 模块[3]

包含与环境变量交互的功能,包括读取、设置和删除环境变量。

std::sync 模块[4]

提供了用于实现线程安全共享状态的同步原语,如互斥锁(Mutex)、原子操作(Atomic)和条件变量(Condvar)。

std::thread 模块[5]

提供了创建和管理线程的功能,包括线程的创建、 join、spawn 和同步。

std::process 模块[6]

提供了与操作系统进程交互的功能,包括运行外部命令、启动新进程以及与进程进行通信。

Rust的内存管理相关模块 memory management:

模块名

说明

std::alloc 模块[7]

提供了内存分配器的功能,包括分配和释放动态内存。

std::convert 模块[8]

提供了用于不同类型之间转换的工具函数。

std::ptr 模块[9]

提供了对指针的操作和转换功能,包括对裸指针的操作。

std::borrow 模块[10]

提供了用于管理借用的功能,包括&&mut借用运算符的实现。

std::default 模块[11]

提供了默认 trait 实现的功能,用于为不提供具体实现的类型提供默认行为。

std::rc 模块[12]

提供了引用计数(Reference Counting)的功能,用于实现线程安全的共享内存。

std::cell 模块[13]

提供了可变性的 Cell 和 RefCell 类型,用于在多线程环境下安全地共享可变状态。

std::mem 模块[14]

提供了与内存相关的功能,包括内存布局、内存对齐和内存操作。

std::clone 模块[15]

提供了用于实现克隆(Clone) trait 的功能,用于复制和克隆复杂的数据结构。

std::pin 模块[16]

提供了 Pin 类型,用于固定借用的生命周期,以避免悬垂指针和数据竞争问题。

Rust的文件系统操作相关模块 File system:

模块名

说明

std::fs 模块[17]

提供了与文件系统操作相关的功能,包括文件和目录的创建、读取、写入和删除等操作。

std::path 模块[18]

提供了与文件路径相关的功能,包括路径的解析、构造和操作。

Rust的数据处理相关模块 data processing:

模块名

说明

std::ascii 模块[19]

提供了与 ASCII 码相关的功能,包括对 ASCII 字符的操作和转换。

std::fmt 模块[20]

提供了格式化输出的功能,包括对各种数据类型的格式化和打印。

std::num 模块[21]

提供了对数字类型的抽象和操作,包括整数、浮点数和复数等。

std::cmp 模块[22]

提供了用于比较和排序值的工具,包括比较运算符的实现和排序函数。

std::hash 模块[23]

提供了用于计算哈希值的功能,包括对各种数据类型的哈希函数实现。

std::ops 模块[24]

提供了一些基本的运算符和操作符的实现,包括数学运算符、比较运算符和逻辑运算符等。

std::iter 模块[25]

提供了迭代器(Iterator)的功能,包括创建和操作迭代器的方法,以及一些常见的迭代器类型。

Rust的错误处理相关模块 Error handling:

模块名

说明

std::error 模块[26]

提供了错误处理的功能,包括定义错误类型和处理错误的方法。

std::panic 模块[27]

提供了恐慌(Panic)机制,用于处理不可恢复的错误情况。

std::option 模块[28]

提供了 Option 类型,用于表示可能存在或不存在的值,用于处理可能出现空值的情况。

std::result 模块[29]

提供了 Result 类型,用于表示成功或失败的情况,通常用于处理可能出现错误的函数返回值。

Rust的编译处理相关模块 compiler:

模块名

说明

std::hint 模块[30]

提供了一些用于编译器提示的宏,用于影响编译器的优化行为。

std::primitive 模块[31]

提供了一些基本的类型和函数,用于处理数字、字符和布尔值等基本数据类型。

std::prelude 模块[32]

包含了一些基本的函数和宏,这些函数和宏在 Rust 标准库中被广泛使用,并且在每个 Rust 程序中自动导入。

Rust的跨语言调用相关模块:FFI

模块名

说明

std::ffi 模块[33]

提供了与外部函数接口(Foreign Function Interface,FFI)相关的功能,用于与其他语言或库进行交互。

Rust的网络处理功能模块 Networking:

模块名

说明

std::net 模块[34]

提供了与网络编程相关的功能,包括网络协议、套接字(Socket)和网络地址等。

Rust的IO处理模块:

模块名

说明

std::io 模块[35]

提供了与输入输出相关的功能,包括文件操作、缓冲、读写数据等。

Rust的OS特定的功能模块:

模块名

说明

std::os 模块[36]

提供了与操作系统相关的功能,包括文件系统操作、进程管理和系统信息等。

Rust的时间处理模块:

模块名

说明

std::time 模块[37]

提供了与时间和日期相关的功能,包括时间的表示、解析、转换和计算等。

参考资料:

  • [1]POSIX标准: https://www.baike.com/wiki/%E5%8F%AF%E7%A7%BB%E6%A4%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%8E%A5%E5%8F%A3/1647475
  • [2]std有专门的文档: https://doc.rust-lang.org/std/index.html
  • [3]std::env 模块: https://doc.rust-lang.org/std/env/index.html
  • [4]std::sync 模块: https://doc.rust-lang.org/std/sync/index.html
  • [5]std::thread 模块: https://doc.rust-lang.org/std/thread/index.html
  • [6]std::process 模块: https://doc.rust-lang.org/std/process/index.html
  • [7]std::alloc 模块: https://doc.rust-lang.org/std/alloc/index.html
  • [8]std::convert 模块: https://doc.rust-lang.org/std/convert/index.html
  • [9]std::ptr 模块: https://doc.rust-lang.org/std/ptr/index.html
  • [10]std::borrow 模块: https://doc.rust-lang.org/std/borrow/index.html
  • [11]std::default 模块: https://doc.rust-lang.org/std/default/index.html
  • [12]std::rc 模块: https://doc.rust-lang.org/std/rc/index.html
  • [13]std::cell 模块: https://doc.rust-lang.org/std/cell/index.html
  • [14]std::mem 模块: https://doc.rust-lang.org/std/mem/index.html
  • [15]std::clone 模块: https://doc.rust-lang.org/std/clone/index.html
  • [16]std::pin 模块: https://doc.rust-lang.org/std/pin/index.html
  • [17]std::fs 模块: https://doc.rust-lang.org/std/fs/index.html
  • [18]std::path 模块: https://doc.rust-lang.org/std/path/index.html
  • [19]std::ascii 模块: https://doc.rust-lang.org/std/ascii/index.html
  • [20]std::fmt 模块: https://doc.rust-lang.org/std/fmt/index.html
  • [21]std::num 模块: https://doc.rust-lang.org/std/num/index.html
  • [22]std::cmp 模块: https://doc.rust-lang.org/std/cmp/index.html
  • [23]std::hash 模块: https://doc.rust-lang.org/std/hash/index.html
  • [24]std::ops 模块: https://doc.rust-lang.org/std/ops/index.html
  • [25]std::iter 模块: https://doc.rust-lang.org/std/iter/index.html
  • [26]std::error 模块: https://doc.rust-lang.org/std/error/index.html
  • [27]std::panic 模块: https://doc.rust-lang.org/std/panic/index.html
  • [28]std::option 模块: https://doc.rust-lang.org/std/option/index.html
  • [29]std::result 模块: https://doc.rust-lang.org/std/result/index.html
  • [30]std::hint 模块: https://doc.rust-lang.org/std/hint/index.html
  • [31]std::primitive 模块: https://doc.rust-lang.org/std/primitive/index.html
  • [32]std::prelude 模块: https://doc.rust-lang.org/std/prelude/index.html
  • [33]std::ffi 模块: https://doc.rust-lang.org/std/ffi/index.html
  • [34]std::net 模块: https://doc.rust-lang.org/std/net/index.html
  • [35]std::io 模块: https://doc.rust-lang.org/std/io/index.html
  • [36]std::os 模块: https://doc.rust-lang.org/std/os/index.html
  • [37]std::time 模块: https://doc.rust-lang.org/std/time/index.html

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论