mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 23:46:48 +00:00
77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
#include "mm.h"
|
||
#include "slab.h"
|
||
#include "internal.h"
|
||
|
||
/**
|
||
* @brief 获取一块新的vma结构体,并将其与指定的mm进行绑定
|
||
*
|
||
* @param mm 与VMA绑定的内存空间分布结构体
|
||
* @return struct vm_area_struct* 新的VMA
|
||
*/
|
||
struct vm_area_struct *vm_area_alloc(struct mm_struct *mm)
|
||
{
|
||
struct vm_area_struct *vma = (struct vm_area_struct *)kmalloc(sizeof(struct vm_area_struct), 0);
|
||
if (vma)
|
||
vma_init(vma, mm);
|
||
return vma;
|
||
}
|
||
|
||
/**
|
||
* @brief 释放vma结构体
|
||
*
|
||
* @param vma 待释放的vma结构体
|
||
*/
|
||
void vm_area_free(struct vm_area_struct *vma)
|
||
{
|
||
if (vma->vm_prev == NULL && vma->vm_next == NULL) // 如果当前是剩余的最后一个vma
|
||
vma->vm_mm->vmas = NULL;
|
||
kfree(vma);
|
||
}
|
||
|
||
/**
|
||
* @brief 将vma结构体插入mm_struct的链表之中
|
||
*
|
||
* @param mm 内存空间分布结构体
|
||
* @param vma 待插入的VMA结构体
|
||
* @param prev 链表的前一个结点
|
||
*/
|
||
void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev)
|
||
{
|
||
struct vm_area_struct *next = NULL;
|
||
vma->vm_prev = prev;
|
||
if (prev) // 若指定了前一个结点,则直接连接
|
||
{
|
||
next = prev->vm_next;
|
||
prev->vm_next = vma;
|
||
}
|
||
else // 否则将vma直接插入到给定的mm的vma链表之中
|
||
{
|
||
next = mm->vmas;
|
||
mm->vmas = vma;
|
||
}
|
||
|
||
vma->vm_next = next;
|
||
|
||
if (next != NULL)
|
||
next->vm_prev = vma;
|
||
}
|
||
|
||
/**
|
||
* @brief 将vma给定结构体从vma链表的结点之中删除
|
||
*
|
||
* @param mm 内存空间分布结构体
|
||
* @param vma 待插入的VMA结构体
|
||
*/
|
||
void __vma_unlink_list(struct mm_struct *mm, struct vm_area_struct *vma)
|
||
{
|
||
struct vm_area_struct *prev, *next;
|
||
next = vma->vm_next;
|
||
prev = vma->vm_prev;
|
||
if (prev)
|
||
prev->vm_next = next;
|
||
else // 当前vma是链表中的第一个vma
|
||
mm->vmas = next;
|
||
|
||
if (next)
|
||
next->vm_prev = prev;
|
||
} |