xv6 - risc v
Work In Progress Currently in Progess (2023-10-24)
Start is the youtube playlist - Source Dive from Low Byte Production
First Video
Adding System call
A good but not up to date instruction: Adding system call.
You have to edit following files:
- kernel/
- syscall.h
- syscall.c
- sysproc.c
- defs.h
- user/
- usys.pl
- run make user/usys.S and then take a look at user/usys.S to see the ASM code
- ASM: ecall
- ASM: li a7, init the a7 register to the corresponding syscall number
- user.h
Adding user space program
Example: free.c
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include <stdarg.h>
#define PGSIZE 4096 // bytes per page
int
freebyte(void){
return freepg() * PGSIZE;
}
int
freekb(void){
return freepg() * PGSIZE / 1024;
}
int
freemb(void){
return freepg() * PGSIZE / 1024 / 1024;
}
int
main(int argc, char *argv[])
{
printf("free memory %d Pages\n", freepg());
printf("free memory %d Bytes\n", freebyte());
printf("free memory %d KB\n", freekb());
printf("free memory %d MB\n", freemb());
exit(0);
}
required system call
freepg system call
Just the lines I added
kalloc.c
// return numbers of free Memory Pages
int
freepg(void)
{
struct run *r;
acquire(&kmem.lock);
int i = 1;
for (r = kmem.freelist; r; r = r-> next) {
i++;
}
release(&kmem.lock);
return i;
}
defs.h
int freepg(void);
syscall.h
#define SYS_freepg 23
syscall.c
[SYS_freepg] sys_freepg,
sysproc.c
uint64
sys_freepg(void)
{
return freepg();
}
user.h
int freepg(void);
usys.pl
entry("freepg");