#critical-section #preemption #synchronization #arceos #wrapper

nightly no-std kernel_guard

使用本地中断或禁用抢占创建关键区的 RAII 包装器

2 个版本

0.1.1 2024 年 7 月 11 日
0.1.0 2023 年 5 月 9 日

#437操作系统

Download history 173/week @ 2024-04-27 241/week @ 2024-05-04 129/week @ 2024-05-11 73/week @ 2024-05-18 177/week @ 2024-05-25 227/week @ 2024-06-01 79/week @ 2024-06-08 91/week @ 2024-06-15 461/week @ 2024-06-22 157/week @ 2024-06-29 231/week @ 2024-07-06 198/week @ 2024-07-13 511/week @ 2024-07-20 610/week @ 2024-07-27 198/week @ 2024-08-03 264/week @ 2024-08-10

1,637 每月下载量
用于 2 crates

GPL-3.0-or-later OR Apache-2…

12KB
174

kernel_guard

Crates.io

使用本地中断或禁用抢占创建关键区的 RAII 包装器,用于在内核中实现自旋锁。

创建保护结构体后创建关键区,保护结构体超出作用域时结束。

如果启用了特性 preempt,crate 用户必须使用 crate_interface::impl_interface 实现 KernelGuardIf 特性,以提供启用/禁用内核抢占的低级别实现。

可用的保护器

  • NoOp:在关键区周围不执行任何操作。
  • IrqSave:在关键区周围禁用/启用本地中断。
  • NoPreempt:在关键区周围禁用/启用内核抢占。
  • NoPreemptIrqSave:在关键区周围禁用/启用内核抢占和本地中断。

crate 特性

  • preempt:用于抢占式系统。如果启用了此特性,您需要在其他 crate 中实现 KernelGuardIf 特性。否则,抢占启用/禁用操作将为空操作。默认情况下禁用此特性。

示例

use kernel_guard::{KernelGuardIf, NoPreempt};

struct KernelGuardIfImpl;

#[crate_interface::impl_interface]
impl KernelGuardIf for KernelGuardIfImpl {
    fn enable_preempt() {
        // Your implementation here
    }
    fn disable_preempt() {
        // Your implementation here
    }
}

let guard = NoPreempt::new();
/* The critical section starts here

Do something that requires preemption to be disabled

The critical section ends here */
drop(guard);

依赖项

~270–720KB
~17K SLoC