range_action_map/set.rs
1//! 将当前的 VmArea 去掉给定的区间后的差集
2//!
3//! 结果可能是原有 VmArea 被缩短,也可能是分成两段,也可能不变
4
5use super::{RangeArea, Segment};
6
7/// 当前 VmArea 和另一个给定的需要 unmap 的区间的相交关系
8pub enum DiffSet<SegmentType: Segment> {
9 /// 该区间和给定区间没有相交
10 Unchanged,
11 /// 当前区间完全被给定区间覆盖,因此应该删除
12 Removed,
13 /// 当前区间有一边和给定区间相交,为了让出地址空间需要缩短
14 Shrinked,
15 /// 当前区间覆盖了给定区间,为了让出地址空间需要分裂。返回分出的右半边
16 Splitted(RangeArea<SegmentType>),
17}
18
19/// 当前 VmArea 和另一个给定的需要 mprotect 的区间的相交关系
20pub enum CutSet<SegmentType: Segment> {
21 /// 该区间和给定区间没有相交
22 Unchanged,
23 /// 该区间被给定区间覆盖,因此已整体修改权限
24 WholeModified,
25 /// 左边相交,已修改左半段的权限。返回分裂出的右半边
26 ModifiedLeft(RangeArea<SegmentType>),
27 /// 右边相交,已修改右半段的权限。返回分裂出的右半边
28 ModifiedRight(RangeArea<SegmentType>),
29 /// 当前区间覆盖了给定区间,已修改中间段的权限。返回分裂出的中间和右半边
30 ModifiedMiddle(RangeArea<SegmentType>, RangeArea<SegmentType>),
31}