xref: /DragonOS/kernel/src/mm/mm.h (revision 2b7818e80e00fcfe4d03533f587cc125ea5e4bec)
12813126eSlogin #pragma once
22813126eSlogin 
3cffd7144Slogin #include <common/glib.h>
42813126eSlogin #include <process/process.h>
52813126eSlogin 
62813126eSlogin #define PAGE_4K_SHIFT 12
72813126eSlogin #define PAGE_2M_SHIFT 21
82813126eSlogin #define PAGE_1G_SHIFT 30
92813126eSlogin #define PAGE_GDT_SHIFT 39
102813126eSlogin 
112813126eSlogin // 不同大小的页的容量
122813126eSlogin #define PAGE_4K_SIZE (1UL << PAGE_4K_SHIFT)
132813126eSlogin #define PAGE_2M_SIZE (1UL << PAGE_2M_SHIFT)
142813126eSlogin #define PAGE_1G_SIZE (1UL << PAGE_1G_SHIFT)
152813126eSlogin 
162813126eSlogin // 屏蔽低于x的数值
172813126eSlogin #define PAGE_4K_MASK (~(PAGE_4K_SIZE - 1))
182813126eSlogin #define PAGE_2M_MASK (~(PAGE_2M_SIZE - 1))
192813126eSlogin 
202813126eSlogin // 将addr按照x的上边界对齐
21*2b7818e8SLoGin #define PAGE_4K_ALIGN(addr)                                                    \
22*2b7818e8SLoGin   (((unsigned long)(addr) + PAGE_4K_SIZE - 1) & PAGE_4K_MASK)
23*2b7818e8SLoGin #define PAGE_2M_ALIGN(addr)                                                    \
24*2b7818e8SLoGin   (((unsigned long)(addr) + PAGE_2M_SIZE - 1) & PAGE_2M_MASK)
252813126eSlogin 
262813126eSlogin // 虚拟地址与物理地址转换
272813126eSlogin #define virt_2_phys(addr) ((unsigned long)(addr)-PAGE_OFFSET)
28*2b7818e8SLoGin #define phys_2_virt(addr)                                                      \
29*2b7818e8SLoGin   ((unsigned long *)((unsigned long)(addr) + PAGE_OFFSET))
302813126eSlogin 
312813126eSlogin // ===== 页面属性 =====
322813126eSlogin // 页面在页表中已被映射 mapped=1 unmapped=0
332813126eSlogin #define PAGE_PGT_MAPPED (1 << 0)
342813126eSlogin 
352813126eSlogin // 内核初始化所占用的页 init-code=1 normal-code/data=0
362813126eSlogin #define PAGE_KERNEL_INIT (1 << 1)
372813126eSlogin 
382813126eSlogin // 1=设备MMIO映射的内存 0=物理内存
392813126eSlogin #define PAGE_DEVICE (1 << 2)
402813126eSlogin 
412813126eSlogin // 内核层页 kernel=1 memory=0
422813126eSlogin #define PAGE_KERNEL (1 << 3)
432813126eSlogin 
442813126eSlogin // 共享的页 shared=1 single-use=0
452813126eSlogin #define PAGE_SHARED (1 << 4)
462813126eSlogin 
472813126eSlogin // =========== 页表项权限 ========
482813126eSlogin 
492813126eSlogin //	bit 63	Execution Disable:
502813126eSlogin #define PAGE_XD (1UL << 63)
512813126eSlogin 
522813126eSlogin //	bit 12	Page Attribute Table
532813126eSlogin #define PAGE_PAT (1UL << 12)
542813126eSlogin // 对于PTE而言,第7位是PAT
552813126eSlogin #define PAGE_4K_PAT (1UL << 7)
562813126eSlogin 
572813126eSlogin //	bit 8	Global Page:1,global;0,part
582813126eSlogin #define PAGE_GLOBAL (1UL << 8)
592813126eSlogin 
602813126eSlogin //	bit 7	Page Size:1,big page;0,small page;
612813126eSlogin #define PAGE_PS (1UL << 7)
622813126eSlogin 
632813126eSlogin //	bit 6	Dirty:1,dirty;0,clean;
642813126eSlogin #define PAGE_DIRTY (1UL << 6)
652813126eSlogin 
662813126eSlogin //	bit 5	Accessed:1,visited;0,unvisited;
672813126eSlogin #define PAGE_ACCESSED (1UL << 5)
682813126eSlogin 
692813126eSlogin //	bit 4	Page Level Cache Disable
702813126eSlogin #define PAGE_PCD (1UL << 4)
712813126eSlogin 
722813126eSlogin //	bit 3	Page Level Write Through
732813126eSlogin #define PAGE_PWT (1UL << 3)
742813126eSlogin 
752813126eSlogin //	bit 2	User Supervisor:1,user and supervisor;0,supervisor;
762813126eSlogin #define PAGE_U_S (1UL << 2)
772813126eSlogin 
782813126eSlogin //	bit 1	Read Write:1,read and write;0,read;
792813126eSlogin #define PAGE_R_W (1UL << 1)
802813126eSlogin 
812813126eSlogin //	bit 0	Present:1,present;0,no present;
822813126eSlogin #define PAGE_PRESENT (1UL << 0)
832813126eSlogin 
842813126eSlogin // 1,0
852813126eSlogin #define PAGE_KERNEL_PGT (PAGE_R_W | PAGE_PRESENT)
862813126eSlogin 
872813126eSlogin // 1,0
882813126eSlogin #define PAGE_KERNEL_DIR (PAGE_R_W | PAGE_PRESENT)
892813126eSlogin 
902813126eSlogin // 1,0 (4级页表在3级页表中的页表项的属性)
912813126eSlogin #define PAGE_KERNEL_PDE (PAGE_R_W | PAGE_PRESENT)
922813126eSlogin 
932813126eSlogin // 7,1,0
942813126eSlogin #define PAGE_KERNEL_PAGE (PAGE_PS | PAGE_R_W | PAGE_PRESENT)
952813126eSlogin 
962813126eSlogin #define PAGE_KERNEL_4K_PAGE (PAGE_R_W | PAGE_PRESENT)
972813126eSlogin 
982813126eSlogin #define PAGE_USER_PGT (PAGE_U_S | PAGE_R_W | PAGE_PRESENT)
992813126eSlogin 
1002813126eSlogin // 2,1,0
1012813126eSlogin #define PAGE_USER_DIR (PAGE_U_S | PAGE_R_W | PAGE_PRESENT)
1022813126eSlogin 
1032813126eSlogin // 1,0 (4级页表在3级页表中的页表项的属性)
1042813126eSlogin #define PAGE_USER_PDE (PAGE_U_S | PAGE_R_W | PAGE_PRESENT)
1052813126eSlogin // 7,2,1,0
1062813126eSlogin #define PAGE_USER_PAGE (PAGE_PS | PAGE_U_S | PAGE_R_W | PAGE_PRESENT)
1072813126eSlogin 
1082813126eSlogin #define PAGE_USER_4K_PAGE (PAGE_U_S | PAGE_R_W | PAGE_PRESENT)
1092813126eSlogin 
1102813126eSlogin // 导出内核程序的几个段的起止地址
1112813126eSlogin extern char _text;
1122813126eSlogin extern char _etext;
1132813126eSlogin extern char _data;
1142813126eSlogin extern char _edata;
1152813126eSlogin extern char _rodata;
1162813126eSlogin extern char _erodata;
1172813126eSlogin extern char _bss;
1182813126eSlogin extern char _ebss;
1192813126eSlogin extern char _end;
1202813126eSlogin 
1212813126eSlogin /*
1222813126eSlogin  *  vm_area_struct中的vm_flags的可选值
1232813126eSlogin  * 对应的结构体请见mm-types.h
1242813126eSlogin  */
1252813126eSlogin #define VM_NONE 0
1262813126eSlogin #define VM_READ (1 << 0)
1272813126eSlogin #define VM_WRITE (1 << 1)
1282813126eSlogin #define VM_EXEC (1 << 2)
1292813126eSlogin #define VM_SHARED (1 << 3)
1302813126eSlogin #define VM_IO (1 << 4) // MMIO的内存区域
1312813126eSlogin #define VM_SOFTDIRTY (1 << 5)
1322813126eSlogin #define VM_MAYSHARE (1 << 6) // 该vma可被共享
1332813126eSlogin #define VM_USER (1 << 7)     // 该vma可被用户态访问
1342813126eSlogin #define VM_DONTCOPY (1 << 8) // 当fork的时候不拷贝该虚拟内存区域
1352813126eSlogin 
1362813126eSlogin /* VMA basic access permission flags */
1372813126eSlogin #define VM_ACCESS_FLAGS (VM_READ | VM_WRITE | VM_EXEC)
138