You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.2 KiB

教程 04 - 全局安全

tl;dr

  • 引入了假的锁。
  • 这是第一次展示原始操作系统同步,并支持安全访问全局数据结构。

Rust中的全局可变

当我们引入全局可用的print!宏在 教程03,我门有一点作弊。 调用 core::fmtwrite_fmt()函数,接受&mut self的方法之所以有效, 是因为在每次调用时都会创建一个新的QEMUOutput实例。

如果我们想保留一些状态,例如关于写入字符数的统计数据, 我们需要创建QEMUOutput的一个全局实例 (在Rust中使用static关键字).

然而static QEMU_OUTPUT不允许调用具有&mut self的函数。 为此,我们需要static mut,但是调用改变static mut状态的函数是不安全的。 这个是Rust编译器对此的推理它无法再阻止核心/线程同时改变数据(它是全局的,所以每个人都可以从任何地方引用它,检查程序借用在这里帮不上忙)。

这个问题的解决方案是将全局封装到原始同步中。在我们的例子中,是一个MUTual EXclusion原语的变体。 Mutexsynchronization.rs中引入的一个特性,并由同一文件中的NullLock实现。 为了使代码更易于教学,它省略了用于防止并发访问的实际体系结构特定逻辑,因为只要内核仅在单个内核上执行并禁用中断,我们就不需要它。

NullLock侧重于展示Rust内部可变性的核心概念。请务必阅读它。 我们还建议您阅读这篇关于Rust的引用类型的精确心智模型文章

如果要将NullLock与一些真实的互斥实现进行比较,可以查看 spin crate或者parking lot crate

测试

$ make qemu
[...]

[0] Hello from Rust!
[1] Chars written: 22
[2] Stopping here.

相比之前的变化diff

请检查英文版本,这是最新的。