You are going to add a system call to xv6.
count(void)
The system you will add is named count()
. It returns an integer which indicates the number of used process table slots. The process table is found within a structure called ptable
. Consult line 10 of proc.c.
You are reminded that the structure called proc
contains a field called state
. This is an enum
called procstate
. procstate
is defined on line 35 of proc.h
. You will note the first value, UNUSED
. All other values are "used."
The files you will modify are:
syscall.h
syscall.c
user.h
usys.S
proc.c
put your main implementation heresysproc.c
Makefile
In order to test your new kernel, you must add a userland test program. Call your test program test_count.c
. test_count
will become the name of the executable. To include your userland test program in the xv6 build you must modify Makefile
.
Line 168 of the Makefile
begins a listing of the names of the userland programs. Add _test_count
to the list exactly like the other programs. Note the underscore.
Here is the source code to the test program:
#include "param.h" #include "types.h" #include "stat.h" #include "user.h" #include "fs.h" #include "fcntl.h" #include "syscall.h" #include "traps.h" #include "memlayout.h" int main() { int c = count(); printf(1, "count returns: %d\n", c); exit(); }
printf
printf
in xv6 is a shadow of its Linux self. The first argument is the file descriptor to which to write. The second argument is a template string. The third argument (and any additional arguments) are values to be printed.
Any questions about using cout
will be responded to with laughter.
exit()
Again, xv6 is not a real Linux. You must exit programs using the exit()
system call. Ending with the typical return 0
will produce an error message in the limited shell.
$ sh $ sh $ sh $ test_count count returns: 6 $ ^d $ test_count count returns: 5 $ ^d $ test_count count returns: 4 $ ^d $ test_count count returns: 3 $
^d
means control-d
The above shows you in a shell, launching another shell, and another and another.
Run the test program and it prints 6. The used process table slots correspond to these programs:
Use ^d
to exit one shell and run the program again. Now you're at 5.
Use ^d
to exit one shell and run the program again. Now you're at 4.
Use ^d
to exit one shell and run the program again. Now you're at 3.
I will award 5 points of extra credit if you record yourself singing a corrupted version of 99 bottles of beer on the wall that instead mimics the above. Post the video to youtube to receive the extra credit.
Use cprintf
to print from inside the kernel. This is your principal debugging tool. cprintf
dispenses with the first argument used with printf
. Here is an example:
cprintf("allocuvm out of memory\n");
make qemu-nox
If the build is successful, you will launch straight into xv6.
^ax
There are very few programs in xv6. Most of the programs you are accustomed to are absent. Those that are present may be mere shadows of their Linux selves. For example, the shell has essentially no features you are accustomed to.
Use a partner.
The partner who hands in the code will supply a ZIP file to schoology.
You must do this to create your ZIP file:
$ rm -f p1.zip $ make clean $ zip p1.zip *
I'll award zero points for a project that doesn't build.
The partner that is not handing in code must instead hand in a .txt
file containing your partner's name.