pub struct SumGuard {
was_set: bool,
}Expand description
SUM 位保护器,基于 RAII 实现用户空间内存访问保护。
在创建时保存 sstatus.SUM 位的当前状态并设置为 1(允许内核访问用户空间内存); 在销毁时自动恢复之前保存的状态。
这种设计允许安全的嵌套使用:
- 如果外层已经设置了 SUM 位,内层 guard 不会重复设置,也不会在销毁时清除
- 只有最外层的 guard 会在销毁时清除 SUM 位
§Safety
此 guard 必须在访问用户空间内存之前创建,并在访问完成后立即销毁。 不应该长时间持有此 guard,因为它会降低内核的安全性。
§使用示例
ⓘ
// 读取用户空间指针
let user_value = {
let _guard = SumGuard::new();
unsafe { core::ptr::read(user_ptr) }
}; // 离开作用域,自动恢复 SUM 位§为什么需要此 guard
手动调用 sstatus::set_sum() 和 sstatus::clear_sum() 存在安全隐患:
如果在两次调用之间发生 panic(例如,由于无效的用户指针导致缺页异常无法处理),
clear_sum() 将不会被执行,导致 SUM 位保持置位状态。这会使内核在后续执行中
意外地允许访问用户空间内存,可能导致安全漏洞。
使用此 RAII guard,即使发生 panic,Rust 的 drop 机制也会确保 SUM 位被正确恢复。
Fields§
§was_set: bool创建 guard 前 SUM 位是否已设置