I will explain a simple example on adding a system call in xv6.
Assume that you have to add a system call to get the address space size of the currently running user program. You can name your system call as getmysize() and call this system call from within a user program.
You can write your user program as follows. Let the program name be myprog.c I assume that you know how to add a user program to xv6. So I will skip mentioning those steps here because it will be off the topic.
#include "types.h"
#include "stat.h"
#include "user.h"
int main(void){
printf(1,"The size of my address space is %d bytes\n", getmysize());
exit();
}
This program is written for the purpose of demonstrating the working of the system call only.
Now we will add our system call to xv6.
First add the following line at the end of the file syscall.h.
#define SYS_getmysize 23
Note that the 23 here might change depending on the number given before the line you are going to add in the file. That is if the system call number is 22 in the line before the line that you are going to add, your line should have the number 23. Simple as that.
Now add the following lines to the syscall.c file.
extern int sys_getmysize(void);
and in the array of syscalls, append the following line in.
[SYS_getmysize] sys_getmysize,
In the file sysproc.c, that is where the implementation of your system call goes if it is a system call related to process handling or memory management, put the implementation of our system call as follows.
int
sys_getmysize(void)
{
return proc->sz;
}
Now in the usys.S file, add the line,
SYSCALL(getmysize)
Then in the user.h file, add the following. This is how your user program sees your system call.
int getmysize(void);
Ok. Now you are ready to run your user program and see how your system call runs.
When you run myprog.c which calls your system call, the size of the address space of this same program will be returned according to what we have implemented here.
Comments
Post a Comment