kernlet code

上级 c126d25a
......@@ -42,6 +42,7 @@ OBJS = \
hwvm.o \
hz.o \
kalloc.o \
kernlet.o \
kmalloc.o \
kbd.o \
main.o \
......
......@@ -120,6 +120,18 @@ setupkvm(void)
return pml4;
}
int
setupkshared(pml4e_t *pml4, char *kshared)
{
for (u64 off = 0; off < KSHAREDSIZE; off+=4096) {
pme_t *pte = walkpgdir(pml4, (void*)KSHARED+off, 1);
if (pte == NULL)
panic("setupkshared: oops");
*pte = v2p(kshared+off) | PTE_P | PTE_U | PTE_W;
}
return 0;
}
// Switch h/w page table register to the kernel-only page table,
// for when no process is running.
void
......
......@@ -28,6 +28,11 @@ static struct kmem slabmem[][NCPU] = {
.size = PERFSIZE,
.ninit = 1,
},
[slab_kshared][0 ... NCPU-1] = {
.name = " kshared",
.size = KSHAREDSIZE,
.ninit = CPUKSTACKS,
},
};
extern char end[]; // first address after kernel loaded from ELF file
......
......@@ -2,6 +2,7 @@
#include "lib.h"
#define KBASE 0xFFFFFF0000000000ull
#define KSHARED 0xFFFFF00000000000ull
#define USERTOP 0x0000800000000000ull
#define KCSEG (2<<3) /* kernel code segment */
......@@ -127,6 +128,7 @@ void gc_start(void);
// hwvm.c
void freevm(pml4e_t*);
pml4e_t* setupkvm(void);
int setupkshared(pml4e_t *pml4, char *kshared);
pme_t * walkpgdir(pml4e_t*, const void*, int);
// hz.c
......@@ -145,6 +147,7 @@ void ioapicenable(int irq, int cpu);
typedef enum {
slab_stack,
slab_perf,
slab_kshared,
} slab_t;
char* kalloc(void);
void kfree(void*);
......
#include "types.h"
#include "kernel.h"
long
sys_kernlet(int fd, size_t count, off_t off)
{
return -1;
}
......@@ -20,6 +20,7 @@
#define LOCKSTAT 0
#define VERIFYFREE LOCKSTAT
#define ALLOC_MEMSET 1
#define KSHAREDSIZE (32 << 10)
#if defined(HW_josmp)
#define NCPU 16 // maximum number of CPUs
#define MTRACE 0
......@@ -28,7 +29,7 @@
#elif defined(HW_qemu)
#define NCPU 4 // maximum number of CPUs
#define MTRACE 0
#define WQENABLE 0 // Enable work queue
#define WQENABLE 1 // Enable work queue
#define PERFSIZE (16<<20ull)
#elif defined(HW_ud0)
#define NCPU 4 // maximum number of CPUs
......
......@@ -4,17 +4,36 @@
#include "user.h"
#include "amd64.h"
// XXX(sbw) add a memlayout.h?
#define KSHARED 0xFFFFF00000000000ull
#define FSIZE (64 << 10)
#define BSIZE 4096
#define PSIZE (4*BSIZE)
static char buf[BSIZE];
struct ipcctl {
volatile char done;
volatile long result;
};
struct ipcctl *ipcctl = (struct ipcctl*)KSHARED;
static void
kernlet_pread(int fd, size_t count, off_t off)
{
ipcctl->done = 0;
if (kernlet(fd, count, off) != 0)
die("kernlet");
}
int
main(int ac, char **av)
{
u64 t0, t1;
int i, k;
int fd;
int i;
fd = open("preadtest.x", O_CREATE|O_RDWR);
if (fd < 0)
......@@ -25,9 +44,12 @@ main(int ac, char **av)
die("write failed");
t0 = rdtsc();
for (i = 0; i < FSIZE; i+=BSIZE)
for (k = 0; k < FSIZE; k+=PSIZE) {
kernlet_pread(fd, PSIZE, k);
for (i = k; i < k+PSIZE; i+=BSIZE)
if (pread(fd, buf, BSIZE, i) != BSIZE)
die("pread failed");
}
t1 = rdtsc();
printf(1, "cycles %lu\n", t1 - t0);
......
......@@ -212,12 +212,13 @@ allocproc(void)
panic("allocproc: ns_insert");
// Allocate kernel stack if possible.
if((p->kstack = ksalloc(slab_stack)) == 0){
if((p->kstack = ksalloc(slab_stack)) == NULL){
if (ns_remove(nspid, KI(p->pid), p) == 0)
panic("allocproc: ns_remove");
freeproc(p);
return 0;
}
sp = p->kstack + KSTACKSIZE;
// Leave room for trap frame.
......
......@@ -175,6 +175,7 @@ extern long sys_bind(int, void*, int);
extern long sys_listen(int, int);
extern long sys_accept(int, void*, void*);
extern long sys_pread(int fd, void *ubuf, size_t count, off_t offset);
extern long sys_kernlet(int, size_t, off_t);
#define SYSCALL(name) [SYS_##name] = (void*)sys_##name
......@@ -208,6 +209,7 @@ static long (*syscalls[])(u64, u64, u64, u64, u64, u64) = {
SYSCALL(listen),
SYSCALL(accept),
SYSCALL(pread),
SYSCALL(kernlet),
};
void
......
......@@ -28,3 +28,4 @@
#define SYS_listen 27
#define SYS_accept 28
#define SYS_pread 29
#define SYS_kernlet 30
......@@ -26,6 +26,7 @@ int map(void *addr, int len);
int unmap(void *addr, int len);
void halt(void);
ssize_t pread(int, void*, size_t, off_t);
int kernlet(int, size_t, off_t);
// ulib.c
int stat(char*, struct stat*);
......
......@@ -37,3 +37,4 @@ SYSCALL(bind)
SYSCALL(listen)
SYSCALL(accept)
SYSCALL(pread)
SYSCALL(kernlet)
......@@ -117,6 +117,14 @@ vmap_alloc(void)
kmfree(m);
return 0;
}
m->kshared = ksalloc(slab_kshared);
if (m->kshared == NULL || setupkshared(m->pml4, m->kshared)) {
cprintf("vmap_alloc: kshared out of memory\n");
freevm(m->pml4);
destroylock(&m->lock);
kmfree(m);
return 0;
}
#ifdef TREE
m->cr = crange_alloc(10);
if (m->cr == 0)
......@@ -330,6 +338,7 @@ vmap_free(void *p)
struct vmap *m = (struct vmap *) p;
crange_foreach(m->cr, vmap_free_vma, NULL);
crange_free(m->cr);
ksfree(slab_kshared, m->kshared);
freevm(m->pml4);
m->pml4 = 0;
m->alloc = 0;
......
......@@ -37,5 +37,6 @@ struct vmap {
u64 ref;
u64 alloc;
pml4e_t *pml4; // Page table
char *kshared;
char lockname[16];
};
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论