Deep Dive 2023

A journey from low level to high level

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

See 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");