| Crates.io | range-action-map |
| lib.rs | range-action-map |
| version | 0.2.0 |
| created_at | 2022-11-14 03:51:10.91662+00 |
| updated_at | 2024-06-06 14:46:02.278942+00 |
| description | A range tree, offering interval operation in kernel memory management, and deliver ACTION to actual VmArea。一个区间树结构,用于提供 mmap / munmap / mprotect 时对内核中区间的操作; |
| homepage | |
| repository | |
| max_upload_size | |
| id | 714680 |
| size | 29,053 |
一个区间树结构,用于提供 mmap / munmap / mprotect 时对区间的操作。
本项目有 std 环境和 no_std 两个选项。
如需在 std 环境使用,直接在 Cargo.toml 引入即可;
如需在内核中使用,则需要选择:
range-action-map = { path = "https://github.com/scPointer/maturin/tree/memory-area-mod/range-action-map", default-features = false }
本项目来自 https://github.com/scPointer/maturin。
其中 crate 源码在 https://github.com/scPointer/maturin/tree/master/range-action-map,
对这个 crate 本身的单元测试在 https://github.com/scPointer/maturin/tree/master/range-action-map-test。
单元测试本身只包含对数据结构本身的测试,不涉及页表和内存分配。实际在内存中的应用见下
主要在 https://github.com/scPointer/maturin/kernel 模块中,
下面的路径都以这个模块为当前路径做描述
src/memory/areas/mod.rs 中,描述了内核里的 VmArea 如何实现这个模块的 trait Segmentsrc/memory/vmm.rs 中,描述了内核里的 MemorySet 如何使用这个模块的 RangeActionMapVmAreaCargo.toml 中,描述了如何引入本模块RangeActionMap 主要提供以下操作:
unmap(start, end):拆分/缩短/删除部分现有区间,空出[start, end) 这一段。mprotect(start, end):修改所有区间与 [start,end) 相交的部分的属性。没有被 [start, end) 覆盖的区间会被拆分。mmap_fixed(start, end):unmap(start, end),并插入一个(用户给定的)新区间在[start, end)。mmap_anywhere(hint, len):不修改任何区间,寻找一个长为 len 且左端点不小于 hint 的空位,并插入一个(用户给定的)新区间,返回插入位置的左端点。还提供以下接口:
find(pos: usize):查询一个点是否在某个区间在,如果在,返回它的引用。.iter() .iter_mut():迭代器支持。impl Debug:可以用 Debug 属性输出所有区间信息(需要用户提供的底层 SegmentType 实现 Debug)。创建:
new(args: ArgsType)
RangeActionMap 需要一个实现 trait Segment 的类型,至少实现删除、拆分、修改三个操作:
remove():删除这段区间split(pos):从pos位置把当前区间拆成两段区间(pos 参数为全局的绝对位置而非区间内位置)modify(new_flags):修改区间的属性一些约定:
Drop 结构本身RangeActionMap创建时要求传入一个 ArgsType,它实际上是一个 usize。这个值会在每次操作时传递给底层区间