add memory usage

This commit is contained in:
TXuian
2024-10-29 16:17:43 +08:00
parent 968d66e5a9
commit 7b6c93d391
37 changed files with 654 additions and 115 deletions

View File

@@ -31,6 +31,7 @@ Modification:
#include "buddy.h"
#include "kalloc.h"
#include "log.h"
#include "pagetable.h"
static void _buddy_split_page(struct KPage* page, uintptr_t low_order, uintptr_t high_order, struct KFreeList* list)
{
@@ -161,7 +162,8 @@ bool KBuddyInit(struct KBuddy* pbuddy, uintptr_t mem_start, uintptr_t mem_end)
// total number of free pages
pbuddy->n_pages = (pbuddy->mem_end - (uintptr_t)pbuddy->mem_start) >> LEVEL4_PTE_SHIFT;
memset(pbuddy->pages, 0, pbuddy->n_pages);
memset(pbuddy->pages, 0, pbuddy->n_pages * sizeof(struct KPage));
// memset(pbuddy->pages, 0, pbuddy->n_pages);
// init each free page list from 2^0 to 2^8
for (; i < MAX_BUDDY_ORDER; i++) {

View File

@@ -30,6 +30,9 @@ Modification:
#include "kalloc.h"
#include "assert.h"
#include "memlayout.h"
#include "pagetable.h"
#include "actracer.h"
#include "buddy.h"
@@ -64,11 +67,35 @@ char* kalloc(uintptr_t size)
return mem_alloc;
}
void* kalloc_by_ownership(TraceTag owner, uintptr_t size)
{
void* new_mem = kalloc(size);
if (!new_mem) {
return NULL;
}
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
usage->mem_block_root = rbt_insert(usage->mem_block_root, (uintptr_t)new_mem, NULL);
// DEBUG("%p %p %p %p\n", usage, usage->mem_block_root, usage->tag, new_mem);
return new_mem;
}
bool kfree(char* vaddr)
{
return KBuddyFree(&kern_virtmem_buddy, V2P_WO(vaddr));
}
bool kfree_by_ownership(TraceTag owner, void* vaddr)
{
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
// DEBUG("%p %p %p %p\n", usage, usage->mem_block_root, usage->tag, vaddr);
RbtNode* node = rbt_search(usage->mem_block_root, (uintptr_t)vaddr);
assert(NULL != node);
usage->mem_block_root = rbt_delete(usage->mem_block_root, node);
return kfree(vaddr);
}
bool raw_kfree(char* paddr)
{
return KBuddyFree(&kern_virtmem_buddy, paddr);

View File

@@ -32,6 +32,7 @@ Modification:
#include "assert.h"
#include "kalloc.h"
#include "object_allocator.h"
#include "pagetable.h"
#define BITMAP_BITS_EMPTY_FULL ((uint64_t)0)
#define BITMAP_FIRST_BIT ((uint64_t)1)

View File

@@ -160,7 +160,8 @@ static uintptr_t _resize_user_pgdir(struct MemSpace* pmemspace, uintptr_t old_si
uintptr_t cur_size = ALIGNUP(old_size, PAGE_SIZE);
uintptr_t size_needed = ALIGNUP(new_size, PAGE_SIZE) - cur_size;
char* new_page = kalloc(size_needed);
// char* new_page = kalloc(size_needed);
char* new_page = kalloc_by_ownership(pmemspace->mem_usage.tag, size_needed);
if (new_page == NULL) {
ERROR("No memory\n");
return cur_size;
@@ -169,7 +170,6 @@ static uintptr_t _resize_user_pgdir(struct MemSpace* pmemspace, uintptr_t old_si
if (!xizi_pager.map_pages(pmemspace, cur_size, V2P(new_page), size_needed, false)) {
return cur_size;
}
CreateResourceTag(NULL, &pmemspace->tag, NULL, TRACER_MEM_FROM_BUDDY_AC_RESOURCE, V2P_WO(new_page));
return new_size;
}