Assignment #3 FAQ

We will keep adding relevant questions(and answers) to this page.


Do we need a working Lab2 to implement Lab3?
You may find the code for Thread::Join to be useful in implementing the join syscall, but besides that, you can use the original code provided for Lab2.
Why do I get an assertion failure when the Halt system call gets used? Should I fix it?
The assertion that fails checks that a List is empty when it's deleted. This can actually be a useful thing to have, since we don't ever want to lose all pointers to an undeleted object (or delete it twice.) "Halt", however, doesn't clean up nicely--- just deletes the kernel while there may still be threads on the ready queue. This is fine. You can clean up if you want, but there's no need to do so. (I'd recommend _not_ just removing the assert, however.)
Why can't I use "stdio.h" or other C include files in my Nachos programs?
We did not provide a C library for Nachos, so any library functions are undefined. The C library must be built specifically for the operating system (and architecture), since it must make system calls for I/O and memory allocation. (Not all functions do, of course, but usually the library is compiled as a unit.)

Problem 1 & 2

Once we know how to increment the pc, how much should we increment it?
        4. Remember to take care of PCReg, PrevPCReg as well as NextPCReg.
What should I return from a system call in case of an error
Always return a value of -1 if there was an error in processing a system call.
What should I do with the parameter passed to Exit
This value must be returned to the thread's parent when Join is called.
Can I just cast a pointer to an OpenFile object (or pointer to an AddrSpace object) to get a unique OpenFileID (or SpaceID)? It's so much simpler that way!
This is a design decision you will have to make for yourself.

However, note that most operating systems do distinguish between open file ID's (or process ID's) and the addresses of their kernel data structures. You might want to give some thought as to why they do so before committing yourself...

Do we have to synchronize file accesses so that only one process is writing to a file at a time?
No. If you implement this feature, it will be as part of the file system project. (Note that the current stub file system provides read and write atomicity: no write will be interrupted by another write or read.)
Integers passed to system calls appear as expected, but strings (and pointers) seem to be bogus. What's up?
Remeber that any pointers passed in are in the virtual terms of the user program's address space. Remember that the user's memory is simulated by the array mainMemory in the mahine simulator. At first, the addresses passed in can be read directly from this array (since we have an identity mapping). After you implement part 2, you will have to translate the virtual addresses of the program into the physical addresses of this simulated memory.

Problem 3

Specifically, what am I supposed to implement in problem 2?
You must allow each AddrSpace to have its own page table so that multiple programs may be running at the same time. This has already been done for the most part; just use the pageTable that is owned by each address space. In this assignment, you will only need to modify the page tables that each address space already has. You do not need to deal with the TLB at all. The machine will know how to find your page tables, so do not change their format. All you need to do is correctly populate the page table with the translations made when loading the program. Your page table must allow arbitrary translations. You will probably find a system-wide bitmap helpful to determine which physical pages are free. When you load the program in AddrSpace, instead of putting it at a physical page equal to the virtual page, you will find a free page in physical memory to map to that virtual page (with the page table). Be sure to free the physical memory when the address space is done.

Just follow the model of the current implemetation in AddrSpace but use the page table intelligently.

What am I supposed to do about the stack?
Reserve a block of memory of size UserStackSize at the highest part of your virtual address space. It need not grow until the next assignment.
What if a user program causes any non-syscall exceptions?
Simply terminate the program, but do not exit nachos unless it was the last program.