1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//! 将当前的 VmArea 去掉给定的区间后的差集
//!
//! 结果可能是原有 VmArea 被缩短,也可能是分成两段,也可能不变

use super::{RangeArea, Segment};

/// 当前 VmArea 和另一个给定的需要 unmap 的区间的相交关系
pub enum DiffSet<SegmentType: Segment> {
    /// 该区间和给定区间没有相交
    Unchanged,
    /// 当前区间完全被给定区间覆盖,因此应该删除
    Removed,
    /// 当前区间有一边和给定区间相交,为了让出地址空间需要缩短
    Shrinked,
    /// 当前区间覆盖了给定区间,为了让出地址空间需要分裂。返回分出的右半边
    Splitted(RangeArea<SegmentType>),
}

/// 当前 VmArea 和另一个给定的需要 mprotect 的区间的相交关系
pub enum CutSet<SegmentType: Segment> {
    /// 该区间和给定区间没有相交
    Unchanged,
    /// 该区间被给定区间覆盖,因此已整体修改权限
    WholeModified,
    /// 左边相交,已修改左半段的权限。返回分裂出的右半边
    ModifiedLeft(RangeArea<SegmentType>),
    /// 右边相交,已修改右半段的权限。返回分裂出的右半边
    ModifiedRight(RangeArea<SegmentType>),
    /// 当前区间覆盖了给定区间,已修改中间段的权限。返回分裂出的中间和右半边
    ModifiedMiddle(RangeArea<SegmentType>, RangeArea<SegmentType>),
}