diff --git a/kernel/common/sys/types.h b/kernel/common/sys/types.h index 5efae368..ca5c338c 100644 --- a/kernel/common/sys/types.h +++ b/kernel/common/sys/types.h @@ -41,6 +41,8 @@ typedef uint64_t fsfilcnt_t; #define __socklen_t uint32_t typedef __socklen_t socklen_t; +#define pgoff_t unsigned long + struct utimbuf { time_t actime; diff --git a/kernel/mm/mm-types.h b/kernel/mm/mm-types.h index ab76a9cf..96891944 100644 --- a/kernel/mm/mm-types.h +++ b/kernel/mm/mm-types.h @@ -131,6 +131,7 @@ struct vm_area_struct struct vm_operations_t *vm_ops; // 操作方法 atomic_t ref_count; // 引用计数 + pgoff_t page_offset; // 起始地址在当前VMA所占的2M物理页中的偏移量 void *private_data; }; diff --git a/kernel/mm/mmap.c b/kernel/mm/mmap.c index db33f9f5..64fa0f30 100644 --- a/kernel/mm/mmap.c +++ b/kernel/mm/mmap.c @@ -400,7 +400,8 @@ int mm_map_vma(struct vm_area_struct *vma, uint64_t paddr) if (unlikely(retval != 0)) goto failed; } - + // 计算当前vma的起始地址在对应的物理页中的偏移量 + vma->page_offset = paddr - (paddr & PAGE_2M_MASK); flush_tlb(); return 0; failed:;