mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-15 04:46:49 +00:00
🆕 内核堆内存调整函数
This commit is contained in:
parent
b7437b24d7
commit
78a219b715
@ -3,6 +3,7 @@
|
|||||||
#include "../common/printk.h"
|
#include "../common/printk.h"
|
||||||
#include "../common/kprint.h"
|
#include "../common/kprint.h"
|
||||||
#include "../driver/multiboot2/multiboot2.h"
|
#include "../driver/multiboot2/multiboot2.h"
|
||||||
|
#include <process/process.h>
|
||||||
|
|
||||||
ul Total_Memory = 0;
|
ul Total_Memory = 0;
|
||||||
ul total_2M_pages = 0;
|
ul total_2M_pages = 0;
|
||||||
@ -14,7 +15,8 @@ void mm_init()
|
|||||||
memory_management_struct.kernel_code_start = (ul)&_text;
|
memory_management_struct.kernel_code_start = (ul)&_text;
|
||||||
memory_management_struct.kernel_code_end = (ul)&_etext;
|
memory_management_struct.kernel_code_end = (ul)&_etext;
|
||||||
memory_management_struct.kernel_data_end = (ul)&_edata;
|
memory_management_struct.kernel_data_end = (ul)&_edata;
|
||||||
memory_management_struct.kernel_end = (ul)&_end;
|
memory_management_struct.rodata_end = (ul)&_erodata;
|
||||||
|
memory_management_struct.start_brk = (ul)&_end;
|
||||||
|
|
||||||
struct multiboot_mmap_entry_t mb2_mem_info[512];
|
struct multiboot_mmap_entry_t mb2_mem_info[512];
|
||||||
int count;
|
int count;
|
||||||
@ -63,7 +65,7 @@ void mm_init()
|
|||||||
ul max_addr = memory_management_struct.e820[memory_management_struct.len_e820].BaseAddr + memory_management_struct.e820[memory_management_struct.len_e820].Length;
|
ul max_addr = memory_management_struct.e820[memory_management_struct.len_e820].BaseAddr + memory_management_struct.e820[memory_management_struct.len_e820].Length;
|
||||||
// 初始化mms的bitmap
|
// 初始化mms的bitmap
|
||||||
// bmp的指针指向截止位置的4k对齐的上边界(防止修改了别的数据)
|
// bmp的指针指向截止位置的4k对齐的上边界(防止修改了别的数据)
|
||||||
memory_management_struct.bmp = (unsigned long *)((memory_management_struct.kernel_end + PAGE_4K_SIZE - 1) & PAGE_4K_MASK);
|
memory_management_struct.bmp = (unsigned long *)((memory_management_struct.start_brk + PAGE_4K_SIZE - 1) & PAGE_4K_MASK);
|
||||||
memory_management_struct.bits_size = max_addr >> PAGE_2M_SHIFT; // 物理地址空间的最大页面数
|
memory_management_struct.bits_size = max_addr >> PAGE_2M_SHIFT; // 物理地址空间的最大页面数
|
||||||
memory_management_struct.bmp_len = (((unsigned long)(max_addr >> PAGE_2M_SHIFT) + sizeof(unsigned long) * 8 - 1) / 8) & (~(sizeof(unsigned long) - 1)); // bmp由多少个unsigned long变量组成
|
memory_management_struct.bmp_len = (((unsigned long)(max_addr >> PAGE_2M_SHIFT) + sizeof(unsigned long) * 8 - 1) / 8) & (~(sizeof(unsigned long) - 1)); // bmp由多少个unsigned long变量组成
|
||||||
|
|
||||||
@ -665,4 +667,26 @@ void mm_map_proc_page_table(ul proc_page_table_addr, bool is_phys, ul virt_addr_
|
|||||||
}
|
}
|
||||||
|
|
||||||
flush_tlb();
|
flush_tlb();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 调整堆区域的大小(暂时只能增加堆区域)
|
||||||
|
*
|
||||||
|
* @todo 缩小堆区域
|
||||||
|
* @param old_brk_end_addr 原本的堆内存区域的结束地址
|
||||||
|
* @param offset 新的地址相对于原地址的偏移量
|
||||||
|
* @return uint64_t
|
||||||
|
*/
|
||||||
|
uint64_t mm_do_brk(uint64_t old_brk_end_addr, int64_t offset)
|
||||||
|
{
|
||||||
|
// 暂不支持缩小堆内存
|
||||||
|
if(offset <0)
|
||||||
|
return old_brk_end_addr;
|
||||||
|
|
||||||
|
uint64_t end_addr = old_brk_end_addr + offset;
|
||||||
|
for (uint64_t i = old_brk_end_addr; i < end_addr; i += PAGE_2M_SIZE)
|
||||||
|
mm_map_proc_page_table(current_pcb->mm->pgd, true, i, alloc_pages(ZONE_NORMAL, 1, PAGE_PGT_MAPPED), PAGE_2M_SIZE, PAGE_USER_PAGE, true);
|
||||||
|
|
||||||
|
current_pcb->mm->brk_end = end_addr;
|
||||||
|
return end_addr;
|
||||||
}
|
}
|
@ -170,7 +170,8 @@ struct memory_desc
|
|||||||
ul zones_struct_len; // zones_struct列表的长度
|
ul zones_struct_len; // zones_struct列表的长度
|
||||||
|
|
||||||
ul kernel_code_start, kernel_code_end; // 内核程序代码段起始地址、结束地址
|
ul kernel_code_start, kernel_code_end; // 内核程序代码段起始地址、结束地址
|
||||||
ul kernel_data_end, kernel_end; // 内核程序数据段结束地址、 内核程序结束地址
|
ul kernel_data_end, rodata_end; // 内核程序数据段结束地址、 内核程序只读段结束地址
|
||||||
|
uint64_t start_brk; // 堆地址的起始位置
|
||||||
|
|
||||||
ul end_of_struct; // 内存页管理结构的结束地址
|
ul end_of_struct; // 内存页管理结构的结束地址
|
||||||
};
|
};
|
||||||
@ -376,4 +377,14 @@ void mm_map_phys_addr(ul virt_addr_start, ul phys_addr_start, ul length, ul flag
|
|||||||
void mm_map_proc_page_table(ul proc_page_table_addr, bool is_phys, ul virt_addr_start, ul phys_addr_start, ul length, ul flags, bool user);
|
void mm_map_proc_page_table(ul proc_page_table_addr, bool is_phys, ul virt_addr_start, ul phys_addr_start, ul length, ul flags, bool user);
|
||||||
|
|
||||||
|
|
||||||
void mm_map_phys_addr_user(ul virt_addr_start, ul phys_addr_start, ul length, ul flags);
|
void mm_map_phys_addr_user(ul virt_addr_start, ul phys_addr_start, ul length, ul flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 调整堆区域的大小(暂时只能增加堆区域)
|
||||||
|
*
|
||||||
|
* @todo 缩小堆区域
|
||||||
|
* @param old_brk_end_addr 原本的堆内存区域的结束地址
|
||||||
|
* @param offset 新的地址相对于原地址的偏移量
|
||||||
|
* @return uint64_t
|
||||||
|
*/
|
||||||
|
uint64_t mm_do_brk(uint64_t old_brk_end_addr, int64_t offset);
|
@ -400,6 +400,7 @@ ul do_execve(struct pt_regs *regs, char *path)
|
|||||||
// 映射1个2MB的物理页
|
// 映射1个2MB的物理页
|
||||||
unsigned long code_start_addr = 0x800000;
|
unsigned long code_start_addr = 0x800000;
|
||||||
unsigned long stack_start_addr = 0xa00000;
|
unsigned long stack_start_addr = 0xa00000;
|
||||||
|
uint64_t brk_start_addr = 0xc00000;
|
||||||
|
|
||||||
mm_map_proc_page_table((uint64_t)current_pcb->mm->pgd, true, code_start_addr, alloc_pages(ZONE_NORMAL, 1, PAGE_PGT_MAPPED)->addr_phys, PAGE_2M_SIZE, PAGE_USER_PAGE, true);
|
mm_map_proc_page_table((uint64_t)current_pcb->mm->pgd, true, code_start_addr, alloc_pages(ZONE_NORMAL, 1, PAGE_PGT_MAPPED)->addr_phys, PAGE_2M_SIZE, PAGE_USER_PAGE, true);
|
||||||
|
|
||||||
@ -417,8 +418,8 @@ ul do_execve(struct pt_regs *regs, char *path)
|
|||||||
current_pcb->mm->rodata_addr_end = 0;
|
current_pcb->mm->rodata_addr_end = 0;
|
||||||
current_pcb->mm->bss_start = 0;
|
current_pcb->mm->bss_start = 0;
|
||||||
current_pcb->mm->bss_end = 0;
|
current_pcb->mm->bss_end = 0;
|
||||||
current_pcb->mm->brk_start = 0;
|
current_pcb->mm->brk_start = brk_start_addr;
|
||||||
current_pcb->mm->brk_end = 0;
|
current_pcb->mm->brk_end = brk_start_addr;
|
||||||
current_pcb->mm->stack_start = stack_start_addr;
|
current_pcb->mm->stack_start = stack_start_addr;
|
||||||
|
|
||||||
// 关闭之前的文件描述符
|
// 关闭之前的文件描述符
|
||||||
@ -547,8 +548,8 @@ void process_init()
|
|||||||
initial_mm.bss_start = (uint64_t)&_bss;
|
initial_mm.bss_start = (uint64_t)&_bss;
|
||||||
initial_mm.bss_end = (uint64_t)&_ebss;
|
initial_mm.bss_end = (uint64_t)&_ebss;
|
||||||
|
|
||||||
initial_mm.brk_start = 0;
|
initial_mm.brk_start = memory_management_struct.start_brk;
|
||||||
initial_mm.brk_end = memory_management_struct.kernel_end;
|
initial_mm.brk_end = current_pcb->addr_limit;
|
||||||
|
|
||||||
initial_mm.stack_start = _stack_start;
|
initial_mm.stack_start = _stack_start;
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ union proc_union
|
|||||||
.flags = PF_KTHREAD, \
|
.flags = PF_KTHREAD, \
|
||||||
.mm = &initial_mm, \
|
.mm = &initial_mm, \
|
||||||
.thread = &initial_thread, \
|
.thread = &initial_thread, \
|
||||||
.addr_limit = 0xffff800000000000, \
|
.addr_limit = 0xffffffffffffffff, \
|
||||||
.pid = 0, \
|
.pid = 0, \
|
||||||
.virtual_runtime = 0, \
|
.virtual_runtime = 0, \
|
||||||
.signal = 0, \
|
.signal = 0, \
|
||||||
|
@ -344,6 +344,33 @@ uint64_t sys_vfork(struct pt_regs *regs)
|
|||||||
return do_fork(regs, CLONE_VM | CLONE_FS | CLONE_SIGNAL, regs->rsp, 0);
|
return do_fork(regs, CLONE_VM | CLONE_FS | CLONE_SIGNAL, regs->rsp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 堆内存调整
|
||||||
|
*
|
||||||
|
* @param arg0 新的堆区域的结束地址
|
||||||
|
* @return uint64_t 调整后的堆区域的结束地址
|
||||||
|
*/
|
||||||
|
uint64_t sys_brk(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
uint64_t new_brk = PAGE_2M_ALIGN(regs->r8);
|
||||||
|
|
||||||
|
kdebug("sys_brk input= %#010lx bytes, new_brk= %#010lx bytes current->end_brk=%#018lx", regs->r8, new_brk, current_pcb->mm->brk_end);
|
||||||
|
|
||||||
|
if (new_brk == 0)
|
||||||
|
return current_pcb->mm->brk_start;
|
||||||
|
|
||||||
|
if(new_brk > current_pcb->addr_limit) // 堆地址空间超过限制
|
||||||
|
return -EADDRNOTAVAIL;
|
||||||
|
|
||||||
|
if (new_brk < current_pcb->mm->brk_end) // todo: 释放堆内存空间
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
new_brk = mm_do_brk(current_pcb->mm->brk_end, new_brk - current_pcb->mm->brk_end); // 扩展堆内存空间
|
||||||
|
|
||||||
|
current_pcb->mm->brk_end = new_brk;
|
||||||
|
return new_brk;
|
||||||
|
}
|
||||||
|
|
||||||
ul sys_ahci_end_req(struct pt_regs *regs)
|
ul sys_ahci_end_req(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
ahci_end_request();
|
ahci_end_request();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user