new: 定义了vma结构体

This commit is contained in:
fslongjin 2022-08-11 18:11:10 +08:00
parent 7fd5330195
commit 60d6ea0fd8
5 changed files with 102 additions and 54 deletions

69
kernel/mm/mm-types.h Normal file
View File

@ -0,0 +1,69 @@
#pragma once
#include <common/glib.h>
struct mm_struct;
/**
* @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 List list; // 循环链表结构体
// 虚拟内存区域的范围是一个左闭右开的区间:[vm_start, vm_end)
uint64_t vm_start; // 区域的起始地址
uint64_t vm_end; // 区域的结束地址
struct mm_struct *vm_mm; // 虚拟内存区域对应的mm结构体
uint64_t vm_flags; // 虚拟内存区域的标志位
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;
};

View File

@ -1,4 +1,5 @@
#include "mm.h"
#include "mm-types.h"
#include "slab.h"
#include <common/printk.h>
#include <common/kprint.h>

View File

@ -1,6 +1,7 @@
#pragma once
#include <common/glib.h>
#include <mm/mm-types.h>
// 每个页表的项数
// 64位下每个页表4k每条页表项8B故一个页表有512条
@ -242,6 +243,24 @@ struct mm_stat_t
uint64_t available; // 系统总空闲内存大小包括kmalloc缓冲区
};
/**
* @brief
*
*/
struct vm_operations_t
{
/**
* @brief vm area
*
*/
void (*open)(struct vm_area_struct *area);
/**
* @brief vm area将要被移除的时候
*
*/
void (*close)(struct vm_area_struct *area);
};
extern struct memory_desc memory_management_struct;
// 导出内核程序的几个段的起止地址
@ -258,8 +277,8 @@ extern char _end;
// 每个区域的索引
int ZONE_DMA_INDEX = 0;
int ZONE_NORMAL_INDEX = 0; // low 1GB RAM ,was mapped in pagetable
int ZONE_UNMAPPED_INDEX = 0; // above 1GB RAM,unmapped in pagetable
int ZONE_NORMAL_INDEX = 0;
int ZONE_UNMAPPED_INDEX = 0;
// 初始化内存管理单元
void mm_init();
@ -332,14 +351,6 @@ ul get_page_attr(struct Page *page);
*/
ul set_page_attr(struct Page *page, ul flags);
/**
* @brief
*
*/
typedef struct
{
unsigned long pml4t;
} pml4t_t;
#define mk_pml4t(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
/**
* @brief pml4页表的页表项
@ -348,24 +359,12 @@ typedef struct
*/
#define set_pml4t(pml4tptr, pml4tval) (*(pml4tptr) = (pml4tval))
typedef struct
{
unsigned long pdpt;
} pdpt_t;
#define mk_pdpt(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
#define set_pdpt(pdptptr, pdptval) (*(pdptptr) = (pdptval))
typedef struct
{
unsigned long pdt;
} pdt_t;
#define mk_pdt(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
#define set_pdt(pdtptr, pdtval) (*(pdtptr) = (pdtval))
typedef struct
{
unsigned long pt;
} pt_t;
#define mk_pt(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
#define set_pt(ptptr, ptval) (*(ptptr) = (ptval))

View File

@ -583,6 +583,7 @@ void process_init()
initial_mm.brk_end = current_pcb->addr_limit;
initial_mm.stack_start = _stack_start;
initial_mm.vmas = NULL;
initial_tss[proc_current_cpu_id].rsp0 = initial_thread.rbp;

View File

@ -17,8 +17,7 @@
#include <common/errno.h>
#include <filesystem/VFS/VFS.h>
#include <common/wait_queue.h>
#include <mm/mm-types.h>
// 进程最大可拥有的文件描述符数量
#define PROC_MAX_FD_NUM 16
@ -52,27 +51,6 @@
#define CLONE_SIGNAL (1 << 1)
#define CLONE_VM (1 << 2) // 在进程间共享虚拟内存空间
/**
* @brief
*
*/
struct mm_struct
{
pml4t_t *pgd; // 内存页表指针
// 代码段空间
ul code_addr_start, code_addr_end;
// 数据段空间
ul data_addr_start, data_addr_end;
// 只读数据段空间
ul rodata_addr_start, rodata_addr_end;
// BSS段的空间
uint64_t bss_start, bss_end;
// 动态内存分配区(堆区域)
ul brk_start, brk_end;
// 应用层栈基地址
ul stack_start;
};
struct thread_struct
{
// 内核层栈基指针