os/uapi/mm.rs
1//! 内存管理相关的用户空间 API 定义
2
3use bitflags::bitflags;
4
5bitflags! {
6 /// 内存保护标志(mmap/mprotect)
7 ///
8 /// 参考:include/uapi/asm-generic/mman-common.h
9 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
10 pub struct ProtFlags: i32 {
11 /// 页面不可访问 (PROT_NONE)
12 const NONE = 0x0;
13
14 /// 页面可读 (PROT_READ)
15 const READ = 0x1;
16
17 /// 页面可写 (PROT_WRITE)
18 const WRITE = 0x2;
19
20 /// 页面可执行 (PROT_EXEC)
21 const EXEC = 0x4;
22 }
23}
24
25bitflags! {
26 /// 内存映射标志(mmap)
27 ///
28 /// 参考:include/uapi/asm-generic/mman-common.h
29 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
30 pub struct MapFlags: i32 {
31 /// 共享映射(修改对其他进程可见)(MAP_SHARED)
32 const SHARED = 0x01;
33
34 /// 私有映射(写时复制)(MAP_PRIVATE)
35 const PRIVATE = 0x02;
36
37 /// 映射类型掩码 (MAP_TYPE)
38 const TYPE_MASK = 0x0f;
39
40 /// 精确映射到指定地址 (MAP_FIXED)
41 const FIXED = 0x10;
42
43 /// 匿名映射(无文件支持)(MAP_ANONYMOUS)
44 const ANONYMOUS = 0x20;
45
46 /// 预填充页面 (MAP_POPULATE)
47 const POPULATE = 0x008000;
48
49 /// 不阻塞(与 MAP_POPULATE 一起使用)(MAP_NONBLOCK)
50 const NONBLOCK = 0x010000;
51
52 /// 为栈分配 (MAP_STACK)
53 const STACK = 0x020000;
54
55 /// 使用大页 (MAP_HUGETLB)
56 const HUGETLB = 0x040000;
57
58 /// 同步映射(DAX)(MAP_SYNC)
59 const SYNC = 0x080000;
60
61 /// 不替换现有映射 (MAP_FIXED_NOREPLACE)
62 const FIXED_NOREPLACE = 0x100000;
63 }
64}
65
66impl MapFlags {
67 /// 检查标志组合是否合法
68 ///
69 /// MAP_SHARED 和 MAP_PRIVATE 必须设置且只能设置一个
70 pub fn is_valid(self) -> bool {
71 let shared = self.contains(Self::SHARED);
72 let private = self.contains(Self::PRIVATE);
73
74 // 必须设置一个,且不能同时设置
75 shared != private
76 }
77
78 /// 获取映射类型(SHARED 或 PRIVATE)
79 pub fn map_type(self) -> Option<MapType> {
80 if self.contains(Self::SHARED) {
81 Some(MapType::Shared)
82 } else if self.contains(Self::PRIVATE) {
83 Some(MapType::Private)
84 } else {
85 None
86 }
87 }
88}
89
90/// 映射类型枚举
91#[derive(Debug, Clone, Copy, PartialEq, Eq)]
92pub enum MapType {
93 /// 共享映射
94 Shared,
95 /// 私有映射(写时复制)
96 Private,
97}
98
99/// MAP_FAILED 常量
100///
101/// mmap 失败时的返回值
102pub const MAP_FAILED: isize = -1;