forkbomb 2W
This commit is contained in:
parent
9f77409a4f
commit
2f336e536b
@ -5,6 +5,7 @@
|
||||
|
||||
void phy_free_4k(phyaddr_t v);
|
||||
phyaddr_t phy_malloc_4k(void);
|
||||
void phy_init_4k();
|
||||
|
||||
void kfree(void *v);
|
||||
void * kmalloc(size_t n);
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include <kern/protect.h>
|
||||
#include <kern/process.h>
|
||||
#include <kern/trap.h>
|
||||
#include <kern/kmalloc.h>
|
||||
|
||||
// 标志着内核是否处理完成
|
||||
bool init_kernel;
|
||||
@ -22,7 +23,7 @@ PROCESS proc_table[PCB_SIZE];
|
||||
void kernel_main(void)
|
||||
{
|
||||
kprintf("---start kernel main---\n");
|
||||
|
||||
phy_init_4k(); // init phy_malloc/free_4k management
|
||||
p_proc_ready = proc_table;
|
||||
|
||||
PROCESS_0 *p_proc = &p_proc_ready->pcb;
|
||||
|
||||
@ -10,6 +10,32 @@
|
||||
static u32 phy_malloc_4k_lock;
|
||||
static phyaddr_t phy_malloc_4k_p = 96 * MB;
|
||||
|
||||
// 96MB~128MB = 0x0600_0000 ~ 0x0800_0000
|
||||
// 32MB = 32 * 1024 / 4 = 8192 PAGES
|
||||
#define PHY_START (96 * MB)
|
||||
#define PHY_END (128 * MB)
|
||||
#define PHY_PAGENUM ((PHY_END - PHY_START) / PGSIZE)
|
||||
// map them to 8192 slots
|
||||
#define PHY_INDEX(paddr) ((paddr - PHY_START) >> 12)
|
||||
#define PHY_PADDR(idx) ((idx << 12) + PHY_START)
|
||||
// we have a head index point to the lowest free slot
|
||||
// if slot[i] is free, slot[i] = the index of the next free slot
|
||||
// else, slot[i] = -1
|
||||
// when initialize, slots are initialized to {1, 2, 3, ...}
|
||||
// when alloc, head mov to slot[i], then set slot[i] = 0
|
||||
// when free, set slot[i]=head, head = i
|
||||
|
||||
static int phy_free_head;
|
||||
static int phy_free_table[PHY_PAGENUM];
|
||||
|
||||
void phy_init_4k() {
|
||||
for (int i = 0; i < PHY_PAGENUM - 1; ++ i) {
|
||||
phy_free_table[i] = i + 1;
|
||||
}
|
||||
phy_free_table[PHY_PAGENUM-1] = -1;
|
||||
phy_free_head = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 释放物理页面,这里并没有为你实现好free_4k的代码,
|
||||
* 你需要自己实现一个数据结构用于维护释放的页面,
|
||||
@ -19,6 +45,12 @@ void
|
||||
phy_free_4k(phyaddr_t paddr)
|
||||
{
|
||||
assert(paddr % PGSIZE == 0);
|
||||
assert(96 * MB <= paddr && paddr < 128 * MB);
|
||||
while(xchg(&phy_malloc_4k_lock, 1) == 1)
|
||||
schedule();
|
||||
phy_free_table[PHY_INDEX(paddr)] = phy_free_head;
|
||||
phy_free_head = PHY_INDEX(paddr);
|
||||
xchg(&phy_malloc_4k_lock, 0);
|
||||
}
|
||||
/*
|
||||
* 分配物理页面,每次分配4kb,一页
|
||||
@ -29,10 +61,13 @@ phy_malloc_4k(void)
|
||||
{
|
||||
while(xchg(&phy_malloc_4k_lock, 1) == 1)
|
||||
schedule();
|
||||
|
||||
assert(phy_malloc_4k_p < 128 * MB);
|
||||
phyaddr_t paddr = phy_malloc_4k_p;
|
||||
phy_malloc_4k_p += PGSIZE;
|
||||
assert(0 <= phy_free_head && phy_free_head < PHY_PAGENUM);
|
||||
phyaddr_t paddr = PHY_PADDR(phy_free_head);
|
||||
phy_free_head = phy_free_table[phy_free_head];
|
||||
phy_free_table[PHY_INDEX(paddr)] = -1;
|
||||
// assert(phy_malloc_4k_p < 128 * MB);
|
||||
// phyaddr_t paddr = phy_malloc_4k_p;
|
||||
// phy_malloc_4k_p += PGSIZE;
|
||||
free:
|
||||
xchg(&phy_malloc_4k_lock, 0);
|
||||
return paddr;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user