< 返回版块

苦瓜小仔 发表于 2025-12-13 19:32

Tags:日报

采访 Glauber Costa:用 Rust 重写的 Turso 是一个更好的 SQLite 吗?

Linux 内核贡献(3:16-15:17):Glauber Costa 从 2003/2004 年开始,为 Linux 内核贡献了 10 年时间。他讲述了自己最初对开源的着迷,以及为内核做贡献所面临的挑战,包括有时严苛的社区环境。他参与了虚拟化、容器、内存管理和网络等多个方面的工作,对操作系统有了深刻的理解。

转型至创业公司和数据库(15:17-26:23):在红帽公司和 Linux 内核项目工作之后,格劳伯于 2013 年加入了一家创业公司,该公司最初专注于一个名为 OSv 的“单内核”项目。该项目最终失败,但公司转型成为一家数据库公司,名为 ScyllaDB,它是对 Apache Cassandra 的高性能重写版本。这标志着格劳伯正式进入数据库领域,并在该领域工作了近十年。

从 Scylla 的经验教训和生态系统兼容性的力量(26:23-30:11):Glauber 强调,Scylla 的成功源于其与 Cassandra 的完全兼容性,以及对现有生态系统重要性的深刻理解,而非试图取代一切。这一经验教训深刻影响了他对 Turso 的开发理念。他还探讨了积极验证市场想法并在必要时快速调整方向的重要性。

Turso 的起源及 SQLite 的局限性(30:11-37:41):Glauber 和他的联合创始人 Pekka 最初创办了一家名为 Chisel Strike 的公司,旨在将 SQLite 与 TypeScript 运行时相结合,实现边缘数据持久化。但这个想法最终失败了。之后,他们转向创建 SQLite 的一个分支,并在此基础上构建了一个名为 Turso Cloud(现更名为 Turso)的云服务。虽然这项业务取得了成功,但他们也意识到这个分支存在一些局限性。

为什么重写 SQLite 能吸引贡献者 (37:41-48:04):Turso 的核心动机在于它完全重写了 SQLite,而 SQLite 的“开源但不开放贡献”模式正是其核心动机所在 (37:41)。SQLite 的核心团队规模很小,不像 Linux 内核等项目那样开放外部贡献。Glauber 指出,这种限制阻碍了 SQLite 发展,使其无法支持多写入器等用户普遍需要的功能。尽管 Turso 仍处于 alpha 测试阶段,但其重写版本在不到一个月的时间内就获得了社区的极大关注,GitHub 上获得了 9000 个 star 和 60 位贡献者,这表明用户对可扩展的嵌入式数据库有着迫切的需求。

观看:https://youtu.be/1JHOY0zqNBY

播客:对话 Rust for Linux 维护者 Danilo Krummrich

Danilo Krummrich 是 Red Hat 的一名软件工程师,也是 Rust for Linux 项目的核心贡献者。他对 Rust for Linux 的主要贡献在于驱动程序核心架构,这是使用 Rust 编写驱动程序的基础框架。这包括为内核中的设备驱动程序提供核心抽象的 C 和 Rust 代码。Danilo 维护着多个关键的内核子系统,包括驱动程序核心、DRM(GPUVM、Rust、GPU 调度器)、NVIDIA GPU 的 GPU 驱动程序(Nova、Nouveau)、固件加载器 API,以及 PCI、DMA 和 ALLOC 的 Rust 绑定。​​他是 Nova GPU 驱动程序的主要开发者,该驱动程序完全基于 Rust,适用于现代 NVIDIA GPU。

将 Rust 引入 Linux 内核是开源历史上最雄心勃勃的现代化举措之一。Linux 内核拥有数十年的 C 代码和根深蒂固的开发实践,如今正向一种内存安全的语言敞开大门。这是 30 多年来首次有新的编程语言被正式采纳用于内核开发。但这条路远非一帆风顺。

在本期节目中,我们采访了 Linux 内核维护者兼 Rust for Linux 核心团队成员 Danilo Krummrich,探讨了将 Rust 集成到 Linux 内核中的开创性工作。我们重点讨论了 Nova GPU 驱动程序(基于 Rust 的 NVIDIA 显卡驱动程序 Nouveau 的继任者),以及在内核中大规模采用 Rust 所需的技术挑战和文化转变,并展望了 Rust4Linux 项目的未来。

这些挑战和经验包括:

  • 他们不得不编写自己的分配器抽象(kbox、kvec、kvbox),因为 Rust 的 alloc crate 不支持内核特定的要求,例如分配标志和 NUMA 节点。
  • 类型状态在编译时对硬件状态进行编码——在 C 语言中,你会得到一个指向设备的原始指针,你需要自行决定如何正确使用它。而在 Rust 中,设备具有类型状态(例如“Core”),这些状态只暴露在该状态下有效的函数。例如,总线回调会获取一个具有 Core 类型状态的设备,因为此时会持有全局总线锁,从而允许调用修改设备字段的函数。在这些回调之外,你无法获取到这种类型状态,因此这些函数实际上并不存在于你的设备引用中。
  • 内核中充满了自引用代码(链表、锁)。Benno Lossin 创建了 pin-init 用于原地初始化和绑定,现在它也作为用户空间 crate 提供。在内核代码中,移动元素通常是不现实的。
  • 引用计数封装了 C 语言的 kref 模式——内核结构体嵌入了一个 struct kref(一个带有释放回调的原子计数器)。Rust 的抽象使用了 AlwaysRefCounted trait 和 ARef。 作为包装类型。特性边界允许你在任何引用计数内核结构上编写通用代码,而 C 端则继续执行其自身的操作。
  • 抽象才是难点,驱动程序相对容易。用 Rust 安全地封装 C 内核 API 非常困难。即使是经验丰富的内核开发者,即使他们了解 Rust,也会在这个转换层上遇到困难。但是,一旦抽象实现,驱动程序的开发就变得可行了。

