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;