forkbomb 2W

This commit is contained in:
ridethepig 2022-11-23 22:15:57 +08:00
parent 9f77409a4f
commit 2f336e536b
3 changed files with 42 additions and 5 deletions

View File

@ -5,6 +5,7 @@
void phy_free_4k(phyaddr_t v); void phy_free_4k(phyaddr_t v);
phyaddr_t phy_malloc_4k(void); phyaddr_t phy_malloc_4k(void);
void phy_init_4k();
void kfree(void *v); void kfree(void *v);
void * kmalloc(size_t n); void * kmalloc(size_t n);

View File

@ -6,6 +6,7 @@
#include <kern/protect.h> #include <kern/protect.h>
#include <kern/process.h> #include <kern/process.h>
#include <kern/trap.h> #include <kern/trap.h>
#include <kern/kmalloc.h>
// 标志着内核是否处理完成 // 标志着内核是否处理完成
bool init_kernel; bool init_kernel;
@ -22,7 +23,7 @@ PROCESS proc_table[PCB_SIZE];
void kernel_main(void) void kernel_main(void)
{ {
kprintf("---start kernel main---\n"); kprintf("---start kernel main---\n");
phy_init_4k(); // init phy_malloc/free_4k management
p_proc_ready = proc_table; p_proc_ready = proc_table;
PROCESS_0 *p_proc = &p_proc_ready->pcb; PROCESS_0 *p_proc = &p_proc_ready->pcb;

View File

@ -10,6 +10,32 @@
static u32 phy_malloc_4k_lock; static u32 phy_malloc_4k_lock;
static phyaddr_t phy_malloc_4k_p = 96 * MB; 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的代码 * free_4k的代码
* *
@ -19,6 +45,12 @@ void
phy_free_4k(phyaddr_t paddr) phy_free_4k(phyaddr_t paddr)
{ {
assert(paddr % PGSIZE == 0); 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 * 4kb
@ -29,10 +61,13 @@ phy_malloc_4k(void)
{ {
while(xchg(&phy_malloc_4k_lock, 1) == 1) while(xchg(&phy_malloc_4k_lock, 1) == 1)
schedule(); schedule();
assert(0 <= phy_free_head && phy_free_head < PHY_PAGENUM);
assert(phy_malloc_4k_p < 128 * MB); phyaddr_t paddr = PHY_PADDR(phy_free_head);
phyaddr_t paddr = phy_malloc_4k_p; phy_free_head = phy_free_table[phy_free_head];
phy_malloc_4k_p += PGSIZE; 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: free:
xchg(&phy_malloc_4k_lock, 0); xchg(&phy_malloc_4k_lock, 0);
return paddr; return paddr;