mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 13:16:31 +00:00
new: 引入vmarea
This commit is contained in:
@ -16,6 +16,18 @@ struct vm_area_struct *vm_area_alloc(struct mm_struct *mm)
|
||||
return vma;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 从链表中删除指定的vma结构体
|
||||
*
|
||||
* @param vma
|
||||
*/
|
||||
void vm_area_del(struct vm_area_struct *vma)
|
||||
{
|
||||
if (vma->vm_mm == NULL)
|
||||
return;
|
||||
__vma_unlink_list(vma->vm_mm, vma);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 释放vma结构体
|
||||
*
|
||||
@ -71,7 +83,74 @@ void __vma_unlink_list(struct mm_struct *mm, struct vm_area_struct *vma)
|
||||
prev->vm_next = next;
|
||||
else // 当前vma是链表中的第一个vma
|
||||
mm->vmas = next;
|
||||
|
||||
|
||||
if (next)
|
||||
next->vm_prev = prev;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 查找第一个符合“addr < vm_end”条件的vma
|
||||
*
|
||||
* @param mm 内存空间分布结构体
|
||||
* @param addr 虚拟地址
|
||||
* @return struct vm_area_struct* 符合条件的vma
|
||||
*/
|
||||
struct vm_area_struct *vma_find(struct mm_struct *mm, uint64_t addr)
|
||||
{
|
||||
struct vm_area_struct *vma = mm->vmas;
|
||||
struct vm_area_struct *result = NULL;
|
||||
while (vma != NULL)
|
||||
{
|
||||
if (vma->vm_end > addr)
|
||||
{
|
||||
result = vma;
|
||||
break;
|
||||
}
|
||||
vma = vma->vm_next;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 插入vma
|
||||
*
|
||||
* @param mm
|
||||
* @param vma
|
||||
* @return int
|
||||
*/
|
||||
int vma_insert(struct mm_struct *mm, struct vm_area_struct *vma)
|
||||
{
|
||||
|
||||
struct vm_area_struct *prev;
|
||||
prev = vma_find(mm, vma->vm_start);
|
||||
if (prev && prev->vm_start == vma->vm_start && prev->vm_end == vma->vm_end)
|
||||
{
|
||||
// 已经存在了相同的vma
|
||||
return -EEXIST;
|
||||
}
|
||||
else if (prev && (prev->vm_start == vma->vm_start || prev->vm_end == vma->vm_end)) // 暂时不支持扩展vma
|
||||
{
|
||||
kwarn("Not support: expand vma");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
prev = vma_find(mm, vma->vm_end);
|
||||
if (prev)
|
||||
prev = prev->vm_prev;
|
||||
if (prev == NULL) // 要将当前vma插入到链表的尾部
|
||||
{
|
||||
struct vm_area_struct * ptr = mm->vmas;
|
||||
while(ptr)
|
||||
{
|
||||
if(ptr->vm_next)
|
||||
ptr = ptr->vm_next;
|
||||
else
|
||||
{
|
||||
prev = ptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
__vma_link_list(mm, vma, prev);
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user