Stupidly simple process memory manager with brk()
This commit is contained in:
parent
19d58ec71d
commit
4ecec1eec6
@ -29,8 +29,8 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data)
|
|||||||
cpu_init();
|
cpu_init();
|
||||||
|
|
||||||
struct process *p1 = new_process((void (*)(void))0x10000);
|
struct process *p1 = new_process((void (*)(void))0x10000);
|
||||||
vmm_set_page(p1->P4, 0x10000, pmm_calloc(), PAGE_WRITE | PAGE_PRESENT | PAGE_USER);
|
procmm_brk(p1, (void *)0x10010);
|
||||||
memcpy_k2u(p1->P4, (void *)0x10000, (void *)(uintptr_t)thread_function, 100);
|
memcpy_to_p4(p1->P4, (void *)0x10000, (void *)(uintptr_t)thread_function, 100);
|
||||||
|
|
||||||
ready(p1);
|
ready(p1);
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@ uint64_t vmm_get_page(uint64_t P4, uint64_t addr);
|
|||||||
#define PAGE_EXIST(p) ((p) != (uint64_t)-1)
|
#define PAGE_EXIST(p) ((p) != (uint64_t)-1)
|
||||||
int vmm_set_page(uint64_t P4, uint64_t addr, uint64_t page, uint16_t flags);
|
int vmm_set_page(uint64_t P4, uint64_t addr, uint64_t page, uint16_t flags);
|
||||||
void vmm_clear_page(uint64_t P4, uint64_t addr, int free);
|
void vmm_clear_page(uint64_t P4, uint64_t addr, int free);
|
||||||
size_t memcpy_k2u(uint64_t P4, void *dst, void *src, size_t n);
|
size_t memcpy_to_p4(uint64_t P4, void *dst, void *src, size_t n);
|
||||||
size_t memcpy_u2k(void *dst, uint64_t P4, void *src, size_t n);
|
size_t memcpy_from_p4(void *dst, uint64_t P4, void *src, size_t n);
|
||||||
|
|
||||||
extern union PTE BootP4;
|
extern union PTE BootP4;
|
||||||
extern int kernel_start, kernel_end;
|
extern int kernel_start, kernel_end;
|
||||||
|
@ -3,15 +3,18 @@
|
|||||||
#include <scheduler.h>
|
#include <scheduler.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <interrupts.h>
|
#include <interrupts.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
struct process
|
struct process
|
||||||
{
|
{
|
||||||
uint64_t pid;
|
uint64_t pid;
|
||||||
void *stack_ptr;
|
void *stack_ptr;
|
||||||
uint64_t state;
|
uint64_t state;
|
||||||
|
|
||||||
uint64_t P4;
|
uint64_t P4;
|
||||||
|
uint64_t brk;
|
||||||
|
uint64_t stack;
|
||||||
QUEUE_SPOT(runQ);
|
QUEUE_SPOT(runQ);
|
||||||
uint8_t stack[];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct process *process();
|
struct process *process();
|
||||||
@ -21,3 +24,5 @@ void yield();
|
|||||||
void start_scheduler();
|
void start_scheduler();
|
||||||
|
|
||||||
void switch_stack(void *old_ptr, void *new_ptr);
|
void switch_stack(void *old_ptr, void *new_ptr);
|
||||||
|
|
||||||
|
uint64_t procmm_brk(struct process *p, void *addr);
|
||||||
|
@ -106,7 +106,7 @@ void vmm_clear_page(uint64_t P4, uint64_t addr, int free)
|
|||||||
#define min(a,b) (((a) < (b))?(a):(b))
|
#define min(a,b) (((a) < (b))?(a):(b))
|
||||||
#define offset(p) ((uintptr_t)(p) % PAGE_SIZE)
|
#define offset(p) ((uintptr_t)(p) % PAGE_SIZE)
|
||||||
#define remaining(p) (PAGE_SIZE - offset(p))
|
#define remaining(p) (PAGE_SIZE - offset(p))
|
||||||
size_t memcpy_k2u(uint64_t P4, void *dst, void *src, size_t n)
|
size_t memcpy_to_p4(uint64_t P4, void *dst, void *src, size_t n)
|
||||||
{
|
{
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
while(n)
|
while(n)
|
||||||
@ -127,7 +127,7 @@ size_t memcpy_k2u(uint64_t P4, void *dst, void *src, size_t n)
|
|||||||
return copied;
|
return copied;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t memcpy_u2k(void *dst, uint64_t P4, void *src, size_t n)
|
size_t memcpy_from_p4(void *dst, uint64_t P4, void *src, size_t n)
|
||||||
{
|
{
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
while(n)
|
while(n)
|
||||||
|
@ -20,13 +20,15 @@ struct swtch_stack
|
|||||||
struct process *sched_proc = 0;
|
struct process *sched_proc = 0;
|
||||||
struct process *_proc = 0;
|
struct process *_proc = 0;
|
||||||
|
|
||||||
|
void procmm_init(struct process *p);
|
||||||
|
|
||||||
uint64_t next_pid = 1;
|
uint64_t next_pid = 1;
|
||||||
struct process *new_process(void (*function)(void))
|
struct process *new_process(void (*function)(void))
|
||||||
{
|
{
|
||||||
struct process *proc = P2V(pmm_calloc());
|
struct process *proc = P2V(pmm_calloc());
|
||||||
proc->pid = next_pid++;
|
proc->pid = next_pid++;
|
||||||
proc->stack_ptr = incptr(proc, PAGE_SIZE - sizeof(struct swtch_stack));
|
proc->stack_ptr = incptr(proc, PAGE_SIZE - sizeof(struct swtch_stack));
|
||||||
proc->P4 = new_P4();
|
procmm_init(proc);
|
||||||
|
|
||||||
struct swtch_stack *stk = proc->stack_ptr;
|
struct swtch_stack *stk = proc->stack_ptr;
|
||||||
stk->RBP = (uint64_t)&stk->RBP2;
|
stk->RBP = (uint64_t)&stk->RBP2;
|
||||||
@ -38,7 +40,7 @@ struct process *new_process(void (*function)(void))
|
|||||||
stk->r.cs = 0x10 | 3;
|
stk->r.cs = 0x10 | 3;
|
||||||
stk->r.ss = 0x18 | 3;
|
stk->r.ss = 0x18 | 3;
|
||||||
stk->r.rflags = 3<<12;
|
stk->r.rflags = 3<<12;
|
||||||
stk->r.rsp = 0x10FFF;
|
stk->r.rsp = KERNEL_OFFSET;
|
||||||
|
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
@ -62,7 +64,7 @@ void scheduler()
|
|||||||
|
|
||||||
_proc = new;
|
_proc = new;
|
||||||
write_cr3(new->P4);
|
write_cr3(new->P4);
|
||||||
interrupt_stack(new + PAGE_SIZE);
|
interrupt_stack(incptr(new, PAGE_SIZE));
|
||||||
switch_stack(&sched_proc->stack_ptr, &new->stack_ptr);
|
switch_stack(&sched_proc->stack_ptr, &new->stack_ptr);
|
||||||
|
|
||||||
ready(_proc);
|
ready(_proc);
|
||||||
|
24
src/kernel/proc/procmm.c
Normal file
24
src/kernel/proc/procmm.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include <process.h>
|
||||||
|
#include <memory.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <memory.h>
|
||||||
|
|
||||||
|
void procmm_init(struct process *p)
|
||||||
|
{
|
||||||
|
p->P4 = new_P4();
|
||||||
|
p->brk = 0;
|
||||||
|
p->stack = KERNEL_OFFSET;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t procmm_brk(struct process *p, void *addr)
|
||||||
|
{
|
||||||
|
while((uint64_t)addr > p->brk)
|
||||||
|
{
|
||||||
|
vmm_set_page(p->P4, p->brk, pmm_alloc(), PAGE_USER | PAGE_WRITE | PAGE_PRESENT);
|
||||||
|
p->brk += PAGE_SIZE;
|
||||||
|
}
|
||||||
|
return p->brk;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user