kernlet code

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