From b4b2c67514c354a0d8235c27af250320981f54d8 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Thu, 11 Aug 2022 19:07:58 +0800 Subject: [PATCH] =?UTF-8?q?vma=E7=9A=84=E4=B8=80=E4=BA=9B=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/mm/mm-types.h | 2 +- kernel/mm/mm.h | 52 ++++++++++++++++++++++++++++++++++++++++ kernel/process/process.h | 1 - 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/kernel/mm/mm-types.h b/kernel/mm/mm-types.h index 0d4f2c742..e9fa9b7fa 100644 --- a/kernel/mm/mm-types.h +++ b/kernel/mm/mm-types.h @@ -39,7 +39,7 @@ struct vm_area_struct uint64_t vm_start; // 区域的起始地址 uint64_t vm_end; // 区域的结束地址 struct mm_struct *vm_mm; // 虚拟内存区域对应的mm结构体 - uint64_t vm_flags; // 虚拟内存区域的标志位 + uint64_t vm_flags; // 虚拟内存区域的标志位, 具体可选值请见mm.h struct vm_operations_t *vm_ops; // 操作方法 uint64_t ref_count; // 引用计数 diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h index 754c41a70..399f89f72 100644 --- a/kernel/mm/mm.h +++ b/kernel/mm/mm.h @@ -2,6 +2,8 @@ #include #include +#include + // 每个页表的项数 // 64位下,每个页表4k,每条页表项8B,故一个页表有512条 @@ -368,7 +370,57 @@ ul set_page_attr(struct Page *page, ul flags); #define mk_pt(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr)) #define set_pt(ptptr, ptval) (*(ptptr) = (ptval)) +/* + * vm_area_struct中的vm_flags的可选值 + * 对应的结构体请见mm-types.h + */ +#define VM_NONE 0 +#define VM_READ (1 << 0) +#define VM_WRITE (1 << 1) +#define VM_EXEC (1 << 2) +#define VM_SHARED (1 << 3) +#define VM_IO (1 << 4) // MMIO的内存区域 +#define VM_SOFTDIRTY (1 << 5) + +/* VMA basic access permission flags */ +#define VM_ACCESS_FLAGS (VM_READ | VM_WRITE | VM_EXEC) + /** + * @brief 初始化虚拟内存区域结构体 + * + * @param vma + * @param mm + */ +static inline void vma_init(struct vm_area_struct *vma, struct mm_struct *mm) +{ + memset(vma, 0, sizeof(struct vm_area_struct)); + vma->vm_mm = mm; + vma->vm_ops = NULL; + list_init(&vma->list); +} + +/** + * @brief 判断给定的vma是否为当前进程所属的vma + * + * @param vma 给定的vma结构体 + * @return true + * @return false + */ +static inline bool vma_is_foreign(struct vm_area_struct *vma) +{ + if (current_pcb->mm == NULL) + return true; + if (current_pcb->mm != vma->vm_mm) + return true; + return false; +} + +static inline bool vma_is_accessible(struct vm_area_struct *vma) +{ + return vma->vm_flags & VM_ACCESS_FLAGS; +} + +/** * @brief 重新初始化页表的函数 * 将所有物理页映射到线性地址空间 */ diff --git a/kernel/process/process.h b/kernel/process/process.h index fe70e143b..9e9b3cf04 100644 --- a/kernel/process/process.h +++ b/kernel/process/process.h @@ -11,7 +11,6 @@ #pragma once #include #include -#include #include #include "ptrace.h" #include