2 个版本
0.1.1 | 2024 年 7 月 11 日 |
---|---|
0.1.0 | 2023 年 5 月 9 日 |
#437 在 操作系统
1,637 每月下载量
用于 2 crates
12KB
174 行
kernel_guard
使用本地中断或禁用抢占创建关键区的 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