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.h"
#include "mm-types.h"
#include "slab.h" #include "slab.h"
#include <common/printk.h> #include <common/printk.h>
#include <common/kprint.h> #include <common/kprint.h>

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <common/glib.h> #include <common/glib.h>
#include <mm/mm-types.h>
// 每个页表的项数 // 每个页表的项数
// 64位下每个页表4k每条页表项8B故一个页表有512条 // 64位下每个页表4k每条页表项8B故一个页表有512条
@ -233,13 +234,31 @@ struct Page
*/ */
struct mm_stat_t struct mm_stat_t
{ {
uint64_t total; // 计算机的总内存数量大小 uint64_t total; // 计算机的总内存数量大小
uint64_t used; // 已使用的内存大小 uint64_t used; // 已使用的内存大小
uint64_t free; // 空闲物理页所占的内存大小 uint64_t free; // 空闲物理页所占的内存大小
uint64_t shared; // 共享的内存大小 uint64_t shared; // 共享的内存大小
uint64_t cache_used; // 位于slab缓冲区中的已使用的内存大小 uint64_t cache_used; // 位于slab缓冲区中的已使用的内存大小
uint64_t cache_free; // 位于slab缓冲区中的空闲的内存大小 uint64_t cache_free; // 位于slab缓冲区中的空闲的内存大小
uint64_t available; // 系统总空闲内存大小包括kmalloc缓冲区 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; extern struct memory_desc memory_management_struct;
@ -258,8 +277,8 @@ extern char _end;
// 每个区域的索引 // 每个区域的索引
int ZONE_DMA_INDEX = 0; int ZONE_DMA_INDEX = 0;
int ZONE_NORMAL_INDEX = 0; // low 1GB RAM ,was mapped in pagetable int ZONE_NORMAL_INDEX = 0;
int ZONE_UNMAPPED_INDEX = 0; // above 1GB RAM,unmapped in pagetable int ZONE_UNMAPPED_INDEX = 0;
// 初始化内存管理单元 // 初始化内存管理单元
void mm_init(); void mm_init();
@ -332,14 +351,6 @@ ul get_page_attr(struct Page *page);
*/ */
ul set_page_attr(struct Page *page, ul flags); 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)) #define mk_pml4t(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
/** /**
* @brief pml4页表的页表项 * @brief pml4页表的页表项
@ -348,24 +359,12 @@ typedef struct
*/ */
#define set_pml4t(pml4tptr, pml4tval) (*(pml4tptr) = (pml4tval)) #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 mk_pdpt(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
#define set_pdpt(pdptptr, pdptval) (*(pdptptr) = (pdptval)) #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 mk_pdt(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
#define set_pdt(pdtptr, pdtval) (*(pdtptr) = (pdtval)) #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 mk_pt(addr, attr) ((unsigned long)(addr) | (unsigned long)(attr))
#define set_pt(ptptr, ptval) (*(ptptr) = (ptval)) #define set_pt(ptptr, ptval) (*(ptptr) = (ptval))
@ -462,7 +461,7 @@ uint64_t mm_do_brk(uint64_t old_brk_end_addr, int64_t offset);
/** /**
* @brief () * @brief ()
* *
* @return struct mm_stat_t * @return struct mm_stat_t
*/ */
struct mm_stat_t mm_stat(); struct mm_stat_t mm_stat();

View File

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

View File

@ -17,8 +17,7 @@
#include <common/errno.h> #include <common/errno.h>
#include <filesystem/VFS/VFS.h> #include <filesystem/VFS/VFS.h>
#include <common/wait_queue.h> #include <common/wait_queue.h>
#include <mm/mm-types.h>
// 进程最大可拥有的文件描述符数量 // 进程最大可拥有的文件描述符数量
#define PROC_MAX_FD_NUM 16 #define PROC_MAX_FD_NUM 16
@ -52,27 +51,6 @@
#define CLONE_SIGNAL (1 << 1) #define CLONE_SIGNAL (1 << 1)
#define CLONE_VM (1 << 2) // 在进程间共享虚拟内存空间 #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 struct thread_struct
{ {
// 内核层栈基指针 // 内核层栈基指针
@ -355,7 +333,7 @@ int kernel_thread(unsigned long (*fn)(unsigned long), unsigned long arg, unsigne
asm volatile("movq %0, %%cr3 \n\t" ::"r"(next_pcb->mm->pgd) \ asm volatile("movq %0, %%cr3 \n\t" ::"r"(next_pcb->mm->pgd) \
: "memory"); \ : "memory"); \
} while (0) } while (0)
// flush_tlb(); // flush_tlb();
// 获取当前cpu id // 获取当前cpu id
#define proc_current_cpu_id (current_pcb->cpu_id) #define proc_current_cpu_id (current_pcb->cpu_id)