DragonOS/kernel/mm/mm-types.h
2022-08-11 22:15:53 +08:00

70 lines
1.5 KiB
C

#pragma once
#include <common/glib.h>
struct mm_struct;
typedef uint64_t vm_flags_t;
/**
* @brief 内存页表结构体
*
*/
typedef struct
{
unsigned long pml4t;
} pml4t_t;
typedef struct
{
unsigned long pdpt;
} pdpt_t;
typedef struct
{
unsigned long pdt;
} pdt_t;
typedef struct
{
unsigned long pt;
} pt_t;
/**
* @brief 虚拟内存区域(VMA)结构体
*
*/
struct vm_area_struct
{
struct vm_area_struct *vm_prev, *vm_next;
// 虚拟内存区域的范围是一个左闭右开的区间:[vm_start, vm_end)
uint64_t vm_start; // 区域的起始地址
uint64_t vm_end; // 区域的结束地址
struct mm_struct *vm_mm; // 虚拟内存区域对应的mm结构体
vm_flags_t vm_flags; // 虚拟内存区域的标志位, 具体可选值请见mm.h
struct vm_operations_t *vm_ops; // 操作方法
uint64_t ref_count; // 引用计数
void *private_data;
};
/**
* @brief 内存空间分布结构体
* 包含了进程内存空间分布的信息
*/
struct mm_struct
{
pml4t_t *pgd; // 内存页表指针
struct vm_area_struct *vmas; // VMA列表
// 代码段空间
uint64_t code_addr_start, code_addr_end;
// 数据段空间
uint64_t data_addr_start, data_addr_end;
// 只读数据段空间
uint64_t rodata_addr_start, rodata_addr_end;
// BSS段的空间
uint64_t bss_start, bss_end;
// 动态内存分配区(堆区域)
uint64_t brk_start, brk_end;
// 应用层栈基地址
uint64_t stack_start;
};