收听:https://corrode.dev/podcast/s05e06-rust4linux/

讨论:https://www.reddit.com/r/rust/comments/1pk1qpz/rust_in_the_linux_kernel_type_states_custom/

教程《针对初学者的嵌入式 Rust 入门指南》

这篇文章为想要踏入嵌入式 Rust 开发领域的初学者提供了一份详尽的入门指南。作者根据自身经验,从硬件选型、前置知识到具体的学习资源提供了清晰的路线图。

1. 前置准备

  • Rust 语言基础:在开始之前,必须掌握 Rust 的所有权(ownership)、借用(borrowing)和类型系统。建议先阅读官方的 Rust Book
  • 电子学基础:需要了解电压、电流、电阻以及 LED、电阻器等基本元件的工作原理。

2. 硬件推荐 作者强烈建议通过购买开发板来开始学习,而不是只看书。

  • 首选推荐:ESP32 DevKit V1
    • 理由:性价比极高,集成了 WiFi 和蓝牙,无需额外的调试探针(Debug Probe)即可轻松烧录代码,且拥有成熟的 Rust 生态支持(esp-rs)。
  • 其他选择
    • Raspberry Pi Pico 2:适合学习基础,但若想获得流畅的调试体验,成本会因为需要购买调试探针而增加。
    • BBC micro:bit v2:虽然板载功能丰富(LED 矩阵、麦克风等),但价格较贵且连接外部传感器不够方便。

3. 学习资源与路径 作者整理了多个开源书籍和教程,涵盖了从通用概念到特定硬件的学习:

  • 通用基础
    • 《The Embedded Rust Book》:官方嵌入式 Rust 书籍,必读入门。
    • 《Embassy Book》:学习嵌入式 Rust 中现代的 async(异步)编程框架。
  • 针对 ESP32
    • 《The Rust on ESP Book》:Espressif 官方文档,介绍环境搭建和生态系统。
    • 《impl Rust for ESP32》:作者编写的开源书,通过 ESP32 实践点亮 LED、读取传感器、WiFi 控制等项目。
  • 针对 Pico 和 micro:bit
    • 作者同样编写了对应的实战书籍 《Pico Pico Book》《impl Rust for Microbit》
  • 进阶资源
    • 《Rust Embedded Driver (RED) Book》:教你如何从零开始为传感器编写 Rust 驱动程序。
    • Wokwi:一个在线电路模拟器,支持在浏览器中运行嵌入式 Rust 代码,无需硬件即可练手。

讨论:在面对大型 Rust 代码库时应如何入手阅读和理解

社区给出的核心建议:

  1. 利用工具生成文档 (Top Priority)
  • cargo doc:这是最高频的建议。运行 cargo doc --no-deps --open 可以为当前项目生成本地 HTML 文档。
  • 作用:这能让你跳过具体的实现细节(函数体内部的代码),直接查看高层级的 API、结构体定义、模块关系和注释,就像阅读库的使用手册一样。
  1. 找准入口点 (Entry Points)
  • src/main.rs:如果是二进制程序(binary),从这里开始,看程序是如何启动和初始化的。
  • src/lib.rs:如果是库(library),这里通常定义了对外暴露的模块和 API。
  • 关注架构:先弄清楚项目的“骨架”。看它如何将各个模块(crates)串联起来。
  1. 阅读策略
  • 略读 (Skimming):不要试图一行一行读。先像看书的目录一样快速浏览所有文件和代码,建立一个模糊的整体印象(mental map),这有助于后续将细节归位。
  • 模式识别:经验丰富的开发者依靠“模式”来阅读。大型项目通常会将代码拆分为隔离的模块(有人提到了六边形架构 Hexagonal Architecture)。理解了架构模式,就能知道去哪里找具体的逻辑。
  1. 实践出真知
  • 写比读更重要:有评论指出,阅读大型代码库的能力往往来自于编写大型代码库的经验。当你自己尝试过构建复杂的系统,自然就能识别出别人代码中的常见结构和设计意图。

Reddit:https://www.reddit.com/r/rust/comments/1pkq1l0/how_do_rust_devs_read_large_codebases/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论
asurance 2025-12-14 12:01

那个教程为啥没有给出对应的链接

NIGUMMA0524 2025-12-14 09:38

写比读更重要 Practice~ 当你自己尝试过构建复杂的系统,自然就能识别出别人代码中的常见结构和设计意图。

1 共 2 条评论, 1 页