5

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

 8 months ago
source link: https://www.51cto.com/article/778111.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

作者:开源大全 2023-12-31 09:30:21
每个操作系统都有一个内核,内核封装了底层硬件设备管理、内存管理、网络数据协议转化和收发传输、文件系统读写等。

Linux的层级架构

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

c6c524015e6224c6b184925e576e4e296d12db.png

这些分层包括:

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

Rust的标准库的功能划分

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

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

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

58ac5bf2478acf9a3f115507270fe3915201ed.png

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编译器负责实现。

44692ad99819279b088822efb8f2567f9ea796.png

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

第二类,alloc crate

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

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

第三类,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等)

f4421aa0678eeb65fb6583ef8ab195b19013c8.png

以下着重对第四类的主要 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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK